Thread: [brlcad-commits] SF.net SVN: brlcad:[36723] brlcad/trunk/src/librt (Page 2)
Open Source Solid Modeling CAD
Brought to you by:
brlcad
From: <br...@us...> - 2009-11-30 01:10:27
|
Revision: 36723 http://brlcad.svn.sourceforge.net/brlcad/?rev=36723&view=rev Author: brlcad Date: 2009-11-30 01:10:18 +0000 (Mon, 30 Nov 2009) Log Message: ----------- quell a slew of verbose strict compilation warnings, shadow warnings, unused params, floating point comparisons Modified Paths: -------------- brlcad/trunk/src/librt/db_comb.c brlcad/trunk/src/librt/db_io.c brlcad/trunk/src/librt/db_lookup.c brlcad/trunk/src/librt/db_match.c brlcad/trunk/src/librt/db_open.c brlcad/trunk/src/librt/db_scan.c brlcad/trunk/src/librt/db_tree.c brlcad/trunk/src/librt/db_walk.c brlcad/trunk/src/librt/fortray.c brlcad/trunk/src/librt/mater.c brlcad/trunk/src/librt/memalloc.c brlcad/trunk/src/librt/oslo_calc.c brlcad/trunk/src/librt/prep.c brlcad/trunk/src/librt/primitives/bot/bot.c Modified: brlcad/trunk/src/librt/db_comb.c =================================================================== --- brlcad/trunk/src/librt/db_comb.c 2009-11-30 00:24:38 UTC (rev 36722) +++ brlcad/trunk/src/librt/db_comb.c 2009-11-30 01:10:18 UTC (rev 36723) @@ -67,20 +67,29 @@ if (!matp) return 0; - if (matp[0] != 1.0 || matp[5] != 1.0 || matp[10] != 1.0) + if (!NEAR_ZERO(matp[0] - 1.0, SMALL_FASTF) + || !NEAR_ZERO(matp[5] - 1.0, SMALL_FASTF) + || !NEAR_ZERO(matp[10] - 1.0, SMALL_FASTF)) + { status |= STAT_ROT; + } - if (matp[MDX] != 0.0 || - matp[MDY] != 0.0 || - matp[MDZ] != 0.0) + if (!NEAR_ZERO(matp[MDX], SMALL_FASTF) + || !NEAR_ZERO(matp[MDY], SMALL_FASTF) + || !NEAR_ZERO(matp[MDZ], SMALL_FASTF)) + { status |= STAT_XLATE; + } - if (matp[12] != 0.0 || - matp[13] != 0.0 || - matp[14] != 0.0) + if (!NEAR_ZERO(matp[12], SMALL_FASTF) + || !NEAR_ZERO(matp[13], SMALL_FASTF) + || !NEAR_ZERO(matp[14], SMALL_FASTF)) + { status |= STAT_PERSP; + } - if (matp[15] != 1.0) status |= STAT_SCALE; + if (!NEAR_ZERO(matp[15], SMALL_FASTF)) + status |= STAT_SCALE; return status; } @@ -208,6 +217,7 @@ BU_CK_EXTERNAL(ep); rp = (union record *)ep->ext_buf; + if (dbip) RT_CK_DBI(dbip); if (rp[0].u_id != ID_COMB) { bu_log("rt_comb_import4: Attempt to import a non-combination\n"); @@ -276,9 +286,11 @@ } /* Verify that perspective isn't used as a modeling transform */ - if (diskmat[12] != 0 || diskmat[13] != 0 || diskmat[14] != 0) { - bu_log("ERROR: %s/%s has perspective transform\n", - rp[0].c.c_name, namebuf); + if (!NEAR_ZERO(diskmat[12], SMALL_FASTF) + || !NEAR_ZERO(diskmat[13], SMALL_FASTF) + || !NEAR_ZERO(diskmat[14], SMALL_FASTF)) + { + bu_log("ERROR: %s/%s has perspective transform\n", rp[0].c.c_name, namebuf); } /* See if disk record is identity matrix */ @@ -408,7 +420,7 @@ rt_comb_export4( struct bu_external *ep, const struct rt_db_internal *ip, - double local2mm, + double local2mm __attribute__((unused)), const struct db_i *dbip, struct resource *resp) { @@ -423,6 +435,7 @@ struct bu_vls tmp_vls; RT_CK_DB_INTERNAL(ip); + if (dbip) RT_CK_DBI(dbip); RT_CK_RESOURCE(resp); if (ip->idb_type != ID_COMBINATION) bu_bomb("rt_comb_export4() type not ID_COMBINATION"); comb = (struct rt_comb_internal *)ip->idb_ptr; @@ -533,7 +546,7 @@ } else { endp = strchr(bu_vls_addr(&tmp_vls), ' '); if (endp) { - int len; + size_t len; len = endp - bu_vls_addr(&tmp_vls); if (len <= 0 && bu_vls_strlen(&tmp_vls) > 0) { bu_log("WARNING: leading spaces on shader '%s' implies NULL shader\n", @@ -555,7 +568,7 @@ bu_strlcpy(rp[0].c.c_matname, bu_vls_addr(&tmp_vls), sizeof(rp[0].c.c_matname)); bu_strlcpy(rp[0].c.c_matparm, endp+1, sizeof(rp[0].c.c_matparm)); } else { - if (bu_vls_strlen(&tmp_vls) >= sizeof(rp[0].c.c_matname)) { + if ((size_t)bu_vls_strlen(&tmp_vls) >= sizeof(rp[0].c.c_matname)) { bu_log("ERROR: Shader name '%s' exceeds v4 database field, aborting.\n", bu_vls_addr(&tmp_vls)); return -1; @@ -901,12 +914,13 @@ int verbose, double mm2local, struct resource *resp, - struct db_i *db_i) + struct db_i *dbip) { const struct rt_comb_internal *comb; RT_CK_DB_INTERNAL(ip); RT_CK_RESOURCE(resp); + if (dbip) RT_CK_DBI(dbip); comb = (struct rt_comb_internal *)ip->idb_ptr; RT_CK_COMB(comb); Modified: brlcad/trunk/src/librt/db_io.c =================================================================== --- brlcad/trunk/src/librt/db_io.c 2009-11-30 00:24:38 UTC (rev 36722) +++ brlcad/trunk/src/librt/db_io.c 2009-11-30 01:10:18 UTC (rev 36723) @@ -54,8 +54,7 @@ /* byte count */ /* byte offset from start of file */ { - register int got; - register long s; + int got; RT_CK_DBI(dbip); if (RT_G_DEBUG&DEBUG_DB) { Modified: brlcad/trunk/src/librt/db_lookup.c =================================================================== --- brlcad/trunk/src/librt/db_lookup.c 2009-11-30 00:24:38 UTC (rev 36722) +++ brlcad/trunk/src/librt/db_lookup.c 2009-11-30 01:10:18 UTC (rev 36723) @@ -485,8 +485,8 @@ void db_get_directory(register struct resource *resp) { - register struct directory *dp; - register int bytes; + struct directory *dp; + size_t bytes; RT_CK_RESOURCE(resp); BU_CK_PTBL( &resp->re_directory_blocks ); @@ -494,7 +494,7 @@ BU_ASSERT_PTR( resp->re_directory_hd, ==, NULL ); /* Get a BIG block */ - bytes = bu_malloc_len_roundup(1024*sizeof(struct directory)); + bytes = (size_t)bu_malloc_len_roundup(1024*sizeof(struct directory)); dp = (struct directory *)bu_malloc(bytes, "re_directory_blocks from db_get_directory() " BU_FLSTR); /* Record storage for later */ @@ -569,8 +569,8 @@ draw = 0; match_count = 0; - for ( i=0; i<avs->count; i++ ) { - for ( j=0; j<obj_avs.count; j++ ) { + for ( i=0; (size_t)i<(size_t)avs->count; i++ ) { + for ( j=0; (size_t)j<(size_t)obj_avs.count; j++ ) { if ( !strcmp( avs->avp[i].name, obj_avs.avp[j].name ) ) { if ( !strcmp( avs->avp[i].value, obj_avs.avp[j].value ) ) { if ( op == 2 ) { Modified: brlcad/trunk/src/librt/db_match.c =================================================================== --- brlcad/trunk/src/librt/db_match.c 2009-11-30 00:24:38 UTC (rev 36722) +++ brlcad/trunk/src/librt/db_match.c 2009-11-30 01:10:18 UTC (rev 36723) @@ -142,7 +142,11 @@ { struct directory *dp; + if (comb) RT_CK_COMB(comb); RT_CK_TREE( comb_leaf ); + BU_ASSERT(dummy1 == NULL); + BU_ASSERT(dummy2 == NULL); + BU_ASSERT(dummy3 == NULL); if ( (dp=db_lookup(dbip, comb_leaf->tr_l.tl_name, LOOKUP_QUIET)) != DIR_NULL ) ++dp->d_nref; Modified: brlcad/trunk/src/librt/db_open.c =================================================================== --- brlcad/trunk/src/librt/db_open.c 2009-11-30 00:24:38 UTC (rev 36722) +++ brlcad/trunk/src/librt/db_open.c 2009-11-30 01:10:18 UTC (rev 36723) @@ -44,10 +44,11 @@ #include "raytrace.h" #include "db.h" #include "wdb.h" +#include "mater.h" #ifndef SEEK_SET -# define SEEK_SET 0 +# define SEEK_SET 0 #endif #define DEFAULT_DB_TITLE "Untitled BRL-CAD Database" Modified: brlcad/trunk/src/librt/db_scan.c =================================================================== --- brlcad/trunk/src/librt/db_scan.c 2009-11-30 00:24:38 UTC (rev 36722) +++ brlcad/trunk/src/librt/db_scan.c 2009-11-30 01:10:18 UTC (rev 36723) @@ -35,6 +35,7 @@ #include "vmath.h" #include "db.h" #include "raytrace.h" +#include "mater.h" #define DEBUG_PR(aaa, rrr) {\ @@ -353,6 +354,7 @@ union record rec; char *old_title; int v4units; + const char *ident = "/IDENT/"; RT_CK_DBI(dbip); @@ -374,7 +376,7 @@ if ( dbip->dbi_version > 4 ) return db5_update_ident( dbip, new_title, local2mm ); - RT_DIR_SET_NAMEP(&dir, "/IDENT/"); + RT_DIR_SET_NAMEP(&dir, ident); dir.d_addr = 0L; dir.d_len = 1; dir.d_magic = RT_DIR_MAGIC; Modified: brlcad/trunk/src/librt/db_tree.c =================================================================== --- brlcad/trunk/src/librt/db_tree.c 2009-11-30 00:24:38 UTC (rev 36722) +++ brlcad/trunk/src/librt/db_tree.c 2009-11-30 01:10:18 UTC (rev 36723) @@ -50,7 +50,7 @@ db_dup_db_tree_state(struct db_tree_state *otsp, const struct db_tree_state *itsp) { int shader_len=0; - int i; + size_t i; RT_CK_DBTS(itsp); RT_CK_DBI(itsp->ts_dbip); @@ -69,7 +69,7 @@ if ( itsp->ts_attrs.count > 0 ) { bu_avs_init( &otsp->ts_attrs, itsp->ts_attrs.count, "otsp->ts_attrs" ); - for ( i=0; i<itsp->ts_attrs.count; i++ ) + for ( i=0; i<(size_t)itsp->ts_attrs.count; i++ ) bu_avs_add( &otsp->ts_attrs, itsp->ts_attrs.avp[i].name, itsp->ts_attrs.avp[i].value ); } else { @@ -175,7 +175,7 @@ void db_pr_tree_state(register const struct db_tree_state *tsp) { - int i; + size_t i; RT_CK_DBTS(tsp); @@ -193,7 +193,7 @@ tsp->ts_mater.ma_color[2] ); bu_log(" ts_mater.ma_temperature=%g K\n", tsp->ts_mater.ma_temperature); bu_log(" ts_mater.ma_shader=%s\n", tsp->ts_mater.ma_shader ? tsp->ts_mater.ma_shader : "" ); - for ( i=0; i<tsp->ts_attrs.count; i++ ) { + for ( i=0; i<(size_t)tsp->ts_attrs.count; i++ ) { bu_log( "\t%s = %s\n", tsp->ts_attrs.avp[i].name, tsp->ts_attrs.avp[i].value ); } bn_mat_print("ts_mat", tsp->ts_mat ); @@ -1111,7 +1111,6 @@ struct directory *dp; struct rt_db_internal intern; union tree *curtree = TREE_NULL; - static long int depth = 0; RT_CK_DBTS(tsp); RT_CHECK_DBI( tsp->ts_dbip ); @@ -1960,7 +1959,8 @@ /* ============================== */ -HIDDEN union tree *db_gettree_region_end(register struct db_tree_state *tsp, struct db_full_path *pathp, union tree *curtree, genptr_t client_data) +HIDDEN union tree * +db_gettree_region_end(register struct db_tree_state *tsp, struct db_full_path *pathp, union tree *curtree, genptr_t client_data __attribute__((unused))) { RT_CK_DBTS(tsp); @@ -1976,7 +1976,8 @@ return(curtree); } -HIDDEN union tree *db_gettree_leaf(struct db_tree_state *tsp, struct db_full_path *pathp, struct rt_db_internal *ip, genptr_t client_data) +HIDDEN union tree * +db_gettree_leaf(struct db_tree_state *tsp, struct db_full_path *pathp, struct rt_db_internal *ip, genptr_t client_data __attribute__((unused))) { register union tree *curtree; Modified: brlcad/trunk/src/librt/db_walk.c =================================================================== --- brlcad/trunk/src/librt/db_walk.c 2009-11-30 00:24:38 UTC (rev 36722) +++ brlcad/trunk/src/librt/db_walk.c 2009-11-30 01:10:18 UTC (rev 36723) @@ -124,7 +124,6 @@ } else { struct rt_db_internal in; struct rt_comb_internal *comb; - struct directory *ndp; if ( rt_db_get_internal5( &in, dp, dtp->dbip, NULL, dtp->resp ) < 0 ) return; Modified: brlcad/trunk/src/librt/fortray.c =================================================================== --- brlcad/trunk/src/librt/fortray.c 2009-11-30 00:24:38 UTC (rev 36722) +++ brlcad/trunk/src/librt/fortray.c 2009-11-30 01:10:18 UTC (rev 36723) @@ -37,12 +37,38 @@ #include "raytrace.h" -int fr_hit(struct application *ap, struct partition *headp, struct seg *segp); -int fr_miss(struct application *ap); - static struct partition fr_global_head; +HIDDEN int +fr_hit(struct application *ap, struct partition *headp, struct seg *segp) +{ + RT_CK_AP(ap); + RT_CK_PT_HD(headp); + if (segp) RT_CK_SEG(segp); + + if ( headp->pt_forw == headp ) return(0); + + /* Steal the linked list, hang it off a global header */ + fr_global_head.pt_forw = headp->pt_forw; + fr_global_head.pt_back = headp->pt_back; + fr_global_head.pt_back->pt_forw = &fr_global_head; + fr_global_head.pt_forw->pt_back = &fr_global_head; + + headp->pt_forw = headp->pt_back = headp; + return(1); +} + +HIDDEN int +fr_miss(struct application *ap) +{ + RT_CK_AP(ap); + + fr_global_head.pt_forw = fr_global_head.pt_back = &fr_global_head; + return(0); +} + + /** * F R _ S T R I N G _ C 2 F * @@ -246,29 +272,7 @@ } } -int -fr_hit(struct application *ap, struct partition *headp, struct seg *segp) -{ - if ( headp->pt_forw == headp ) return(0); - /* Steal the linked list, hang it off a global header */ - fr_global_head.pt_forw = headp->pt_forw; - fr_global_head.pt_back = headp->pt_back; - fr_global_head.pt_back->pt_forw = &fr_global_head; - fr_global_head.pt_forw->pt_back = &fr_global_head; - - headp->pt_forw = headp->pt_back = headp; - return(1); -} - -int -fr_miss(struct application *ap) -{ - fr_global_head.pt_forw = fr_global_head.pt_back = &fr_global_head; - return(0); -} - - /** * F R N O R M * @@ -281,33 +285,19 @@ */ void BU_FORTRAN(frnorm, FRNORM)(double *normal, /* output only */ - int *index, /* input only */ + int *idx, /* input only */ double *indist, struct context *context, - double *pt, - double *dir) + double *pt __attribute__((unused)), + double *dir __attribute__((unused))) { register struct context *ctp; struct hit hit; -#if 0 - struct xray ray; -#endif struct soltab *stp; register int i; - i = *index-1; /* Selects which inhit is used */ + i = *idx - 1; /* Selects which inhit is used */ -#if 0 - /* Reconstruct the ray structure */ - ray.r_pt[X] = pt[0]; - ray.r_pt[Y] = pt[1]; - ray.r_pt[Z] = pt[2]; - ray.r_dir[X] = dir[0]; - ray.r_dir[Y] = dir[1]; - ray.r_dir[Z] = dir[2]; - /* Unitize r_dir? */ -#endif - /* Reconstruct the hit structure */ hit.hit_dist = indist[i]; ctp = &context[i]; @@ -315,12 +305,8 @@ VMOVE( hit.hit_vpriv, ctp->co_vpriv ); hit.hit_private = ctp->co_priv; -#if 0 - RT_HIT_NORMAL( normal, &hit, stp, &ray, ctp->co_inflip ); -#else /* The new macro doesn't use ray argument */ RT_HIT_NORMAL( normal, &hit, stp, NULL, ctp->co_inflip ); -#endif } Modified: brlcad/trunk/src/librt/mater.c =================================================================== --- brlcad/trunk/src/librt/mater.c 2009-11-30 00:24:38 UTC (rev 36722) +++ brlcad/trunk/src/librt/mater.c 2009-11-30 01:10:18 UTC (rev 36723) @@ -59,6 +59,37 @@ } +HIDDEN void +_rt_check_overlap(struct mater *newp) +{ + struct mater *zot; + + /* Check for overlap, ie, redefinition of following colors */ + while ( newp->mt_forw != MATER_NULL && + newp->mt_high >= newp->mt_forw->mt_low ) + { + if ( newp->mt_high >= newp->mt_forw->mt_high ) { + /* Drop this mater struct */ + zot = newp->mt_forw; + newp->mt_forw = zot->mt_forw; + bu_log("dropping overlaping region-id based material property entry:\n"); + rt_pr_mater( zot ); + bu_free( (char *)zot, "getstruct mater" ); + continue; + } + if ( newp->mt_high >= newp->mt_forw->mt_low ) { + /* Shorten this mater struct, then done */ + bu_log("Shortening region-id based material property entry rhs range, from:\n"); + rt_pr_mater( newp->mt_forw ); + bu_log("to:\n"); + newp->mt_forw->mt_low = newp->mt_high+1; + rt_pr_mater( newp->mt_forw ); + continue; /* more conservative than returning */ + } + } +} + + /** * R T _ I N S E R T _ C O L O R * @@ -69,8 +100,8 @@ void rt_insert_color( struct mater *newp ) { - register struct mater *mp; - register struct mater *zot; + struct mater *mp; + struct mater *zot; if ( material_head == MATER_NULL || newp->mt_high < material_head->mt_low ) { /* Insert at head of list */ @@ -82,7 +113,8 @@ /* Insert at head of list, check for redefinition */ newp->mt_forw = material_head; material_head = newp; - goto check_overlap; + _rt_check_overlap(newp); + return; } for ( mp = material_head; mp != MATER_NULL; mp = mp->mt_forw ) { if ( mp->mt_low == newp->mt_low && @@ -93,7 +125,8 @@ *mp = *newp; /* struct copy */ bu_free( (char *)newp, "getstruct mater" ); newp = mp; - goto check_overlap; + _rt_check_overlap(newp); + return; } if ( mp->mt_low < newp->mt_low && mp->mt_high > newp->mt_high ) { @@ -124,14 +157,16 @@ /* Now append */ newp->mt_forw = mp->mt_forw; mp->mt_forw = newp; - goto check_overlap; + _rt_check_overlap(newp); + return; } if ( mp->mt_forw == MATER_NULL || newp->mt_low < mp->mt_forw->mt_low ) { /* Append */ newp->mt_forw = mp->mt_forw; mp->mt_forw = newp; - goto check_overlap; + _rt_check_overlap(newp); + return; } } bu_log("fell out of rt_insert_color loop, append region-id based material property entry to end of list\n"); @@ -139,30 +174,6 @@ newp->mt_forw = MATER_NULL; mp->mt_forw = newp; return; - - /* Check for overlap, ie, redefinition of following colors */ - check_overlap: - while ( newp->mt_forw != MATER_NULL && - newp->mt_high >= newp->mt_forw->mt_low ) { - if ( newp->mt_high >= newp->mt_forw->mt_high ) { - /* Drop this mater struct */ - zot = newp->mt_forw; - newp->mt_forw = zot->mt_forw; - bu_log("dropping overlaping region-id based material property entry:\n"); - rt_pr_mater( zot ); - bu_free( (char *)zot, "getstruct mater" ); - continue; - } - if ( newp->mt_high >= newp->mt_forw->mt_low ) { - /* Shorten this mater struct, then done */ - bu_log("Shortening region-id based material property entry rhs range, from:\n"); - rt_pr_mater( newp->mt_forw ); - bu_log("to:\n"); - newp->mt_forw->mt_low = newp->mt_high+1; - rt_pr_mater( newp->mt_forw ); - continue; /* more conservative than returning */ - } - } } @@ -276,7 +287,7 @@ register struct mater *mp = NULL; register struct mater *newmp = NULL; struct mater *newmater = NULL; - struct mater *dup = NULL; + struct mater *dupmater = NULL; mp = material_head; while (mp != MATER_NULL) { @@ -284,8 +295,8 @@ *newmater = *mp; /* struct copy */ newmater->mt_forw = MATER_NULL; - if (dup == NULL) { - dup = newmater; + if (dupmater == NULL) { + dupmater = newmater; } else { newmp->mt_forw = newmater; } @@ -294,7 +305,7 @@ mp = mp->mt_forw; } - return dup; + return dupmater; } Modified: brlcad/trunk/src/librt/memalloc.c =================================================================== --- brlcad/trunk/src/librt/memalloc.c 2009-11-30 00:24:38 UTC (rev 36722) +++ brlcad/trunk/src/librt/memalloc.c 2009-11-30 01:10:18 UTC (rev 36723) @@ -278,7 +278,7 @@ register int type = 0; register struct mem_map *prevp = MAP_NULL; register struct mem_map *curp; - long il; + size_t il; struct mem_map *tmap; if ( size == 0 ) @@ -292,15 +292,15 @@ /* Make up the `type' variable */ if ( prevp ) { - if ( (il=prevp->m_addr+prevp->m_size) > addr ) + if ( (size_t)(il=prevp->m_addr+prevp->m_size) > (size_t)addr ) type |= M_BOVFL; - if ( il == addr ) + if ( il == (size_t)addr ) type |= M_BMTCH; } if ( curp ) { - if ( (il=addr+size) > curp->m_addr ) + if ( (size_t)(il=addr+size) > (size_t)curp->m_addr ) type |= M_TOVFL; - if ( il == curp->m_addr ) + if ( (size_t)il == (size_t)curp->m_addr ) type |= M_TMTCH; } Modified: brlcad/trunk/src/librt/oslo_calc.c =================================================================== --- brlcad/trunk/src/librt/oslo_calc.c 2009-11-30 00:24:38 UTC (rev 36722) +++ brlcad/trunk/src/librt/oslo_calc.c 2009-11-30 01:10:18 UTC (rev 36723) @@ -17,7 +17,7 @@ * License along with this file; see the file named COPYING for more * information. */ -/** @addtogroup librt +/** @addtogroup librt */ /** @{ */ /** @file oslo_calc.c * @@ -43,8 +43,8 @@ #include "raytrace.h" #include "nurb.h" -#define AMAX(i, j) ( (i) > (j) ? (i) : (j) ) -#define AMIN(i, j) ( (i) < (j) ? (i) : (j) ) +#define AMAX(i, j) ((i) > (j) ? (i) : (j)) +#define AMIN(i, j) ((i) < (j) ? (i) : (j)) struct oslo_mat * rt_nurb_calc_oslo(register int order, register const struct knot_vector *tau_kv, register struct knot_vector *t_kv, struct resource *res) @@ -53,12 +53,12 @@ /* new knot vector */ { - register fastf_t *t_p; - register const fastf_t *tau_p; + register fastf_t *t_p; + register const fastf_t *tau_p; fastf_t ah[20]; fastf_t newknots[20]; /* new knots */ - register int j; /* d(j), j = 0 : # of new ctl points */ - int mu, /* mu: tau[mu] <= t[j] < tau[mu+1]*/ + register int j; /* d(j), j = 0 : # of new ctl points */ + int mu, /* mu: tau[mu] <= t[j] < tau[mu+1]*/ muprim, v, /* Nu value (order of matrix) */ p, @@ -71,6 +71,8 @@ struct oslo_mat * head, * o_ptr, *new_o; + if (res) RT_CK_RESOURCE(res); + n1 = t_kv->k_size - order; t_p = t_kv->knots; @@ -79,19 +81,18 @@ mu = 0; /* initialize mu */ head = (struct oslo_mat *) bu_malloc ( - sizeof( struct oslo_mat), - "rt_nurb_calc_oslo: oslo mat head" ); + sizeof(struct oslo_mat), + "rt_nurb_calc_oslo: oslo mat head"); o_ptr = head; for (j = 0; j < n1; j++) { - register int i; + register int i; - if ( j != 0 ) - { + if (j != 0) { new_o = (struct oslo_mat *) bu_malloc ( - sizeof( struct oslo_mat), - "rt_nurb_calc_oslo: oslo mat struct" ); + sizeof(struct oslo_mat), + "rt_nurb_calc_oslo: oslo mat struct"); o_ptr->next = new_o; o_ptr = new_o; @@ -104,7 +105,7 @@ i = j + 1; - while ((t_p[i] == tau_p[muprim]) && i < (j + order)) { + while (NEAR_ZERO(t_p[i] - tau_p[muprim], SMALL_FASTF) && i < (j + order)) { i++; muprim--; } @@ -112,7 +113,7 @@ ih = muprim + 1; for (v = 0, p = 1; p < order; p++) { - if (t_p[j + p] == tau_p[ih]) + if (NEAR_ZERO(t_p[j + p] - tau_p[ih], SMALL_FASTF)) ih++; else newknots[++v - 1] = t_p[j + p]; @@ -167,13 +168,13 @@ } } - o_ptr->o_vec = (fastf_t *) bu_malloc ( sizeof( fastf_t) * (v+1), - "rt_nurb_calc_oslo: oslo vector"); + o_ptr->o_vec = (fastf_t *) bu_malloc (sizeof(fastf_t) * (v+1), + "rt_nurb_calc_oslo: oslo vector"); o_ptr->offset = AMAX(muprim -v, 0); o_ptr->osize = v; - for ( i = v, p = 0; i >= 0; i--) + for (i = v, p = 0; i >= 0; i--) o_ptr->o_vec[p++] = ah[(order-1) - i]; } @@ -183,7 +184,7 @@ /* - * rt_pr_oslo() - FOR DEBUGGING PURPOSES + * rt_pr_oslo() - FOR DEBUGGING PURPOSES */ void rt_nurb_pr_oslo(struct oslo_mat *om) @@ -191,17 +192,16 @@ struct oslo_mat * omp; int j; - for ( omp = om; omp!= ( struct oslo_mat *) 0; omp = omp->next) - { + for (omp = om; omp!= (struct oslo_mat *) 0; omp = omp->next) { fprintf(stderr, "%lx offset %d osize %d next %lx\n", (unsigned long)omp, omp->offset, omp->osize, (unsigned long)omp->next); fprintf(stderr, "\t%f", omp->o_vec[0]); - for ( j = 1; j <= omp->osize; j++) + for (j = 1; j <= omp->osize; j++) fprintf(stderr, "\t%f", omp->o_vec[j]); - fprintf( stderr, "\n"); + fprintf(stderr, "\n"); } } @@ -214,12 +214,13 @@ { register struct oslo_mat * omp; - while ( om != (struct oslo_mat *) 0 ) - { + if (res) RT_CK_RESOURCE(res); + + while (om != (struct oslo_mat *) 0) { omp = om; om = om->next; - bu_free( (char *)omp->o_vec, "rt_nurb_free_oslo: ovec"); - bu_free( (char *)omp, "rt_nurb_free_oslo: struct oslo"); + bu_free((char *)omp->o_vec, "rt_nurb_free_oslo: ovec"); + bu_free((char *)omp, "rt_nurb_free_oslo: struct oslo"); } } Modified: brlcad/trunk/src/librt/prep.c =================================================================== --- brlcad/trunk/src/librt/prep.c 2009-11-30 00:24:38 UTC (rev 36722) +++ brlcad/trunk/src/librt/prep.c 2009-11-30 01:10:18 UTC (rev 36723) @@ -1457,10 +1457,14 @@ unprep_reg_start(struct db_tree_state *tsp, struct db_full_path *pathp, const struct rt_comb_internal *comb, - genptr_t client_data) + genptr_t client_data __attribute__((unused))) { - RT_CK_RTI(tsp->ts_rtip); - RT_CK_RESOURCE(tsp->ts_resp); + if (tsp) { + RT_CK_RTI(tsp->ts_rtip); + RT_CK_RESOURCE(tsp->ts_resp); + } + if (pathp) RT_CK_FULL_PATH(pathp); + if (comb) RT_CK_COMB(comb); /* Ignore "air" regions unless wanted */ if (tsp->ts_rtip->useair == 0 && tsp->ts_aircode != 0) { @@ -1474,8 +1478,15 @@ unprep_reg_end(struct db_tree_state *tsp, struct db_full_path *pathp, union tree *tree, - genptr_t client_data) + genptr_t client_data __attribute__((unused))) { + if (tsp) { + RT_CK_RTI(tsp->ts_rtip); + RT_CK_RESOURCE(tsp->ts_resp); + } + if (pathp) RT_CK_FULL_PATH(pathp); + if (tree) RT_CK_TREE(tree); + return((union tree *)NULL); } @@ -1483,7 +1494,7 @@ unprep_leaf(struct db_tree_state *tsp, struct db_full_path *pathp, struct rt_db_internal *ip, - genptr_t client_data) + genptr_t client_data __attribute__((unused))) { register struct soltab *stp; struct directory *dp; @@ -1773,7 +1784,6 @@ struct region *rp; struct soltab *stp; fastf_t old_min[3], old_max[3]; - int model_extremes_have_changed=0; long bitno; VMOVE(old_min, rtip->mdl_min); @@ -1855,18 +1865,9 @@ bu_ptbl_free(&rtip->rti_new_solids); - for (i=0; i<3; i++) { - if (rtip->mdl_min[i] != old_min[i]) { - model_extremes_have_changed = 1; - break; - } - if (rtip->mdl_max[i] != old_max[i]) { - model_extremes_have_changed = 1; - break; - } - } - - if (model_extremes_have_changed) { + if (!VAPPROXEQUAL(rtip->mdl_min, old_min, SMALL_FASTF) + || !VAPPROXEQUAL(rtip->mdl_max, old_min, SMALL_FASTF)) + { /* fill out BSP, it must completely fill the model BB */ fastf_t bb[6]; Modified: brlcad/trunk/src/librt/primitives/bot/bot.c =================================================================== --- brlcad/trunk/src/librt/primitives/bot/bot.c 2009-11-30 00:24:38 UTC (rev 36722) +++ brlcad/trunk/src/librt/primitives/bot/bot.c 2009-11-30 01:10:18 UTC (rev 36723) @@ -2574,7 +2574,7 @@ { j = i + 1; while ( j < bot->num_vertices ) { - /* specifically not using tolerances here */ + /* specifically not using tolerances here (except underlying representation tolerance) */ if ( VEQUAL( &bot->vertices[i*3], &bot->vertices[j*3] ) ) { count++; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <br...@us...> - 2009-12-02 16:27:11
|
Revision: 36761 http://brlcad.svn.sourceforge.net/brlcad/?rev=36761&view=rev Author: brlcad Date: 2009-12-02 16:26:21 +0000 (Wed, 02 Dec 2009) Log Message: ----------- and that makes for the remainder whooshage of librt! ws, style, indent, cleanup. eliminate lots of dead #if0 code too. Modified Paths: -------------- brlcad/trunk/src/librt/bezier_2d_isect.c brlcad/trunk/src/librt/bool.c brlcad/trunk/src/librt/db5_alloc.c brlcad/trunk/src/librt/db5_bin.c brlcad/trunk/src/librt/db5_comb.c brlcad/trunk/src/librt/db_comb.c brlcad/trunk/src/librt/parse.c brlcad/trunk/src/librt/pmalloc.c brlcad/trunk/src/librt/prep.c brlcad/trunk/src/librt/primitives/arb8/arb8.c brlcad/trunk/src/librt/primitives/bot/bot.c brlcad/trunk/src/librt/primitives/bot/g_bot_include.c brlcad/trunk/src/librt/primitives/brep/brep.cpp brlcad/trunk/src/librt/primitives/bspline/bspline.cpp brlcad/trunk/src/librt/primitives/bspline/nurb_tess.c brlcad/trunk/src/librt/primitives/ebm/ebm.c brlcad/trunk/src/librt/primitives/half/half.c brlcad/trunk/src/librt/primitives/hf/hf.c brlcad/trunk/src/librt/primitives/nmg/nmg_tri.c brlcad/trunk/src/librt/primitives/tgc/tgc.c brlcad/trunk/src/librt/primitives/tor/tor.c brlcad/trunk/src/librt/raydebug.tcl brlcad/trunk/src/librt/regionfix.c brlcad/trunk/src/librt/roots.c brlcad/trunk/src/librt/shoot.c brlcad/trunk/src/librt/spectrum.c brlcad/trunk/src/librt/storage.c brlcad/trunk/src/librt/tcl.c brlcad/trunk/src/librt/timer-nt.c brlcad/trunk/src/librt/timer42.c brlcad/trunk/src/librt/timer52brl.c brlcad/trunk/src/librt/timerhep.c brlcad/trunk/src/librt/timerunix.c brlcad/trunk/src/librt/transform.c brlcad/trunk/src/librt/tree.c brlcad/trunk/src/librt/vers.c brlcad/trunk/src/librt/vlist.c brlcad/trunk/src/librt/vshoot.c brlcad/trunk/src/librt/wdb.c Modified: brlcad/trunk/src/librt/bezier_2d_isect.c =================================================================== --- brlcad/trunk/src/librt/bezier_2d_isect.c 2009-12-02 16:25:14 UTC (rev 36760) +++ brlcad/trunk/src/librt/bezier_2d_isect.c 2009-12-02 16:26:21 UTC (rev 36761) @@ -306,48 +306,6 @@ normal[Y] /= len; return 1; -#if 0 - V2MOVE( p, ray_start ); - p[Z] = 0.0; - V2MOVE( d, ray_dir ); - d[Z] = 0.0; - V2MOVE( a, V[0] ); - a[Z] = 0.0; - V2SUB2( c, V[degree], V[0] ); - c[Z] = 0.0; - - /* calculate intercept */ - ret = bn_isect_line2_lseg2( dist, p, d, a, c, &tol ); - - bu_log( "\tbn_isect_line2_lseg2() returned %d\n", ret ); - - if ( ret <= 0 ) - return 0; - - switch ( ret ) { - case 1: - /* intercept at V[0] */ - V2MOVE( intercept, V[0] ); - break; - case 2: - /* intercept at V[degree] */ - V2MOVE( intercept, V[degree] ); - break; - case 3: - /* intercept between endpoints */ - V2JOIN1( intercept, ray_start, dist[0], ray_dir ); - break; - } - - /* calculate normal */ - normal[X] = c[Y]; - normal[Y] = -c[X]; - len = sqrt( MAG2SQ( c ) ); - normal[X] /= len; - normal[Y] /= len; - - return 1; -#endif } Modified: brlcad/trunk/src/librt/bool.c =================================================================== --- brlcad/trunk/src/librt/bool.c 2009-12-02 16:25:14 UTC (rev 36760) +++ brlcad/trunk/src/librt/bool.c 2009-12-02 16:26:21 UTC (rev 36761) @@ -1278,11 +1278,6 @@ bu_log("%s", bu_vls_addr(&str)); bu_vls_free(&str); - -#if 0 - rt_pr_partitions(ap->a_rt_i, pheadp, "Entire ray containing overlap"); -#endif - } @@ -2102,17 +2097,6 @@ rt_pr_partitions(ap->a_rt_i, InputHdp, "rt_boolfinal: Input/pending partition list at return:"); bu_log("rt_boolfinal() ret=%d, %s\n", ret, reason); } -#if 0 - /* This is no longer a valid check!!! */ - /* Sanity check */ - if (RT_G_DEBUG && ap->a_onehit == 0 && - InputHdp->pt_forw != InputHdp && enddist >= INFINITY) { - bu_log("rt_boolfinal() ret=%d, %s\n", ret, reason); - rt_pr_partitions(ap->a_rt_i, FinalHdp, "rt_boolfinal: Final partition list at return:"); - rt_pr_partitions(ap->a_rt_i, InputHdp, "rt_boolfinal: Input/pending partition list at return:"); - bu_bomb("rt_boolfinal() failed to process InputHdp list\n"); - } -#endif return ret; } Modified: brlcad/trunk/src/librt/db5_alloc.c =================================================================== --- brlcad/trunk/src/librt/db5_alloc.c 2009-12-02 16:25:14 UTC (rev 36760) +++ brlcad/trunk/src/librt/db5_alloc.c 2009-12-02 16:26:21 UTC (rev 36761) @@ -253,14 +253,6 @@ dp->d_len = ep->ext_nbytes; if (RT_G_DEBUG&DEBUG_DB) bu_log("db5_realloc(%s) extending database addr=x%x, len=%d\n", dp->d_namep, dp->d_addr, dp->d_len); -#if 0 - /* Extending db with free record isn't necessary even to - * provide "stable-store" capability. - * If program or system aborts before caller write new object, - * there is no problem. - */ - if ( db5_write_free( dbip, dp, dp->d_len ) < 0 ) return -1; -#endif return 0; } Modified: brlcad/trunk/src/librt/db5_bin.c =================================================================== --- brlcad/trunk/src/librt/db5_bin.c 2009-12-02 16:25:14 UTC (rev 36760) +++ brlcad/trunk/src/librt/db5_bin.c 2009-12-02 16:26:21 UTC (rev 36761) @@ -194,14 +194,6 @@ bip->count = ep->ext_nbytes/2; bip->u.uint8 = (unsigned char *) bu_malloc( ep->ext_nbytes, "rt_binunif_internal" ); -#if 0 - srcp = (unsigned char *) ep->ext_buf; - sdestp = (unsigned short *) bip->u.uint8; - for (i = 0; i < bip->count; ++i, ++sdestp, srcp += 2) { - *sdestp = bu_gshort( srcp ); - bu_log("Just got %d", *sdestp); - } -#endif in_cookie = bu_cv_cookie("nus"); out_cookie = bu_cv_cookie("hus"); if (bu_cv_optimize(in_cookie) != bu_cv_optimize(out_cookie)) { Modified: brlcad/trunk/src/librt/db5_comb.c =================================================================== --- brlcad/trunk/src/librt/db5_comb.c 2009-12-02 16:25:14 UTC (rev 36760) +++ brlcad/trunk/src/librt/db5_comb.c 2009-12-02 16:26:21 UTC (rev 36761) @@ -309,11 +309,7 @@ BU_INIT_EXTERNAL(ep); ep->ext_nbytes = need; -#if 0 - ep->ext_buf = bu_malloc( need, "rt_comb_export5 ext_buf" ); -#else ep->ext_buf = bu_calloc( 1, need, "rt_comb_export5 ext_buf" ); -#endif /* Build combination's on-disk header section */ cp = (unsigned char *)ep->ext_buf; @@ -401,20 +397,6 @@ else bu_avs_remove( avsp, "oshader" ); -#if 0 - if ( bu_vls_strlen( &comb->material ) > 0 ) - bu_avs_add_vls( avsp, "material", &comb->material ); - else - bu_avs_remove( avsp, "material" ); -#endif -#if 0 - if ( comb->temperature > 0 ) { - bu_vls_trunc( &value, 0 ); - bu_vls_printf( &value, "%f", comb->temperature ); - bu_avs_add_vls( avsp, "temp", &value ); - } else - bu_avs_remove( avsp, "temp" ); -#endif /* GIFT compatability */ if ( comb->region_id != 0 ) { bu_vls_trunc( &value, 0 ); @@ -784,9 +766,6 @@ } if ( (ap = bu_avs_get( &ip->idb_avs, "material_id" )) != NULL ) { comb->GIFTmater = atoi( ap ); -#if 0 - bu_vls_printf( &comb->material, "gift%d", comb->GIFTmater ); -#endif } if ( (ap = bu_avs_get( &ip->idb_avs, "los" )) != NULL ) { comb->los = atoi( ap ); Modified: brlcad/trunk/src/librt/db_comb.c =================================================================== --- brlcad/trunk/src/librt/db_comb.c 2009-12-02 16:25:14 UTC (rev 36760) +++ brlcad/trunk/src/librt/db_comb.c 2009-12-02 16:26:21 UTC (rev 36761) @@ -356,13 +356,6 @@ comb->aircode = rp[0].c.c_aircode; comb->GIFTmater = rp[0].c.c_material; comb->los = rp[0].c.c_los; -#if 0 - if (comb->region_id && comb->aircode) { - bu_log("NOTICE: region %s has both id=%d and aircode=%d, ignoring aircode!!!\n", - rp[0].c.c_name, comb->region_id, comb->aircode); - comb->aircode = 0; - } -#endif } else { /* set some reasonable defaults */ comb->region_id = 0; Modified: brlcad/trunk/src/librt/parse.c =================================================================== --- brlcad/trunk/src/librt/parse.c 2009-12-02 16:25:14 UTC (rev 36760) +++ brlcad/trunk/src/librt/parse.c 2009-12-02 16:26:21 UTC (rev 36761) @@ -114,11 +114,6 @@ sdp->sp_name, sdp->sp_fmt ); continue; } -#if 0 - bu_vls_trunc( &vls, 0 ); - bu_vls_item_print( &vls, sdp, base ); - bu_log( " %s=%s\n", sdp->sp_name, bu_vls_addr(&vls) ); -#else switch ( sdp->sp_fmt[1] ) { case 'c': case 's': @@ -215,7 +210,6 @@ sdp->sp_name, sdp->sp_fmt ); break; } -#endif } bu_vls_free(&vls); } Modified: brlcad/trunk/src/librt/pmalloc.c =================================================================== --- brlcad/trunk/src/librt/pmalloc.c 2009-12-02 16:25:14 UTC (rev 36760) +++ brlcad/trunk/src/librt/pmalloc.c 2009-12-02 16:26:21 UTC (rev 36761) @@ -21,52 +21,52 @@ /** @{ */ /** @file pmalloc.c * - * The Princeton memory allocater. + * The Princeton memory allocater. * - * Functions - - * rt_pmalloc - * rt_pfree - * rt_prealloc - * rt_forget + * Functions - + * rt_pmalloc + * rt_pfree + * rt_prealloc + * rt_forget * - * Author - - * Wiliam L. Sebok + * Author - + * Wiliam L. Sebok * - * Modified: - * John Anderson - modified for use in multi-threaded applications. - * It now uses a field from the BRL-CAD resource structure - * to store the memory blocks. Also replaced mlindx() routine - * with a faster (but less general) version that takes advantage - * of the fact that bucket sizes increase by powers of two. + * Modified: + * John Anderson - modified for use in multi-threaded applications. + * It now uses a field from the BRL-CAD resource structure + * to store the memory blocks. Also replaced mlindx() routine + * with a faster (but less general) version that takes advantage + * of the fact that bucket sizes increase by powers of two. * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * A "smarter" malloc v1.0 William L. Sebok + * A "smarter" malloc v1.0 William L. Sebok * Sept. 24, 1984 rev. June 30, 1986 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * Algorithm: - * Assign to each area an index "n". This is currently proportional to - * the log 2 of size of the area rounded down to the nearest integer. - * Then all free areas of storage whose length have the same index n are - * organized into a chain with other free areas of index n (the "bucket" - * chain). A request for allocation of storage first searches the list of - * free memory. The search starts at the bucket chain of index equal to - * that of the storage request, continuing to higher index bucket chains - * if the first attempt fails. - * If the search fails then new memory is allocated. Only the amount of - * new memory needed is allocated. Any old free memory left after an - * allocation is returned to the free list. + * Algorithm: + * Assign to each area an index "n". This is currently proportional to + * the log 2 of size of the area rounded down to the nearest integer. + * Then all free areas of storage whose length have the same index n are + * organized into a chain with other free areas of index n (the "bucket" + * chain). A request for allocation of storage first searches the list of + * free memory. The search starts at the bucket chain of index equal to + * that of the storage request, continuing to higher index bucket chains + * if the first attempt fails. + * If the search fails then new memory is allocated. Only the amount of + * new memory needed is allocated. Any old free memory left after an + * allocation is returned to the free list. * - * All memory areas (free or busy) handled by rt_pmalloc are also chained - * sequentially by increasing address (the adjacency chain). When memory - * is freed it is merged with adjacent free areas, if any. If a free area - * of memory ends at the end of memory (i.e. at the break), and if the - * variable "endfree" is non-zero, then the break is contracted, freeing - * the memory back to the system. + * All memory areas (free or busy) handled by rt_pmalloc are also chained + * sequentially by increasing address (the adjacency chain). When memory + * is freed it is merged with adjacent free areas, if any. If a free area + * of memory ends at the end of memory (i.e. at the break), and if the + * variable "endfree" is non-zero, then the break is contracted, freeing + * the memory back to the system. * - * Notes: - * ov_length field includes sizeof(struct overhead) - * adjacency chain includes all memory, allocated plus free. + * Notes: + * ov_length field includes sizeof(struct overhead) + * adjacency chain includes all memory, allocated plus free. */ /** @} */ @@ -86,10 +86,10 @@ */ /* alignment requirement for machine (in bytes) */ -#define NALIGN sizeof(double) +#define NALIGN sizeof(double) /* size of an integer large enough to hold a character pointer */ -typedef long Size; +typedef long Size; /* * CURBRK returns the value of the current system break, i.e., the system's @@ -99,9 +99,9 @@ */ #ifndef CURBRK -#define CURBRK sbrk(0) +#define CURBRK sbrk(0) #else /* CURBRK */ -# if CURBRK == curbrk +# if CURBRK == curbrk extern Size curbrk; # endif #endif /* CURBRK */ @@ -114,37 +114,29 @@ */ #ifndef BRK -#define BRK(x) brk(x) +#define BRK(x) brk(x) #endif /* Not BRK */ /* END of machine dependent portion */ -#define MAGIC_FREE 0x548a934c -#define MAGIC_BUSY 0xc139569a +#define MAGIC_FREE 0x548a934c +#define MAGIC_BUSY 0xc139569a -#if 0 -#define RT_PM_NBUCKETS 18 - -struct rt_qelem { - struct rt_qelem *q_forw; - struct rt_qelem *q_back; -}; - -#endif struct overhead { - struct rt_qelem ov_adj; /* adjacency chain pointers */ - struct rt_qelem ov_buk; /* bucket chain pointers */ - long ov_magic; - Size ov_length; + struct rt_qelem ov_adj; /* adjacency chain pointers */ + struct rt_qelem ov_buk; /* bucket chain pointers */ + long ov_magic; + Size ov_length; }; + /* * The following macros depend on the order of the elements in struct overhead */ #define TOADJ(p) ((struct rt_qelem *)(p)) #define FROMADJ(p) ((struct overhead *)(p)) -#define FROMBUK(p) ((struct overhead *)( (char *)p - sizeof(struct rt_qelem))) -#define TOBUK(p) ((struct rt_qelem *)( (char *)p + sizeof(struct rt_qelem))) +#define FROMBUK(p) ((struct overhead *)((char *)p - sizeof(struct rt_qelem))) +#define TOBUK(p) ((struct rt_qelem *)((char *)p + sizeof(struct rt_qelem))) extern char endfree; @@ -157,17 +149,17 @@ #define debug 1 #ifdef debug -# define ASSERT(p, q) if (!(p)) { \ - bu_semaphore_acquire( BU_SEM_SYSCALL ); \ - mllcerr(q); \ - bu_semaphore_release( BU_SEM_SYSCALL ); \ - } +# define ASSERT(p, q) if (!(p)) { \ + bu_semaphore_acquire(BU_SEM_SYSCALL); \ + mllcerr(q); \ + bu_semaphore_release(BU_SEM_SYSCALL); \ + } #else # define ASSERT(p, q) #endif #ifndef NULL -#define NULL 0 +#define NULL 0 #endif /* @@ -182,24 +174,7 @@ 65536, 131072, 262144, 524288, 1048576, 2097152, 4194304 }; -#if 0 -/* head of adjacency chain */ -static struct rt_qelem adjhead = { &adjhead, &adjhead }; -/* head of bucket chains */ -static struct rt_qelem buck[RT_PM_NBUCKETS] = { - &buck[0], &buck[0], &buck[1], &buck[1], - &buck[2], &buck[2], &buck[3], &buck[3], - &buck[4], &buck[4], &buck[5], &buck[5], - &buck[6], &buck[6], &buck[7], &buck[7], - &buck[8], &buck[8], &buck[9], &buck[9], - &buck[10], &buck[10], &buck[11], &buck[11], - &buck[12], &buck[12], &buck[13], &buck[13], - &buck[14], &buck[14], &buck[15], &buck[15], - &buck[16], &buck[16], &buck[17], &buck[17] -}; -#endif - void (*mlabort)() = {0}; /* ptr to optional user-provided error handler */ char * @@ -237,30 +212,25 @@ register Size i; long ret; - bu_semaphore_acquire( BU_SEM_SYSCALL ); + bu_semaphore_acquire(BU_SEM_SYSCALL); p = (struct overhead *)CURBRK; i = ((Size)p)&(NALIGN-1); if (i != 0) p = (struct overhead *)((char *)p + NALIGN - i); ret = (long)BRK(((char *)p) + nbytes); - bu_semaphore_release( BU_SEM_SYSCALL ); + bu_semaphore_release(BU_SEM_SYSCALL); - if ( ret ) - bu_bomb( "rt_pmalloc: brk() failure. Insufficient memory available!\n" ); + if (ret) + bu_bomb("rt_pmalloc: brk() failure. Insufficient memory available!\n"); p->ov_length = nbytes; surplus = 0; /* add to end of adjacency chain */ -#if 0 - ASSERT((FROMADJ(pmem->adjhead.q_back)) < p, - "\nrt_pmalloc: Entry in adjacency chain found with address lower than Chain head!\n" - ) -#endif - rt_pm_insque(TOADJ(p), pmem->adjhead.q_back); + rt_pm_insque(TOADJ(p), pmem->adjhead.q_back); } - foundit: +foundit: /* mark surplus memory free */ if (surplus > sizeof(struct overhead)) { /* if big enough, split it up */ @@ -281,54 +251,35 @@ return((char*)p + sizeof(struct overhead)); } + /* * select the proper size bucket */ -#if 0 -static Size -mlindx(n) - register Size n; -{ - register Size *p, *q, *r; - p = &mlsizes[0]; - r = &mlsizes[RT_PM_NBUCKETS]; - /* binary search */ - while ((q = (p + (r-p)/2)) > p) { - if (n < *q) - r = q; - else - p = q; - } - return(q - &mlsizes[0]); -} -#else /* this version of mlindx() will only work with the original RT_PM_NBUCKETS * and mlsizes[] */ static Size -mlindx( n ) +mlindx(n) register Size n; { register Size index=0, shifter; - if ( n >= mlsizes[RT_PM_NBUCKETS-1] ) + if (n >= mlsizes[RT_PM_NBUCKETS-1]) index = RT_PM_NBUCKETS-1; - else if ( n < mlsizes[1] ) + else if (n < mlsizes[1]) index = 0; - else - { + else { shifter = n >> 6; - while ( shifter ) - { + while (shifter) { index++; shifter = shifter >> 1; } } - return( index ); + return(index); } -#endif + static void mllcerr(p) char *p; @@ -343,12 +294,13 @@ abort(); } + /* * The vax has wondrous instructions for inserting and removing items into * doubly linked queues. On the vax the assembler output of the C compiler is * massaged by an sed script to turn these function calls into invocations of * the rt_pm_insque and rt_pm_remque machine instructions. - * In BRL's version, all machines use these functions. No assembler. + * In BRL's version, all machines use these functions. No assembler. */ static void @@ -364,6 +316,7 @@ pueu->q_back = item; } + static void rt_pm_remque(item) register struct rt_qelem *item; @@ -376,8 +329,9 @@ pueu->q_back = queu; } + /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * rt_pfree William L. Sebok + * rt_pfree William L. Sebok * A "smarter" malloc v1.0 Sept. 24, 1984 rev. June 30, 1986 * * rt_pfree takes a previously rt_pmalloc-allocated area at mem and frees it. @@ -407,11 +361,11 @@ if (q != FROMADJ(&pmem->adjhead)) { ASSERT(q < p, - "\nrt_pfree: While trying to merge a free area with a lower adjacent free area,\n\ + "\nrt_pfree: While trying to merge a free area with a lower adjacent free area, \n\ addresses were found out of order!\n") /* If lower segment can be merged */ - if ( q->ov_magic == MAGIC_FREE - && (char *)q + q->ov_length == (char *)p + if (q->ov_magic == MAGIC_FREE + && (char *)q + q->ov_length == (char *)p ) { /* remove lower address area from bucket chain */ rt_pm_remque(TOBUK(q)); @@ -431,10 +385,10 @@ if (q != FROMADJ(&pmem->adjhead)) { /* upper segment can be merged */ ASSERT(q > p, - "\nrt_pfree: While trying to merge a free area with a higher adjacent free area,\n\ + "\nrt_pfree: While trying to merge a free area with a higher adjacent free area, \n\ addresses were found out of order!\n") - if ( q->ov_magic == MAGIC_FREE - && (char *)p + p->ov_length == (char *)q + if (q->ov_magic == MAGIC_FREE + && (char *)p + p->ov_length == (char *)q ) { /* remove upper from bucket chain */ rt_pm_remque(TOBUK(q)); @@ -453,24 +407,24 @@ rt_pm_insque(TOBUK(p), &pmem->buckets[mlindx(p->ov_length)]); if (endfree) - mlfree_end( pmem ); + mlfree_end(pmem); return; } + static void -mlfree_end( pmem ) +mlfree_end(pmem) register struct rt_pm_res *pmem; { register struct overhead *p; p = FROMADJ(pmem->adjhead.q_back); - if ( p->ov_magic != MAGIC_FREE ) + if (p->ov_magic != MAGIC_FREE) return; - bu_semaphore_acquire( BU_SEM_SYSCALL ); - if ( (char*)p + p->ov_length == (char *)CURBRK) - { + bu_semaphore_acquire(BU_SEM_SYSCALL); + if ((char*)p + p->ov_length == (char *)CURBRK) { /* area is free and at end of memory */ p->ov_magic = 0; /* decommission (just in case) */ @@ -484,14 +438,15 @@ /* release memory to system */ (void)BRK((char *)p); } - bu_semaphore_release( BU_SEM_SYSCALL ); + bu_semaphore_release(BU_SEM_SYSCALL); return; } + /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * rt_prealloc William L. Sebok - * A "smarter" malloc v1.0 Sept. 24, 1984 rev. June 30, 1986 + * rt_prealloc William L. Sebok + * A "smarter" malloc v1.0 Sept. 24, 1984 rev. June 30, 1986 * * rt_prealloc takes previously rt_pmalloc-allocated area at mem, and tries * to change its size to nbytes bytes, moving it and copying its @@ -530,13 +485,13 @@ endfree = oendfree; } - if ( p->ov_magic == MAGIC_FREE - && (surplus = length - nbytes - sizeof(struct overhead)) >= 0 + if (p->ov_magic == MAGIC_FREE + && (surplus = length - nbytes - sizeof(struct overhead)) >= 0 ) { /* shrink area in place */ if (surplus > sizeof(struct overhead)) { - q = (struct overhead *)( (char *)p + nbytes - + sizeof(struct overhead)); + q = (struct overhead *)((char *)p + nbytes + + sizeof(struct overhead)); q->ov_length = surplus; q->ov_magic = MAGIC_FREE; rt_pm_insque(TOADJ(q), TOADJ(p)); @@ -548,27 +503,26 @@ p->ov_magic = MAGIC_BUSY; if (endfree) - mlfree_end( pmem ); + mlfree_end(pmem); return(mem); } /* if at break, grow in place */ - bu_semaphore_acquire( BU_SEM_SYSCALL ); + bu_semaphore_acquire(BU_SEM_SYSCALL); if (p->ov_magic == MAGIC_FREE && ((char *)p + p->ov_length) == (char *)CURBRK) { nbytes += sizeof(struct overhead); BRK((char *)p + nbytes); - bu_semaphore_release( BU_SEM_SYSCALL ); + bu_semaphore_release(BU_SEM_SYSCALL); p->ov_length = nbytes; /* declare it to be busy */ rt_pm_remque(TOBUK(p)); p->ov_magic = MAGIC_BUSY; return(mem); - } - else - bu_semaphore_release( BU_SEM_SYSCALL ); + } else + bu_semaphore_release(BU_SEM_SYSCALL); newmem = rt_pmalloc((long)nbytes, pmem); @@ -580,107 +534,16 @@ } if (endfree) - mlfree_end( pmem ); + mlfree_end(pmem); return(newmem); } -#if 0 -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * rt_forget William L. Sebok - * A "smarter" malloc v1.0 Sept. 24, 1984 rev. June 30, 1986 - * - * rt_forget returns to the rt_pmalloc arena all memory allocated by sbrk() - * above "bpnt". - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ -void -rt_forget(bpnt, pmem) - char *bpnt; - struct rt_pm_res *pmem; -{ - register struct overhead *p, *q, *r, *b; - register Size l; - struct overhead *crbrk; - char pinvalid, oendfree; - - /* - * b = rt_forget point - * p = beginning of entry - * q = end of entry, beginning of gap - * r = end of gap, beginning of next entry (or the break) - * pinvalid = true when groveling at rt_forget point - */ - - pinvalid = 0; - oendfree = endfree; endfree = 0; - b = (struct overhead *)bpnt; - p = FROMADJ(pmem->adjhead.q_back); - q = (struct overhead *)0; - bu_semaphore_acquire( BU_SEM_SYSCALL ); - r = crbrk = (struct overhead *)CURBRK; - bu_semaphore_release( BU_SEM_SYSCALL ); - - for (;pinvalid == 0 && b < r; p = FROMADJ(TOADJ(r = p)->q_back)) { - if ( p == FROMADJ(&pmem->adjhead) - || (q = (struct overhead *)((char *)p + p->ov_length)) < b - ) { - pinvalid = 1; - q = b; - } - - if (q == r) - continue; - - ASSERT(q < r, - "\nrt_forget: addresses in adjacency chain are out of order!\n") - - /* end of gap is at break */ - if (oendfree && r == crbrk) { - - bu_semaphore_acquire( BU_SEM_SYSCALL ); - (void)BRK((char *)q); /* free it yourself */ - bu_semaphore_release( BU_SEM_SYSCALL ); - - crbrk = r = q; - continue; - } - - if (pinvalid) - q = (struct overhead *) /* align q pointer */ - (((long)q + (NALIGN-1)) & (~(NALIGN-1))); - - l = (char *)r - (char *)q; - /* - * note: unless something is screwy: (l%NALIGN) == 0 - * as r should be aligned by this point - */ - - if (l >= sizeof(struct overhead)) { - /* construct busy entry and free it */ - q->ov_magic = MAGIC_BUSY; - q->ov_length = l; - rt_pm_insque(TOADJ(q), TOADJ(p)); - rt_pfree((char *)q + sizeof(struct overhead)); - } else if (pinvalid == 0) { - /* append it to previous entry */ - p->ov_length += l; - if (p->ov_magic == MAGIC_FREE) { - rt_pm_remque(TOBUK(p)); - rt_pm_insque(TOBUK(p), &pmem->buckets[mlindx(p->ov_length)]); - } - } - } - endfree = oendfree; - if (endfree) - mlfree_end( pmem ); - return; -} -#endif /* - * P C A L L O C + * P C A L L O C * - * Malloc() a block of memory, and clear it. + * Malloc() a block of memory, and clear it. */ char * rt_pcalloc(num, size, pmem) @@ -690,12 +553,13 @@ register char *p; size *= num; - if ( (p = rt_pmalloc((long)size, pmem)) ) { + if ((p = rt_pmalloc((long)size, pmem))) { memset(p, 0, size); } return (p); } + void rt_cfree(p, num, size, pmem) char *p; @@ -706,6 +570,7 @@ rt_pfree(p, pmem); } + /* * Local Variables: * mode: C Modified: brlcad/trunk/src/librt/prep.c =================================================================== --- brlcad/trunk/src/librt/prep.c 2009-12-02 16:25:14 UTC (rev 36760) +++ brlcad/trunk/src/librt/prep.c 2009-12-02 16:26:21 UTC (rev 36761) @@ -67,8 +67,8 @@ if (BU_LIST_FIRST(bu_list, &rt_g.rtg_vlfree) == 0) { char *envflags; envflags = getenv("LIBRT_DEBUG"); - if(envflags) { - if(rt_g.debug) + if (envflags) { + if (rt_g.debug) bu_log("WARNING: discarding LIBRT_DEBUG value in favor of application specified flags\n"); else rt_g.debug = strtol(envflags, NULL, 0x10); @@ -213,9 +213,9 @@ RT_CK_RTI(rtip); - if (RT_G_DEBUG&DEBUG_REGIONS) bu_log("rt_prep_parallel(%s, %d, ncpu=%d) START\n", - rtip->rti_dbip->dbi_filename, - rtip->rti_dbip->dbi_uses, ncpu); + if (RT_G_DEBUG&DEBUG_REGIONS) bu_log("rt_prep_parallel(%s, %d, ncpu=%d) START\n", + rtip->rti_dbip->dbi_filename, + rtip->rti_dbip->dbi_uses, ncpu); bu_semaphore_acquire(RT_SEM_RESULTS); /* start critical section */ if (!rtip->needprep) { @@ -270,7 +270,7 @@ /* If a resource structure has been provided for us, use it. */ resp = (struct resource *)BU_PTBL_GET(&rtip->rti_resources, 0); - if (!resp) resp = &rt_uniresource; + if (!resp) resp = &rt_uniresource; RT_CK_RESOURCE(resp); /* Build array of region pointers indexed by reg_bit. Optimize @@ -278,9 +278,9 @@ * bit vector of every solid contained in the subtree. */ rtip->Regions = (struct region **)bu_calloc(rtip->nregions, sizeof(struct region *), "rtip->Regions[]"); - if (RT_G_DEBUG&DEBUG_REGIONS) bu_log("rt_prep_parallel(%s, %d) about to optimize regions\n", - rtip->rti_dbip->dbi_filename, - rtip->rti_dbip->dbi_uses); + if (RT_G_DEBUG&DEBUG_REGIONS) bu_log("rt_prep_parallel(%s, %d) about to optimize regions\n", + rtip->rti_dbip->dbi_filename, + rtip->rti_dbip->dbi_uses); for (BU_LIST_FOR(regp, region, &(rtip->HeadRegion))) { /* Ensure bit numbers are unique */ BU_ASSERT_PTR(rtip->Regions[regp->reg_bit], ==, REGION_NULL); @@ -336,7 +336,7 @@ } /* Malloc the storage and zero the counts */ for (i=0; i <= ID_MAX_SOLID; i++) { - if (rtip->rti_nsol_by_type[i] <= 0) continue; + if (rtip->rti_nsol_by_type[i] <= 0) continue; rtip->rti_sol_by_type[i] = (struct soltab **)bu_calloc( rtip->rti_nsol_by_type[i], sizeof(struct soltab *), @@ -373,9 +373,9 @@ diff = (rtip->mdl_max[X] - rtip->mdl_min[X]); f = (rtip->mdl_max[Y] - rtip->mdl_min[Y]); - if (f > diff) diff = f; + if (f > diff) diff = f; f = (rtip->mdl_max[Z] - rtip->mdl_min[Z]); - if (f > diff) diff = f; + if (f > diff) diff = f; diff *= 0.1; /* 10% expansion of box */ rtip->rti_pmin[0] = rtip->mdl_min[0] - diff; rtip->rti_pmin[1] = rtip->mdl_min[1] - diff; @@ -427,9 +427,9 @@ rtip->needprep = 0; /* prep is done */ bu_semaphore_release(RT_SEM_RESULTS); /* end critical section */ - if (RT_G_DEBUG&DEBUG_REGIONS) bu_log("rt_prep_parallel(%s, %d, ncpu=%d) FINISH\n", - rtip->rti_dbip->dbi_filename, - rtip->rti_dbip->dbi_uses, ncpu); + if (RT_G_DEBUG&DEBUG_REGIONS) bu_log("rt_prep_parallel(%s, %d, ncpu=%d) FINISH\n", + rtip->rti_dbip->dbi_filename, + rtip->rti_dbip->dbi_uses, ncpu); } @@ -461,7 +461,7 @@ pdv_3space(fp, rtip->rti_pmin, rtip->rti_pmax); RT_VISIT_ALL_SOLTABS_START(stp, rtip) { /* Ignore "dead" solids in the list. (They failed prep) */ - if (stp->st_aradius <= 0) continue; + if (stp->st_aradius <= 0) continue; /* Don't draw infinite solids */ if (stp->st_aradius >= INFINITY) continue; @@ -487,7 +487,7 @@ RT_VISIT_ALL_SOLTABS_START(stp, rtip) { /* Ignore "dead" solids in the list. (They failed prep) */ - if (stp->st_aradius <= 0) continue; + if (stp->st_aradius <= 0) continue; /* Don't draw infinite solids */ if (stp->st_aradius >= INFINITY) @@ -618,7 +618,7 @@ if (resp == &rt_uniresource) { cpu_num = MAX_PSW; /* array is [MAX_PSW+1] just for this */ - if (rtip) RT_CK_RTI(rtip); /* check it if provided */ + if (rtip) RT_CK_RTI(rtip); /* check it if provided */ } else { BU_ASSERT_PTR(resp, !=, NULL); BU_ASSERT_LONG(cpu_num, >=, 0); @@ -934,8 +934,7 @@ db_free_tree(regp->reg_treetop, &rt_uniresource); bu_free((genptr_t)regp->reg_name, "region name str"); regp->reg_name = (char *)0; - if (regp->reg_mater.ma_shader) - { + if (regp->reg_mater.ma_shader) { bu_free((genptr_t)regp->reg_mater.ma_shader, "ma_shader"); regp->reg_mater.ma_shader = (char *)NULL; } @@ -984,7 +983,7 @@ /* Free array of solid table pointers indexed by solid ID */ for (i=0; i <= ID_MAX_SOLID; i++) { - if (rtip->rti_nsol_by_type[i] <= 0) continue; + if (rtip->rti_nsol_by_type[i] <= 0) continue; if (rtip->rti_sol_by_type[i]) { bu_free((char *)rtip->rti_sol_by_type[i], "sol_by_type"); } @@ -1010,7 +1009,7 @@ /* After using a submodel, some entries may be NULL * while others are not NULL */ - if (*rpp == NULL) continue; + if (*rpp == NULL) continue; RT_CK_RESOURCE(*rpp); /* Clean but do not free the resource struct */ rt_clean_resource(rtip, *rpp); @@ -1453,6 +1452,7 @@ return(0); } + static int unprep_reg_start(struct db_tree_state *tsp, struct db_full_path *pathp, @@ -1474,6 +1474,7 @@ return(0); } + static union tree * unprep_reg_end(struct db_tree_state *tsp, struct db_full_path *pathp, @@ -1490,6 +1491,7 @@ return((union tree *)NULL); } + static union tree * unprep_leaf(struct db_tree_state *tsp, struct db_full_path *pathp, @@ -1699,8 +1701,7 @@ /* XXX db_free_tree(rp->reg_treetop, resp); */ bu_free((genptr_t)rp->reg_name, "region name str"); rp->reg_name = (char *)0; - if (rp->reg_mater.ma_shader) - { + if (rp->reg_mater.ma_shader) { bu_free((genptr_t)rp->reg_mater.ma_shader, "ma_shader"); rp->reg_mater.ma_shader = (char *)NULL; } @@ -1769,6 +1770,7 @@ return(0); } + /** * R T _ R E P R E P * @@ -1891,6 +1893,7 @@ return(0); } + /** @} */ /* Modified: brlcad/trunk/src/librt/primitives/arb8/arb8.c =================================================================== --- brlcad/trunk/src/librt/primitives/arb8/arb8.c 2009-12-02 16:25:14 UTC (rev 36760) +++ brlcad/trunk/src/librt/primitives/arb8/arb8.c 2009-12-02 16:26:21 UTC (rev 36761) @@ -276,13 +276,6 @@ return(0); } -#if 0 - bu_log("uvec: "); - for (j=0; j<8; j++) bu_log("%d, ", uvec[j]); - bu_log("\nsvec: "); - for (j=0; j<11; j++) bu_log("%d, ", svec[j]); - bu_log("\n"); -#endif return(numuvec); } Modified: brlcad/trunk/src/librt/primitives/bot/bot.c =================================================================== --- brlcad/trunk/src/librt/primitives/bot/bot.c 2009-12-02 16:25:14 UTC (rev 36760) +++ brlcad/trunk/src/librt/primitives/bot/bot.c 2009-12-02 16:26:21 UTC (rev 36761) @@ -3433,12 +3433,6 @@ RT_BOT_CK_MAGIC(bot); -#if 0 - if (max_chord_error <= SMALL_FASTF && - max_normal_error <= SMALL_FASTF && - min_edge_length <= SMALL_FASTF) - return 0; -#endif /* convert normal error to something useful (a minimum dot product) */ if (max_normal_error > -1.0) { max_normal_error = cos(max_normal_error * M_PI / 180.0); Modified: brlcad/trunk/src/librt/primitives/bot/g_bot_include.c =================================================================== --- brlcad/trunk/src/librt/primitives/bot/g_bot_include.c 2009-12-02 16:25:14 UTC (rev 36760) +++ brlcad/trunk/src/librt/primitives/bot/g_bot_include.c 2009-12-02 16:26:21 UTC (rev 36761) @@ -797,13 +797,6 @@ } } } -#if 0 - bu_log("nhits = %d\n", nhits); - for (i=0; i<nhits; i++) { - rt_bot_norm(&hits[i], stp, rp); - bu_log("dist=%g, normal = (%g %g %g), %s\n", hits[i].hit_dist, V3ARGS(hits[i].hit_normal), hits[i].hit_vpriv[X] > 0 ? "exit" : "entrance"); - } -#endif /* if first hit is an exit, it is likely due to the "piece" for * the corresponding entrance not being processed (this is OK, but Modified: brlcad/trunk/src/librt/primitives/brep/brep.cpp =================================================================== --- brlcad/trunk/src/librt/primitives/brep/brep.cpp 2009-12-02 16:25:14 UTC (rev 36760) +++ brlcad/trunk/src/librt/primitives/brep/brep.cpp 2009-12-02 16:26:21 UTC (rev 36761) @@ -1448,32 +1448,6 @@ } -#if 0 -HIDDEN void -opposite(const BBNode* sbv, pt2d_t uv) -{ - if (uv[1] > sbv->m_v.Mid()) { - // quadrant I or II - uv[1] = sbv->m_v.Min(); - if (uv[0] > sbv->m_u.Mid()) - // quad I - uv[0] = sbv->m_u.Min(); - else - // quad II - uv[0] = sbv->m_u.Max(); - } else { - uv[1] = sbv->m_v.Max(); - if (uv[0] > sbv->m_u.Mid()) - uv[0] = sbv->m_u.Min(); - else - uv[0] = sbv->m_u.Max(); - } -} - - -#endif - - typedef std::pair<int, int> ip_t; typedef std::list<ip_t> MissList; Modified: brlcad/trunk/src/librt/primitives/bspline/bspline.cpp =================================================================== --- brlcad/trunk/src/librt/primitives/bspline/bspline.cpp 2009-12-02 16:25:14 UTC (rev 36760) +++ brlcad/trunk/src/librt/primitives/bspline/bspline.cpp 2009-12-02 16:26:21 UTC (rev 36761) @@ -184,15 +184,7 @@ register struct nurb_hit *h_ptr; BN_CK_TOL(tol); -#if 0 - /* Shouldn't be discarded, because shootray moves start pt around */ - if (hit->hit_dist < .001) { - bu_free((char *) hit, "internal_add_hit: hit"); - return; - } -#endif - /* If this is the only one, nothing to check against */ if (head->next == (struct nurb_hit *) 0) { head->next = hit; Modified: brlcad/trunk/src/librt/primitives/bspline/nurb_tess.c =================================================================== --- brlcad/trunk/src/librt/primitives/bspline/nurb_tess.c 2009-12-02 16:25:14 UTC (rev 36760) +++ brlcad/trunk/src/librt/primitives/bspline/nurb_tess.c 2009-12-02 16:26:21 UTC (rev 36761) @@ -184,21 +184,6 @@ d1 = rt_nurb_c_diff( crv ); d2 = rt_nurb_c_diff( d1 ); -#if 0 - pt = d1->ctl_points; - for ( i=0; i<d1->c_size; i++ ) - { - for ( j=0; j<num_coords; j++ ) - { - fastf_t abs_val; - - abs_val = *pt > 0.0 ? *pt : -(*pt); - if ( abs_val > der1[j] ) - der1[j] = abs_val; - pt++; - } - } -#endif pt = d2->ctl_points; for ( i=0; i<d2->c_size; i++ ) { Modified: brlcad/trunk/src/librt/primitives/ebm/ebm.c =================================================================== --- brlcad/trunk/src/librt/primitives/ebm/ebm.c 2009-12-02 16:25:14 UTC (rev 36760) +++ brlcad/trunk/src/librt/primitives/ebm/ebm.c 2009-12-02 16:26:21 UTC (rev 36761) @@ -980,27 +980,12 @@ MAT4X3PNT(ideal_ray.r_pt, ebmp->ebm_mat, rp->r_pt); MAT4X3VEC(ideal_ray.r_dir, ebmp->ebm_mat, rp->r_dir); -#if 0 - bu_log("%g %g %g %g %g %g\n", - ideal_ray.r_pt[X], ideal_ray.r_pt[Y], ideal_ray.r_pt[Z], - ideal_ray.r_dir[X], ideal_ray.r_dir[Y], ideal_ray.r_dir[Z]); -#endif if (rt_ebm_dda(&ideal_ray, stp, ap, &myhead) <= 0) return(0); VSET(norm, 0, 0, -1); /* letters grow in +z, which is "inside" the halfspace */ i = rt_seg_planeclip(seghead, &myhead, norm, 0.0, ebmp->ebm_i.tallness, &ideal_ray, ap); -#if 0 - if (segp) { - vect_t a, b; - /* Plot where WE think the ray goes */ - VJOIN1(a, rp->r_pt, segp->seg_in.hit_dist, rp->r_dir); - VJOIN1(b, rp->r_pt, segp->seg_out.hit_dist, rp->r_dir); - pl_color(stdout, 0, 0, 255); /* B */ - pdv_3line(stdout, a, b); - } -#endif return(i); } Modified: brlcad/trunk/src/librt/primitives/half/half.c =================================================================== --- brlcad/trunk/src/librt/primitives/half/half.c 2009-12-02 16:25:14 UTC (rev 36760) +++ brlcad/trunk/src/librt/primitives/half/half.c 2009-12-02 16:26:21 UTC (rev 36761) @@ -772,13 +772,6 @@ rt_hlf_tess(struct nmgregion **r, struct model *m, struct rt_db_internal *ip, const struct rt_tess_tol *ttol, const struct bn_tol *tol) { struct rt_half_internal *vip; -#if 0 - register int i; - struct shell *s; - struct vertex **verts; /* dynamic array of pointers */ - struct vertex ***vertp; /* dynam array of ptrs to pointers */ - struct faceuse *fu; -#endif RT_CK_DB_INTERNAL(ip); vip = (struct rt_half_internal *)ip->idb_ptr; Modified: brlcad/trunk/src/librt/primitives/hf/hf.c =================================================================== --- brlcad/trunk/src/librt/primitives/hf/hf.c 2009-12-02 16:25:14 UTC (rev 36760) +++ brlcad/trunk/src/librt/primitives/hf/hf.c 2009-12-02 16:26:21 UTC (rev 36761) @@ -691,10 +691,6 @@ left *= hf->hf_file2mm; right *= hf->hf_file2mm; answer = (right-left)/xright*xx+left; -#if 0 - bu_log("inout: loc[Z]=%g, answer=%g, left=%g, right=%g, xright=%g, xx=%g\n", - loc[Z], answer, left, right, xright, xx); -#endif if (loc[Z]-SQRT_SMALL_FASTF < answer) { (*hp)->hit_magic = RT_HIT_MAGIC; @@ -1527,16 +1523,9 @@ fastf_t r = 0; VSUB2(delta, hitp->hit_point, hf->hf_V); -#if 0 - VUNITIZE(delta); - uvp->uv_u = VDOT(delta, hf->hf_X); - uvp->uv_v = VDOT(delta, hf->hf_Y); - r = ap->a_rbeam + ap->a_diverge * hitp->hit_dist; -#else uvp->uv_u = delta[X] / hf->hf_Xlen; uvp->uv_v = delta[Y] / hf->hf_Ylen; r = 0.0; -#endif if (uvp->uv_u < 0.0) uvp->uv_u=0.0; if (uvp->uv_u > 1.0) uvp->uv_u=1.0; if (uvp->uv_v < 0.0) uvp->uv_v=0.0; Modified: brlcad/trunk/src/librt/primitives/nmg/nmg_tri.c =================================================================== --- brlcad/trunk/src/librt/primitives/nmg/nmg_tri.c 2009-12-02 16:25:14 UTC (rev 36760) +++ brlcad/trunk/src/librt/primitives/nmg/nmg_tri.c 2009-12-02 16:26:21 UTC (rev 36761) @@ -1002,12 +1002,6 @@ NMG_CK_TRAP(tp); if (tp->bot) { -#if 0 - if (rt_g.NMG_debug & DEBUG_TRI) { - print_trap(tp, tbl2d); - bu_log("Completed... Skipping\n"); - } -#endif continue; } else { if (rt_g.NMG_debug & DEBUG_TRI) @@ -2443,12 +2437,6 @@ eu_pnext = BU_LIST_PNEXT_CIRC(edgeuse, &eu->l); -#if 0 - if (rt_g.NMG_debug & DEBUG_TRI) - bu_log("eu vert @ %g %g %g\n", - V3ARGS(eu->vu_p->v_p->vg_p->coord)); - -#endif if (! (p=find_pt2d(tbl2d, eu->vu_p))) bu_bomb("didn't find vertexuse in list!\n"); Modified: brlcad/trunk/src/librt/primitives/tgc/tgc.c =================================================================== --- brlcad/trunk/src/librt/primitives/tgc/tgc.c 2009-12-02 16:25:14 UTC (rev 36760) +++ brlcad/trunk/src/librt/primitives/tgc/tgc.c 2009-12-02 16:26:21 UTC (rev 36761) @@ -1216,9 +1216,6 @@ * whether this lies within the governing ellipse. */ if (dprime[Z] == 0.0) { -#if 0 - bu_log("tgc: dprime[Z] = 0!\n"); -#endif RT_TGC_SEG_MISS(segp[ix]); continue; } @@ -1243,9 +1240,6 @@ nflag = TGC_NORM_TOP; /* copy normal */ } else { /* intersection apparently invalid */ -#if 0 - bu_log("tgc(%s): only 1 intersect\n", stp[ix]->st_name); -#endif RT_TGC_SEG_MISS(segp[ix]); continue; } Modified: brlcad/trunk/src/librt/primitives/tor/tor.c =================================================================== --- brlcad/trunk/src/librt/primitives/tor/tor.c 2009-12-02 16:25:14 UTC (rev 36760) +++ brlcad/trunk/src/librt/primitives/tor/tor.c 2009-12-02 16:26:21 UTC (rev 36761) @@ -703,10 +703,6 @@ if (num_zero == 0) { SEG_MISS(segp[i]); /* MISS */ } else if (num_zero != 2 && num_zero != 4) { -#if 0 - bu_log("rt_tor_shot: reduced 4 to %d roots\n", i); - bn_pr_roots(stp->st_name, val, 4); -#endif SEG_MISS(segp[i]); /* MISS */ } } @@ -768,19 +764,6 @@ /* Set aside vector for rt_tor_norm() later */ VJOIN1(segp[i].seg_in.hit_vpriv, pprime, C[i].cf[1], dprime); VJOIN1(segp[i].seg_out.hit_vpriv, pprime, C[i].cf[0], dprime); - -#if 0 - /* C[i].cf[3] is entry point */ - /* Attach second hit to segment chain */ - /* XXXX need convention for vectorizing doubly linked list */ - GET_SEG(seg2p, resp); - segp[i].seg_next = seg2p; - seg2p->seg_stp = stp[i]; - seg2p->seg_in.hit_dist = C[i].cf[3]*tor->tor_r1; - seg2p->seg_out.hit_dist = C[i].cf[2]*tor->tor_r1; - VJOIN1(seg2p->seg_in.hit_vpriv, pprime, C[i].cf[3], dprime); - VJOIN1(seg2p->seg_out.hit_vpriv, pprime, C[i].cf[2], dprime); -#endif } /* Free tmp space used */ Modified: brlcad/trunk/src/librt/raydebug.tcl =================================================================== --- brlcad/trunk/src/librt/raydebug.tcl 2009-12-02 16:25:14 UTC (rev 36760) +++ brlcad/trunk/src/librt/raydebug.tcl 2009-12-02 16:26:21 UTC (rev 36761) @@ -35,7 +35,7 @@ # ### # demo.tcl -# setenv LD_LIBRARY_PATH /usr/lib/X11:/usr/X11/lib +# setenv LD_LIBRARY_PATH /usr/lib/X11:/usr/X11/lib # # A GUI to drive MGED through a series of plot files. # -Mike Muuss, ARL, July 97. @@ -69,6 +69,7 @@ exit } + proc do_advance {} { global num @@ -76,6 +77,7 @@ send mged "Z; overlay cell$num.pl" } + proc do_reverse {} { global num @@ -83,6 +85,7 @@ send mged "Z; overlay cell$num.pl" } + # Local Variables: # mode: Tcl # tab-width: 8 Modified: brlcad/trunk/src/librt/regionfix.c =================================================================== --- brlcad/trunk/src/librt/regionfix.c 2009-12-02 16:25:14 UTC (rev 36760) +++ brlcad/trunk/src/librt/regionfix.c 2009-12-02 16:26:21 UTC (rev 36761) @@ -52,16 +52,16 @@ void rt_regionfix(struct rt_i *rtip) { - FILE *fp; - char *file; - char *line; - char *tabp; - int linenum = 0; - register struct region *rp; - int ret; - int oldid; - int newid; - struct bu_vls name; + FILE *fp; + char *file; + char *line; + char *tabp; + int linenum = 0; + register struct region *rp; + int ret; + int oldid; + int newid; + struct bu_vls name; RT_CK_RTI(rtip); @@ -71,53 +71,53 @@ */ bu_vls_init(&name); file = rtip->rti_region_fix_file; - if ( file == (char *)NULL ) { - bu_vls_strcpy( &name, rtip->rti_dbip->dbi_filename ); - if ( (tabp = strrchr( bu_vls_addr(&name), '.' )) != NULL ) { + if (file == (char *)NULL) { + bu_vls_strcpy(&name, rtip->rti_dbip->dbi_filename); + if ((tabp = strrchr(bu_vls_addr(&name), '.')) != NULL) { /* Chop off "." and suffix */ - bu_vls_trunc( &name, tabp-bu_vls_addr(&name) ); + bu_vls_trunc(&name, tabp-bu_vls_addr(&name)); } - bu_vls_strcat( &name, ".regexp" ); + bu_vls_strcat(&name, ".regexp"); file = bu_vls_addr(&name); } - fp = fopen( file, "rb" ); - if ( fp == NULL ) { - if ( rtip->rti_region_fix_file ) perror(file); + fp = fopen(file, "rb"); + if (fp == NULL) { + if (rtip->rti_region_fix_file) perror(file); bu_vls_free(&name); return; } bu_log("librt/rt_regionfix(%s): Modifying instanced region-ids.\n", file); - while ( (line = rt_read_cmd( fp )) != (char *) 0 ) { - regex_t re_space; + while ((line = rt_read_cmd(fp)) != (char *) 0) { + regex_t re_space; linenum++; /* For now, establish a simple format: * regexp TAB [more_white_space] formula SEMICOLON */ - if ( (tabp = strchr( line, '\t' )) == (char *)0 ) { - bu_log("%s: missing TAB on line %d:\n%s\n", file, linenum, line ); + if ((tabp = strchr(line, '\t')) == (char *)0) { + bu_log("%s: missing TAB on line %d:\n%s\n", file, linenum, line); continue; /* just ignore it */ } *tabp++ = '\0'; - while ( *tabp && isspace( *tabp ) ) tabp++; - if ( (ret = regcomp(&re_space, line, 0)) != 0 ) { - bu_log("%s: line %d, regcomp error '%d'\n", file, line, ret ); + while (*tabp && isspace(*tabp)) tabp++; + if ((ret = regcomp(&re_space, line, 0)) != 0) { + bu_log("%s: line %d, regcomp error '%d'\n", file, line, ret); continue; /* just ignore it */ } - for ( BU_LIST_FOR( rp, region, &(rtip->HeadRegion) ) ) { + for (BU_LIST_FOR(rp, region, &(rtip->HeadRegion))) { ret = regexec(&re_space, (char *)rp->reg_name, 0, 0, 0); - if (RT_G_DEBUG&DEBUG_INSTANCE) { + if (RT_G_DEBUG&DEBUG_INSTANCE) { bu_log("'%s' %s '%s'\n", line, ret==1 ? "==" : "!=", rp->reg_name); } - if ( (ret) == 0 ) + if ((ret) == 0) continue; /* didn't match */ - if ( ret == -1 ) { + if (ret == -1) { bu_log("%s: line %d, invalid regular expression\n", file, linenum); break; /* on to next RE */ } @@ -133,28 +133,29 @@ * current instance (use) count. */ oldid = rp->reg_regionid; - if ( strcmp( tabp, "+uses" ) == 0 ) { + if (strcmp(tabp, "+uses") == 0) { newid = oldid + rp->reg_instnum; - } else if ( *tabp == '+' ) { - newid = oldid + atoi( tabp+1 ); + } else if (*tabp == '+') { + newid = oldid + atoi(tabp+1); } else { - newid = atoi( tabp ); - if ( newid == 0 ) bu_log("%s, line %d Warning: new id = 0\n", file, linenum ); + newid = atoi(tabp); + if (newid == 0) bu_log("%s, line %d Warning: new id = 0\n", file, linenum); } - if (RT_G_DEBUG&DEBUG_INSTANCE) { + if (RT_G_DEBUG&DEBUG_INSTANCE) { bu_log("%s instance %d: region id changed from %d to %d\n", rp->reg_name, rp->reg_instnum, - oldid, newid ); + oldid, newid); } rp->reg_regionid = newid; } regfree(&re_space); - bu_free( line, "reg_expr line"); + bu_free(line, "reg_expr line"); } - fclose( fp ); + fclose(fp); bu_vls_free(&name); } + /* * Local Variables: * mode: C Modified: brlcad/trunk/src/librt/roots.c =================================================================== --- brlcad/trunk/src/librt/roots.c 2009-12-02 16:25:14 UTC (rev 36760) +++ brlcad/trunk/src/librt/roots.c 2009-12-02 16:26:21 UTC (rev 36761) @@ -47,42 +47,42 @@ * Evaluates p(Z), p'(Z), and p''(Z) for any Z (real or complex). * Given an equation of the form: * - * p(Z) = a0*Z^n + a1*Z^(n-1) +... an != 0, + * p(Z) = a0*Z^n + a1*Z^(n-1) +... an != 0, * * the function value and derivatives needed for the iterations can be * computed by synthetic division using the formulas * - * p(Z) = bn, p'(Z) = c(n-1), p''(Z) = d(n-2), + * p(Z) = bn, p'(Z) = c(n-1), p''(Z) = d(n-2), * * where * - * b0 = a0, bi = b(i-1)*Z + ai, i = 1, 2,...n - * c0 = b0, ci = c(i-1)*Z + bi, i = 1, 2,...n-1 - * d0 = c0, di = d(i-1)*Z + ci, i = 1, 2,...n-2 + * b0 = a0, bi = b(i-1)*Z + ai, i = 1, 2, ...n + * c0 = b0, ci = c(i-1)*Z + bi, i = 1, 2, ...n-1 + * d0 = c0, di = d(i-1)*Z + ci, i = 1, 2, ...n-2 */ void rt_poly_eval_w_2derivatives(register bn_complex_t *cZ, register bn_poly_t *eqn, register bn_complex_t *b, register bn_complex_t *c, register bn_complex_t *d) - /* input */ - /* input */ - /* outputs */ +/* input */ +/* input */ +/* outputs */ { - register int n; - register int m; + register int n; + register int m; bn_cx_cons(b, eqn->cf[0], 0.0); *c = *b; *d = *c; - for ( n=1; ( m = eqn->dgr - n ) >= 0; ++n) { - bn_cx_mul( b, cZ ); + for (n=1; (m = eqn->dgr - n) >= 0; ++n) { + bn_cx_mul(b, cZ); b->re += eqn->cf[n]; - if ( m > 0 ) { - bn_cx_mul( c, cZ ); - bn_cx_add( c, b ); + if (m > 0) { + bn_cx_mul(c, cZ); + bn_cx_add(c, b); } - if ( m > 1 ) { - bn_cx_mul( d, cZ ); - bn_cx_add( d, c ); + if (m > 1) { + bn_cx_mul(d, cZ); + bn_cx_add(d, c); } } } @@ -91,13 +91,13 @@ /** * R T _ P O L Y _ F I N D R O O T * - * Calculates one root of a polynomial ( p(Z) ) using Laguerre's + * Calculates one root of a polynomial (p(Z)) using Laguerre's * method. This is an iterative technique which has very good global * convergence properties. The formulas for this method are * * n * p(Z) - * newZ = Z - ----------------------- , - * p'(Z) +- sqrt( H(Z) ) + * newZ = Z - ----------------------- , + * p'(Z) +- sqrt(H(Z)) * * where * H(Z) = (n-1) [ (n-1)(p'(Z))^2 - n p(Z)p''(Z) ], @@ -107,46 +107,46 @@ */ int rt_poly_findroot(register bn_poly_t *eqn, /* polynomial */ - register bn_complex_t *nxZ, /* initial guess for root */ + register bn_complex_t *nxZ, /* initial guess for root */ const char *str) { - bn_complex_t p0, p1, p2; /* evaluated polynomial+derivatives */ - bn_complex_t p1_H; /* p1 - H, temporary */ - bn_complex_t cZ, cH; /* 'Z' and H(Z) in comment */ - bn_complex_t T; /* temporary for making H */ - fastf_t diff=0.0; /* test values for convergence */ - fastf_t b=0.0; /* floating temps */ - int n; - register int i; /* iteration counter */ + bn_complex_t p0, p1, p2; /* evaluated polynomial+derivatives */ + bn_complex_t p1_H; /* p1 - H, temporary */ + bn_complex_t cZ, cH; /* 'Z' and H(Z) in comment */ + bn_complex_t T; /* temporary for making H */ + fastf_t diff=0.0; /* test values for convergence */ + fastf_t b=0.0; /* floating temps */ + int n; + register int i; /* iteration counter */ - for ( i=0; i < 20; i++ ) { + for (i=0; i < 20; i++) { cZ = *nxZ; - rt_poly_eval_w_2derivatives( &cZ, eqn, &p0, &p1, &p2 ); + rt_poly_eval_w_2derivatives(&cZ, eqn, &p0, &p1, &p2); /* Compute H for Laguerre's method. */ n = eqn->dgr-1; - bn_cx_mul2( &cH, &p1, &p1 ); - bn_cx_scal( &cH, (double)(n*n) ); - bn_cx_mul2( &T, &p2, &p0 ); - bn_cx_scal( &T, (double)(eqn->dgr*n) ); - bn_cx_sub( &cH, &T ); + bn_cx_mul2(&cH, &p1, &p1); + bn_cx_scal(&cH, (double)(n*n)); + bn_cx_mul2(&T, &p2, &p0); + bn_cx_scal(&T, (double)(eqn->dgr*n)); + bn_cx_sub(&cH, &T); /* Calculate the next iteration for Laguerre's method. * Test to see whether addition or subtraction gives the * larger denominator for the next 'Z', and use the * appropriate value in the formula. */ - bn_cx_sqrt( &cH, &cH ); + bn_cx_sqrt(&cH, &cH); p1_H = p1; - bn_cx_sub( &p1_H, &cH ); - bn_cx_add( &p1, &cH ); /* p1 <== p1+H */ - bn_cx_scal( &p0, (double)(eqn->dgr) ); - if ( bn_cx_amplsq( &p1_H ) > bn_cx_amplsq( &p1 ) ) { - bn_cx_div( &p0, &p1_H); - bn_cx_sub( nxZ, &p0 ); + bn_cx_sub(&p1_H, &cH); + bn_cx_add(&p1, &cH); /* p1 <== p1+H */ + bn_cx_scal(&p0, (double)(eqn->dgr)); + if (bn_cx_amplsq(&p1_H) > bn_cx_amplsq(&p1)) { + bn_cx_div(&p0, &p1_H); + bn_cx_sub(nxZ, &p0); } else { - bn_cx_div( &p0, &p1 ); - bn_cx_sub( nxZ, &p0 ); + bn_cx_div(&p0, &p1); + bn_cx_sub(nxZ, &p0); } /* Use proportional convergence test to allow very small @@ -160,13 +160,13 @@ * SGI XNS IRIS 3.5 compiler fails if following 2 assignments * are imbedded in the IF statement, as before. */ - b = bn_cx_amplsq( nxZ ); - diff = bn_cx_amplsq( &p0 ); - if ( b < diff ) + b = bn_cx_amplsq(nxZ); + diff = bn_cx_amplsq(&p0); + if (b < diff) continue; - if ( (b-diff) == b ) + if ((b-diff) == b) return(i); /* OK -- can't do better */ - if ( diff > (b - diff)*1.0e-5 ) + if (diff > (b - diff)*1.0e-5) continue; return(i); /* OK */ } @@ -187,31 +187,31 @@ * of this polynomial. * * Returns - - * 0 all roots are true zeros - * 1 at least one "root[]" entry is not a true zero + * 0 all roots are true zeros + * 1 at least one "root[]" entry is not a true zero * - * Given an equation of the form + * Given an equation of the form * - * p(Z) = a0*Z^n + a1*Z^(n-1) +... an != 0, + * p(Z) = a0*Z^n + a1*Z^(n-1) +... an != 0, * - * the function value can be computed using the formula + * the function value can be computed using the formula * - * p(Z) = bn, where + * p(Z) = bn, where * - * b0 = a0, bi = b(i-1)*Z + ai, i = 1, 2,...n + * b0 = a0, bi = b(i-1)*Z + ai, i = 1, 2, ...n */ int rt_poly_checkroots(register bn_poly_t *eqn, bn_complex_t *roots, register int nroots) { - register fastf_t er, ei; /* "epoly" */ - register fastf_t zr, zi; /* Z value to evaluate at */ - register int n; - int m; + register fastf_t er, ei; /* "epoly" */ + register fastf_t zr, zi; /* Z value to evaluate at */ + register int n; + int m; - for ( m=0; m < nroots; ++m ) { + for (m=0; m < nroots; ++m) { /* Select value of Z to evaluate at */ - zr = bn_cx_real( &roots[m] ); - zi = bn_cx_imag( &roots[m] ); + zr = bn_cx_real(&roots[m]); + zi = bn_cx_imag(&roots[m]); /* Initialize */ er = eqn->cf[0]; @@ -222,14 +222,14 @@ er = er*zr + eqn->cf[1]; /* Remaining steps */ - for ( n=2; n <= eqn->dgr; ++n) { - register fastf_t tr, ti; /* temps */ + for (n=2; n <= eqn->dgr; ++n) { + register fastf_t tr, ti; /* temps */ tr = er*zr - ei*zi + eqn->cf[n]; ti = er*zi + ei*zr; er = tr; ei = ti; } - if ( fabs( er ) > 1.0e-5 || fabs( ei ) > 1.0e-5 ) + if (fabs(er) > 1.0e-5 || fabs(ei) > 1.0e-5) return 1; /* FAIL */ } /* Evaluating polynomial for all Z values gives zero */ @@ -252,17 +252,17 @@ * root, Quadratic for a complex root (since they come in con- * jugate pairs). */ - if ( NEAR_ZERO( root->im, SMALL) ) { - /* root is real */ + if (NEAR_ZERO(root->im, SMALL)) { + /* root is real */ div.dgr = 1; div.cf[0] = 1; div.cf[1] = - root->re; } else { - /* root is complex */ + /* root is complex */ div.dgr = 2; div.cf[0] = 1; div.cf[1] = -2 * root->re; - div.cf[2] = bn_cx_amplsq( root ); + div.cf[2] = bn_cx_amplsq(root); } /* Use synthetic division to find the quotient (new polynomial) @@ -285,21 +285,21 @@ * algorithm will also be required. */ int -rt_poly_roots(register bn_poly_t *eqn, /* equation to be solved */ - register bn_complex_t roots[], /* space to put roots found */ +rt_poly_roots(register bn_poly_t *eqn, /* equation to be solved */ + register bn_complex_t roots[], /* space to put roots found */ const char *name) /* name of the primitive being checked */ { - register int n; /* number of roots found */ - fastf_t factor; /* scaling factor for copy */ + register int n; /* number of roots found */ + fastf_t factor; /* scaling factor for copy */ /* Remove leading coefficients which are too close to zero, * to prevent the polynomial factoring from blowing up, below. */ - while ( NEAR_ZERO( eqn->cf[0], SMALL ) ) { - for ( n=0; n <= eqn->dgr; n++ ) { + while (NEAR_ZERO(eqn->cf[0], SMALL)) { + for (n=0; n <= eqn->dgr; n++) { eqn->cf[n] = eqn->cf[n+1]; } - if ( --eqn->dgr <= 0 ) + if (--eqn->dgr <= 0) return 0; } @@ -307,42 +307,42 @@ * for ease of handling. */ factor = 1.0 / eqn->cf[0]; - (void) bn_poly_scale( eqn, factor ); + (void) bn_poly_scale(eqn, factor); n = 0; /* Number of roots found */ /* A trailing coefficient of zero indicates that zero * is a root of the equation. */ - while ( NEAR_ZERO( eqn->cf[eqn->dgr], SMALL ) ) { + while (NEAR_ZERO(eqn->cf[eqn->dgr], SMALL)) { roots[n].re = roots[n].im = 0.0; --eqn->dgr; ++n; } - while ( eqn->dgr > 2 ) { - if ( eqn->dgr == 4 ) { - if ( bn_poly_quartic_roots(&roots[n], eqn) ) { - if ( rt_poly_checkroots( eqn, &roots[n], 4 ) == 0 ) { - return( n+4 ); + while (eqn->dgr > 2) { + if (eqn->dgr == 4) { + if (bn_poly_quartic_roots(&roots[n], eqn)) { + if (rt_poly_checkroots(eqn, &roots[n], 4) == 0) { + return(n+4); } } - } else if ( eqn->dgr == 3 ) { - if ( bn_poly_cubic_roots( &roots[n], eqn ) ) { - if ( rt_poly_checkroots( eqn, &roots[n], 3 ) == 0 ) { - return ( n+3 ); + } else if (eqn->dgr == 3) { + if (bn_poly_cubic_roots(&roots[n], eqn)) { + if (rt_poly_checkroots(eqn, &roots[n], 3) == 0) { + return (n+3); } } } /* - * Set initial guess for root to almost zero. - * This method requires a small nudge off the real axis. + * Set initial guess for root to almost zero. + * This method requires a small nudge off the real axis. */ - bn_cx_cons( &roots[n], 0.0, SMALL ); - if ( (rt_poly_findroot( eqn, &roots[n], name )) < 0 ) + bn_cx_cons(&roots[n], 0.0, SMALL); + if ((rt_poly_findroot(eqn, &roots[n], name)) < 0) return(n); /* return those we found, anyways */ - if ( fabs(roots[n].im) > 1.0e-5* fabs(roots[n].re) ) { + if (fabs(roots[n].im) > 1.0e-5* fabs(roots[n].re)) { /* If root is complex, its complex conjugate is * also a root since complex roots come in con- * jugate pairs when all coefficients are real. @@ -351,22 +351,22 @@ roots[n] = roots[n-1]; bn_cx_conj(&roots[n]); } else { - /* Change 'practically real' to real */ + /* Change 'practically real' to real */ roots[n].im = 0.0; } - rt_poly_deflate( eqn, &roots[n] ); + rt_poly_deflate(eqn, &roots[n]); ++n; } /* For polynomials of lower degree, iterative techniques * are an inefficient way to find the roots. */ - if ( eqn->dgr == 1 ) { + if (eqn->dgr == 1) { roots[n].re = -(eqn->cf[1]); roots[n].im = 0.0; ++n; - } else if ( eqn->dgr == 2 ) { + } else if (eqn->dgr == 2) { bn_poly_quadratic_roots(&roots[n], eqn); n += 2; } Modified: brlcad/trunk/src/librt/shoot.c =================================================================== --- brlcad/trunk/src/librt/shoot.c 2009-12-02 16:25:14 UTC (rev 36760) +++ brlcad/trunk/src/librt/shoot.c 2009-12-02 16:26:21 UTC (rev 36761) @@ -54,15 +54,15 @@ #include "plot3.h" -#define V3PT_DEPARTING_RPP(_step, _lo, _hi, _pt ) \ - PT_DEPARTING_RPP(_step, _lo, _hi, (_pt)[X], (_pt)[Y], (_pt)[Z] ) -#define PT_DEPARTING_RPP(_step, _lo, _hi, _px, _py, _pz ) \ - ( ((_step)[X] <= 0 && (_px) < (_lo)[X]) || \ - ((_step)[X] >= 0 && (_px) > (_hi)[X]) || \ - ((_step)[Y] <= 0 && (_py) < (_lo)[Y]) || \ - ((_step)[Y] >= 0 && (_py) > (_hi)[Y]) || \ - ((_step)[Z] <= 0 && (_pz) < (_lo)[Z]) || \ - ((_step)[Z] >= 0 && (_pz) > (_hi)[Z]) ) +#define V3PT_DEPARTING_RPP(_step, _lo, _hi, _pt) \ + PT_DEPARTING_RPP(_step, _lo, _hi, (_pt)[X], (_pt)[Y], (_pt)[Z]) +#define PT_DEPARTING_RPP(_step, _lo, _hi, _px, _py, _pz) \ + (((_step)[X] <= 0 && (_px) < (_lo)[X]) || \ + ((_step)[X] >= 0 && (_px) > (_hi)[X]) || \ + ((_step)[Y] <= 0 && (_py) < (_lo)[Y]) || \ + ((_step)[Y] >= 0 && (_py) > (_hi)[Y]) || \ + ((_step)[Z] <= 0 && (_pz) < (_lo)[Z]) || \ + ((_step)[Z] >= 0 && (_pz) > (_hi)[Z])) /** * R T _ R E S _ P I E C E S _ I N I T @@ -73,25 +73,25 @@ void rt_res_pieces_init(struct resource *resp, struct rt_i *rtip) { - struct rt_piecestate *psptab; - struct rt_piecestate *psp; - struct soltab *stp; + struct rt_piece... [truncated message content] |
From: <eri...@us...> - 2009-12-18 20:34:50
|
Revision: 36946 http://brlcad.svn.sourceforge.net/brlcad/?rev=36946&view=rev Author: erikgreenwald Date: 2009-12-18 20:34:39 +0000 (Fri, 18 Dec 2009) Log Message: ----------- break metaball tesselation out into it's own file Modified Paths: -------------- brlcad/trunk/src/librt/Makefile.am brlcad/trunk/src/librt/primitives/metaball/metaball.c Added Paths: ----------- brlcad/trunk/src/librt/primitives/metaball/metaball.h brlcad/trunk/src/librt/primitives/metaball/metaball_tri.c Modified: brlcad/trunk/src/librt/Makefile.am =================================================================== --- brlcad/trunk/src/librt/Makefile.am 2009-12-18 16:38:27 UTC (rev 36945) +++ brlcad/trunk/src/librt/Makefile.am 2009-12-18 20:34:39 UTC (rev 36946) @@ -149,6 +149,7 @@ primitives/hyp/hyp_brep.cpp \ primitives/hyp/hyp_mirror.c \ primitives/metaball/metaball.c \ + primitives/metaball/metaball_tri.c \ primitives/mirror.c \ primitives/nmg/nmg.c \ primitives/nmg/nmg_bool.c \ @@ -246,6 +247,7 @@ noinst_HEADERS = \ primitives/fixpt.h \ primitives/brep/brep_debug.h \ + primitives/metaball/metaball.h \ primitives/revolve/revolve.h \ primitives/xxx/xxx.h Modified: brlcad/trunk/src/librt/primitives/metaball/metaball.c =================================================================== --- brlcad/trunk/src/librt/primitives/metaball/metaball.c 2009-12-18 16:38:27 UTC (rev 36945) +++ brlcad/trunk/src/librt/primitives/metaball/metaball.c 2009-12-18 20:34:39 UTC (rev 36946) @@ -60,6 +60,7 @@ #include "nurb.h" #include "wdb.h" +#include "metaball.h" #define SQ(a) ((a)*(a)) @@ -155,7 +156,7 @@ } -static void +void rt_metaball_set_bbox(point_t center, fastf_t radius, point_t *min, point_t *max) { VSET(*min, center[X] - radius, center[Y] - radius, center[Z] - radius); @@ -549,87 +550,7 @@ return 0; } - -static int bitcount(unsigned char w) { if (w==0) return 0; return bitcount(w>>1) + w|1; } - /** - * R T _ M E T A B A L L _ T E S S - * - * Tessellate a metaball. - */ -int -rt_metaball_tess(struct nmgregion **r, struct model *m, struct rt_db_internal *ip, const struct rt_tess_tol *ttol, const struct bn_tol *tol) -{ - struct rt_metaball_internal *mb; - fastf_t mtol, radius; - point_t center, min, max; - fastf_t i, j, k, finalstep = +INFINITY; - int meh; - struct bu_vls times; - struct wdb_metaballpt *mbpt; - - RT_CK_DB_INTERNAL(ip); - mb = (struct rt_metaball_internal *)ip->idb_ptr; - RT_METABALL_CK_MAGIC(mb); - - bu_vls_init(×); - rt_prep_timer(); - - /* since this geometry isn't necessarily prepped, we have to figure out the - * finalstep and bounding box manually. */ - for (BU_LIST_FOR(mbpt, wdb_metaballpt, &mb->metaball_ctrl_head)) - V_MIN(finalstep, mbpt->fldstr); - finalstep /= (fastf_t)1e5; - - radius = rt_metaball_get_bounding_sphere(¢er, mb->threshold, mb); - rt_metaball_set_bbox(center, radius, &min, &max); - - /* TODO: get better sampling tolerance, unless this is "good enough" */ - mtol = ttol->abs; - V_MAX(mtol, ttol->rel * radius); - V_MAX(mtol, tol->dist); - - /* the incredibly na\xEFve approach. Time could be cut in half by simply - * caching 4 point values, more by actually marching or doing active - * refinement. This is the simplest pattern for now. - */ - for (i = min[X]; i<max[X]; i+=mtol) - for (j = min[Y]; j<max[Y]; j+=mtol) - for (k = min[Z]; k<max[Z]; k+=mtol) { - point_t p; - int pv = 0; - int pvbc; /* bit count */ - VSET(p, i, j, k); pv |= rt_metaball_point_inside((const point_t *)&p, mb) << 0; - VSET(p, i, j, k+mtol); pv |= rt_metaball_point_inside((const point_t *)&p, mb) << 1; - VSET(p, i, j+mtol, k); pv |= rt_metaball_point_inside((const point_t *)&p, mb) << 2; - VSET(p, i, j+mtol, k+mtol); pv |= rt_metaball_point_inside((const point_t *)&p, mb) << 3; - VSET(p, i+mtol, j, k); pv |= rt_metaball_point_inside((const point_t *)&p, mb) << 4; - VSET(p, i+mtol, j, k+mtol); pv |= rt_metaball_point_inside((const point_t *)&p, mb) << 5; - VSET(p, i+mtol, j+mtol, k); pv |= rt_metaball_point_inside((const point_t *)&p, mb) << 6; - VSET(p, i+mtol, j+mtol, k+mtol); pv |= rt_metaball_point_inside((const point_t *)&p, mb) << 7; - pvbc = bitcount(pv); - if (pvbc==1) { - point_t a, b, mid; - VSET(a, i, j, k); - VSET(b, i, j, k+mtol); - rt_metaball_find_intersection(&mid, mb, (const point_t *)&a, (const point_t *)&*b, mtol, finalstep); - bu_log("Intersect between %f, %f, %f and %f, %f, %f is at %f, %f, %f\n", V3ARGS(a), V3ARGS(b), V3ARGS(mid)); - } - /* should the actual surface intersection be searched for, or - * just say the mid point is good enough? */ - /* needs to be stitched into a triangle style NMG. Then - * decimated, perhaps? */ - } - - rt_get_timer(×, NULL); - bu_log("metaball tesselate: %s\n", bu_vls_addr(×)); - - bu_log("ERROR: rt_metaball_tess called() is not implemented\n"); - return -1; -} - - -/** * R T _ M E T A B A L L _ I M P O R T 5 * * Import an metaball/sphere from the database format to the internal Added: brlcad/trunk/src/librt/primitives/metaball/metaball.h =================================================================== --- brlcad/trunk/src/librt/primitives/metaball/metaball.h (rev 0) +++ brlcad/trunk/src/librt/primitives/metaball/metaball.h 2009-12-18 20:34:39 UTC (rev 36946) @@ -0,0 +1,31 @@ +/* G _ M E T A B A L L . H + * BRL-CAD + * + * Copyright (c) 1985-2009 United States Government as represented by + * the U.S. Army Research Laboratory. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public License + * version 2.1 as published by the Free Software Foundation. + * + * This library is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this file; see the file named COPYING for more + * information. + */ + +void rt_metaball_set_bbox(point_t center, fastf_t radius, point_t *min, point_t *max); + +/* + * Local Variables: + * mode: C + * tab-width: 8 + * indent-tabs-mode: t + * c-file-style: "stroustrup" + * End: + * ex: shiftwidth=4 tabstop=8 + */ Property changes on: brlcad/trunk/src/librt/primitives/metaball/metaball.h ___________________________________________________________________ Added: svn:mime-type + text/plain Added: svn:eol-style + native Added: brlcad/trunk/src/librt/primitives/metaball/metaball_tri.c =================================================================== --- brlcad/trunk/src/librt/primitives/metaball/metaball_tri.c (rev 0) +++ brlcad/trunk/src/librt/primitives/metaball/metaball_tri.c 2009-12-18 20:34:39 UTC (rev 36946) @@ -0,0 +1,135 @@ +/* M B _ T R I . C + * BRL-CAD + * + * Copyright (c) 1985-2009 United States Government as represented by + * the U.S. Army Research Laboratory. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public License + * version 2.1 as published by the Free Software Foundation. + * + * This library is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this file; see the file named COPYING for more + * information. + */ +/** @addtogroup primitives */ +/** @{ */ +/** @file metaball.c + * + * Tesselation/facetization routines for the metaball primitive. + * + */ +/** @} */ + +#include "common.h" + +#include <stddef.h> +#include <stdio.h> +#include <string.h> +#include <math.h> +#include "bio.h" + +#include "vmath.h" +#include "db.h" +#include "nmg.h" +#include "rtgeom.h" +#include "raytrace.h" +#include "nurb.h" +#include "wdb.h" + +#include "metaball.h" + +static int bitcount(unsigned char w) { if (w==0) return 0; return bitcount(w>>1) + w|1; } + +/** + * R T _ M E T A B A L L _ T E S S + * + * Tessellate a metaball. + */ +int +rt_metaball_tess(struct nmgregion **r, struct model *m, struct rt_db_internal *ip, const struct rt_tess_tol *ttol, const struct bn_tol *tol) +{ + struct rt_metaball_internal *mb; + fastf_t mtol, radius; + point_t center, min, max; + fastf_t i, j, k, finalstep = +INFINITY; + int meh; + struct bu_vls times; + struct wdb_metaballpt *mbpt; + + RT_CK_DB_INTERNAL(ip); + mb = (struct rt_metaball_internal *)ip->idb_ptr; + RT_METABALL_CK_MAGIC(mb); + + bu_vls_init(×); + rt_prep_timer(); + + /* since this geometry isn't necessarily prepped, we have to figure out the + * finalstep and bounding box manually. */ + for (BU_LIST_FOR(mbpt, wdb_metaballpt, &mb->metaball_ctrl_head)) + V_MIN(finalstep, mbpt->fldstr); + finalstep /= (fastf_t)1e5; + + radius = rt_metaball_get_bounding_sphere(¢er, mb->threshold, mb); + rt_metaball_set_bbox(center, radius, &min, &max); + + /* TODO: get better sampling tolerance, unless this is "good enough" */ + mtol = ttol->abs; + V_MAX(mtol, ttol->rel * radius); + V_MAX(mtol, tol->dist); + + /* the incredibly na\xEFve approach. Time could be cut in half by simply + * caching 4 point values, more by actually marching or doing active + * refinement. This is the simplest pattern for now. + */ + for (i = min[X]; i<max[X]; i+=mtol) + for (j = min[Y]; j<max[Y]; j+=mtol) + for (k = min[Z]; k<max[Z]; k+=mtol) { + point_t p; + int pv = 0; + int pvbc; /* bit count */ + VSET(p, i, j, k); pv |= rt_metaball_point_inside((const point_t *)&p, mb) << 0; + VSET(p, i, j, k+mtol); pv |= rt_metaball_point_inside((const point_t *)&p, mb) << 1; + VSET(p, i, j+mtol, k); pv |= rt_metaball_point_inside((const point_t *)&p, mb) << 2; + VSET(p, i, j+mtol, k+mtol); pv |= rt_metaball_point_inside((const point_t *)&p, mb) << 3; + VSET(p, i+mtol, j, k); pv |= rt_metaball_point_inside((const point_t *)&p, mb) << 4; + VSET(p, i+mtol, j, k+mtol); pv |= rt_metaball_point_inside((const point_t *)&p, mb) << 5; + VSET(p, i+mtol, j+mtol, k); pv |= rt_metaball_point_inside((const point_t *)&p, mb) << 6; + VSET(p, i+mtol, j+mtol, k+mtol); pv |= rt_metaball_point_inside((const point_t *)&p, mb) << 7; + pvbc = bitcount(pv); + if (pvbc==1) { + point_t a, b, mid; + VSET(a, i, j, k); + VSET(b, i, j, k+mtol); + rt_metaball_find_intersection(&mid, mb, (const point_t *)&a, (const point_t *)&*b, mtol, finalstep); + bu_log("Intersect between %f, %f, %f and %f, %f, %f is at %f, %f, %f\n", V3ARGS(a), V3ARGS(b), V3ARGS(mid)); + } + /* should the actual surface intersection be searched for, or + * just say the mid point is good enough? */ + /* needs to be stitched into a triangle style NMG. Then + * decimated, perhaps? */ + } + + rt_get_timer(×, NULL); + bu_log("metaball tesselate: %s\n", bu_vls_addr(×)); + + bu_log("ERROR: rt_metaball_tess called() is not implemented\n"); + return -1; +} + + + +/* + * Local Variables: + * mode: C + * tab-width: 8 + * indent-tabs-mode: t + * c-file-style: "stroustrup" + * End: + * ex: shiftwidth=4 tabstop=8 + */ Property changes on: brlcad/trunk/src/librt/primitives/metaball/metaball_tri.c ___________________________________________________________________ Added: svn:mime-type + text/plain Added: svn:eol-style + native This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <eri...@us...> - 2009-12-18 21:57:20
|
Revision: 36948 http://brlcad.svn.sourceforge.net/brlcad/?rev=36948&view=rev Author: erikgreenwald Date: 2009-12-18 21:57:12 +0000 (Fri, 18 Dec 2009) Log Message: ----------- import marching cube vertex and edge tables from Cory Bourke's public domain demo. Modified Paths: -------------- brlcad/trunk/src/librt/Makefile.am brlcad/trunk/src/librt/primitives/metaball/metaball_tri.c Added Paths: ----------- brlcad/trunk/src/librt/primitives/metaball/mc_table.h Modified: brlcad/trunk/src/librt/Makefile.am =================================================================== --- brlcad/trunk/src/librt/Makefile.am 2009-12-18 20:42:07 UTC (rev 36947) +++ brlcad/trunk/src/librt/Makefile.am 2009-12-18 21:57:12 UTC (rev 36948) @@ -247,6 +247,7 @@ noinst_HEADERS = \ primitives/fixpt.h \ primitives/brep/brep_debug.h \ + primitives/metaball/mc_table.h \ primitives/metaball/metaball.h \ primitives/revolve/revolve.h \ primitives/xxx/xxx.h Added: brlcad/trunk/src/librt/primitives/metaball/mc_table.h =================================================================== --- brlcad/trunk/src/librt/primitives/metaball/mc_table.h (rev 0) +++ brlcad/trunk/src/librt/primitives/metaball/mc_table.h 2009-12-18 21:57:12 UTC (rev 36948) @@ -0,0 +1,299 @@ +/* + * Table data acquired from Paul Borke's page at + * http://local.wasp.uwa.edu.au/~pbourke/geometry/polygonise/ + * + * Asserts it's from Cory Gene Bloyde, who has provided "public domain" code + * including the tables. http://www.siafoo.net/snippet/100 + * + * Grid definition matches SIGGRAPH 1987 p 164 (original presentation of technique) + */ + +#ifndef MC_TABLE_H +#define MC_TABLE_H + +int mc_edges[256]={ +0x000,0x109,0x203,0x30a,0x406,0x50f,0x605,0x70c, +0x80c,0x905,0xa0f,0xb06,0xc0a,0xd03,0xe09,0xf00, +0x190,0x099,0x393,0x29a,0x596,0x49f,0x795,0x69c, +0x99c,0x895,0xb9f,0xa96,0xd9a,0xc93,0xf99,0xe90, +0x230,0x339,0x033,0x13a,0x636,0x73f,0x435,0x53c, +0xa3c,0xb35,0x83f,0x936,0xe3a,0xf33,0xc39,0xd30, +0x3a0,0x2a9,0x1a3,0x0aa,0x7a6,0x6af,0x5a5,0x4ac, +0xbac,0xaa5,0x9af,0x8a6,0xfaa,0xea3,0xda9,0xca0, +0x460,0x569,0x663,0x76a,0x066,0x16f,0x265,0x36c, +0xc6c,0xd65,0xe6f,0xf66,0x86a,0x963,0xa69,0xb60, +0x5f0,0x4f9,0x7f3,0x6fa,0x1f6,0x0ff,0x3f5,0x2fc, +0xdfc,0xcf5,0xfff,0xef6,0x9fa,0x8f3,0xbf9,0xaf0, +0x650,0x759,0x453,0x55a,0x256,0x35f,0x055,0x15c, +0xe5c,0xf55,0xc5f,0xd56,0xa5a,0xb53,0x859,0x950, +0x7c0,0x6c9,0x5c3,0x4ca,0x3c6,0x2cf,0x1c5,0x0cc, +0xfcc,0xec5,0xdcf,0xcc6,0xbca,0xac3,0x9c9,0x8c0, +0x8c0,0x9c9,0xac3,0xbca,0xcc6,0xdcf,0xec5,0xfcc, +0x0cc,0x1c5,0x2cf,0x3c6,0x4ca,0x5c3,0x6c9,0x7c0, +0x950,0x859,0xb53,0xa5a,0xd56,0xc5f,0xf55,0xe5c, +0x15c,0x055,0x35f,0x256,0x55a,0x453,0x759,0x650, +0xaf0,0xbf9,0x8f3,0x9fa,0xef6,0xfff,0xcf5,0xdfc, +0x2fc,0x3f5,0x0ff,0x1f6,0x6fa,0x7f3,0x4f9,0x5f0, +0xb60,0xa69,0x963,0x86a,0xf66,0xe6f,0xd65,0xc6c, +0x36c,0x265,0x16f,0x066,0x76a,0x663,0x569,0x460, +0xca0,0xda9,0xea3,0xfaa,0x8a6,0x9af,0xaa5,0xbac, +0x4ac,0x5a5,0x6af,0x7a6,0x0aa,0x1a3,0x2a9,0x3a0, +0xd30,0xc39,0xf33,0xe3a,0x936,0x83f,0xb35,0xa3c, +0x53c,0x435,0x73f,0x636,0x13a,0x033,0x339,0x230, +0xe90,0xf99,0xc93,0xd9a,0xa96,0xb9f,0x895,0x99c, +0x69c,0x795,0x49f,0x596,0x29a,0x393,0x099,0x190, +0xf00,0xe09,0xd03,0xc0a,0xb06,0xa0f,0x905,0x80c, +0x70c,0x605,0x50f,0x406,0x30a,0x203,0x109,0x000}; + + +int mc_tris[256][16] = +{{-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, +{0, 8, 3, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, +{0, 1, 9, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, +{1, 8, 3, 9, 8, 1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, +{1, 2, 10, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, +{0, 8, 3, 1, 2, 10, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, +{9, 2, 10, 0, 2, 9, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, +{2, 8, 3, 2, 10, 8, 10, 9, 8, -1, -1, -1, -1, -1, -1, -1}, +{3, 11, 2, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, +{0, 11, 2, 8, 11, 0, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, +{1, 9, 0, 2, 3, 11, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, +{1, 11, 2, 1, 9, 11, 9, 8, 11, -1, -1, -1, -1, -1, -1, -1}, +{3, 10, 1, 11, 10, 3, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, +{0, 10, 1, 0, 8, 10, 8, 11, 10, -1, -1, -1, -1, -1, -1, -1}, +{3, 9, 0, 3, 11, 9, 11, 10, 9, -1, -1, -1, -1, -1, -1, -1}, +{9, 8, 10, 10, 8, 11, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, +{4, 7, 8, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, +{4, 3, 0, 7, 3, 4, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, +{0, 1, 9, 8, 4, 7, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, +{4, 1, 9, 4, 7, 1, 7, 3, 1, -1, -1, -1, -1, -1, -1, -1}, +{1, 2, 10, 8, 4, 7, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, +{3, 4, 7, 3, 0, 4, 1, 2, 10, -1, -1, -1, -1, -1, -1, -1}, +{9, 2, 10, 9, 0, 2, 8, 4, 7, -1, -1, -1, -1, -1, -1, -1}, +{2, 10, 9, 2, 9, 7, 2, 7, 3, 7, 9, 4, -1, -1, -1, -1}, +{8, 4, 7, 3, 11, 2, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, +{11, 4, 7, 11, 2, 4, 2, 0, 4, -1, -1, -1, -1, -1, -1, -1}, +{9, 0, 1, 8, 4, 7, 2, 3, 11, -1, -1, -1, -1, -1, -1, -1}, +{4, 7, 11, 9, 4, 11, 9, 11, 2, 9, 2, 1, -1, -1, -1, -1}, +{3, 10, 1, 3, 11, 10, 7, 8, 4, -1, -1, -1, -1, -1, -1, -1}, +{1, 11, 10, 1, 4, 11, 1, 0, 4, 7, 11, 4, -1, -1, -1, -1}, +{4, 7, 8, 9, 0, 11, 9, 11, 10, 11, 0, 3, -1, -1, -1, -1}, +{4, 7, 11, 4, 11, 9, 9, 11, 10, -1, -1, -1, -1, -1, -1, -1}, +{9, 5, 4, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, +{9, 5, 4, 0, 8, 3, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, +{0, 5, 4, 1, 5, 0, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, +{8, 5, 4, 8, 3, 5, 3, 1, 5, -1, -1, -1, -1, -1, -1, -1}, +{1, 2, 10, 9, 5, 4, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, +{3, 0, 8, 1, 2, 10, 4, 9, 5, -1, -1, -1, -1, -1, -1, -1}, +{5, 2, 10, 5, 4, 2, 4, 0, 2, -1, -1, -1, -1, -1, -1, -1}, +{2, 10, 5, 3, 2, 5, 3, 5, 4, 3, 4, 8, -1, -1, -1, -1}, +{9, 5, 4, 2, 3, 11, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, +{0, 11, 2, 0, 8, 11, 4, 9, 5, -1, -1, -1, -1, -1, -1, -1}, +{0, 5, 4, 0, 1, 5, 2, 3, 11, -1, -1, -1, -1, -1, -1, -1}, +{2, 1, 5, 2, 5, 8, 2, 8, 11, 4, 8, 5, -1, -1, -1, -1}, +{10, 3, 11, 10, 1, 3, 9, 5, 4, -1, -1, -1, -1, -1, -1, -1}, +{4, 9, 5, 0, 8, 1, 8, 10, 1, 8, 11, 10, -1, -1, -1, -1}, +{5, 4, 0, 5, 0, 11, 5, 11, 10, 11, 0, 3, -1, -1, -1, -1}, +{5, 4, 8, 5, 8, 10, 10, 8, 11, -1, -1, -1, -1, -1, -1, -1}, +{9, 7, 8, 5, 7, 9, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, +{9, 3, 0, 9, 5, 3, 5, 7, 3, -1, -1, -1, -1, -1, -1, -1}, +{0, 7, 8, 0, 1, 7, 1, 5, 7, -1, -1, -1, -1, -1, -1, -1}, +{1, 5, 3, 3, 5, 7, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, +{9, 7, 8, 9, 5, 7, 10, 1, 2, -1, -1, -1, -1, -1, -1, -1}, +{10, 1, 2, 9, 5, 0, 5, 3, 0, 5, 7, 3, -1, -1, -1, -1}, +{8, 0, 2, 8, 2, 5, 8, 5, 7, 10, 5, 2, -1, -1, -1, -1}, +{2, 10, 5, 2, 5, 3, 3, 5, 7, -1, -1, -1, -1, -1, -1, -1}, +{7, 9, 5, 7, 8, 9, 3, 11, 2, -1, -1, -1, -1, -1, -1, -1}, +{9, 5, 7, 9, 7, 2, 9, 2, 0, 2, 7, 11, -1, -1, -1, -1}, +{2, 3, 11, 0, 1, 8, 1, 7, 8, 1, 5, 7, -1, -1, -1, -1}, +{11, 2, 1, 11, 1, 7, 7, 1, 5, -1, -1, -1, -1, -1, -1, -1}, +{9, 5, 8, 8, 5, 7, 10, 1, 3, 10, 3, 11, -1, -1, -1, -1}, +{5, 7, 0, 5, 0, 9, 7, 11, 0, 1, 0, 10, 11, 10, 0, -1}, +{11, 10, 0, 11, 0, 3, 10, 5, 0, 8, 0, 7, 5, 7, 0, -1}, +{11, 10, 5, 7, 11, 5, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, +{10, 6, 5, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, +{0, 8, 3, 5, 10, 6, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, +{9, 0, 1, 5, 10, 6, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, +{1, 8, 3, 1, 9, 8, 5, 10, 6, -1, -1, -1, -1, -1, -1, -1}, +{1, 6, 5, 2, 6, 1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, +{1, 11, 10, 1, 4, 11, 1, 0, 4, 7, 11, 4, -1, -1, -1, -1}, +{4, 7, 8, 9, 0, 11, 9, 11, 10, 11, 0, 3, -1, -1, -1, -1}, +{4, 7, 11, 4, 11, 9, 9, 11, 10, -1, -1, -1, -1, -1, -1, -1}, +{9, 5, 4, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, +{9, 5, 4, 0, 8, 3, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, +{0, 5, 4, 1, 5, 0, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, +{8, 5, 4, 8, 3, 5, 3, 1, 5, -1, -1, -1, -1, -1, -1, -1}, +{1, 2, 10, 9, 5, 4, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, +{3, 0, 8, 1, 2, 10, 4, 9, 5, -1, -1, -1, -1, -1, -1, -1}, +{5, 2, 10, 5, 4, 2, 4, 0, 2, -1, -1, -1, -1, -1, -1, -1}, +{2, 10, 5, 3, 2, 5, 3, 5, 4, 3, 4, 8, -1, -1, -1, -1}, +{9, 5, 4, 2, 3, 11, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, +{0, 11, 2, 0, 8, 11, 4, 9, 5, -1, -1, -1, -1, -1, -1, -1}, +{0, 5, 4, 0, 1, 5, 2, 3, 11, -1, -1, -1, -1, -1, -1, -1}, +{2, 1, 5, 2, 5, 8, 2, 8, 11, 4, 8, 5, -1, -1, -1, -1}, +{10, 3, 11, 10, 1, 3, 9, 5, 4, -1, -1, -1, -1, -1, -1, -1}, +{4, 9, 5, 0, 8, 1, 8, 10, 1, 8, 11, 10, -1, -1, -1, -1}, +{5, 4, 0, 5, 0, 11, 5, 11, 10, 11, 0, 3, -1, -1, -1, -1}, +{5, 4, 8, 5, 8, 10, 10, 8, 11, -1, -1, -1, -1, -1, -1, -1}, +{9, 7, 8, 5, 7, 9, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, +{9, 3, 0, 9, 5, 3, 5, 7, 3, -1, -1, -1, -1, -1, -1, -1}, +{0, 7, 8, 0, 1, 7, 1, 5, 7, -1, -1, -1, -1, -1, -1, -1}, +{1, 5, 3, 3, 5, 7, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, +{9, 7, 8, 9, 5, 7, 10, 1, 2, -1, -1, -1, -1, -1, -1, -1}, +{10, 1, 2, 9, 5, 0, 5, 3, 0, 5, 7, 3, -1, -1, -1, -1}, +{8, 0, 2, 8, 2, 5, 8, 5, 7, 10, 5, 2, -1, -1, -1, -1}, +{2, 10, 5, 2, 5, 3, 3, 5, 7, -1, -1, -1, -1, -1, -1, -1}, +{7, 9, 5, 7, 8, 9, 3, 11, 2, -1, -1, -1, -1, -1, -1, -1}, +{9, 5, 7, 9, 7, 2, 9, 2, 0, 2, 7, 11, -1, -1, -1, -1}, +{2, 3, 11, 0, 1, 8, 1, 7, 8, 1, 5, 7, -1, -1, -1, -1}, +{11, 2, 1, 11, 1, 7, 7, 1, 5, -1, -1, -1, -1, -1, -1, -1}, +{9, 5, 8, 8, 5, 7, 10, 1, 3, 10, 3, 11, -1, -1, -1, -1}, +{5, 7, 0, 5, 0, 9, 7, 11, 0, 1, 0, 10, 11, 10, 0, -1}, +{11, 10, 0, 11, 0, 3, 10, 5, 0, 8, 0, 7, 5, 7, 0, -1}, +{11, 10, 5, 7, 11, 5, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, +{10, 6, 5, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, +{0, 8, 3, 5, 10, 6, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, +{9, 0, 1, 5, 10, 6, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, +{1, 8, 3, 1, 9, 8, 5, 10, 6, -1, -1, -1, -1, -1, -1, -1}, +{1, 6, 5, 2, 6, 1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, +{2, 6, 9, 2, 9, 1, 6, 7, 9, 0, 9, 3, 7, 3, 9, -1}, +{7, 8, 0, 7, 0, 6, 6, 0, 2, -1, -1, -1, -1, -1, -1, -1}, +{7, 3, 2, 6, 7, 2, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, +{2, 3, 11, 10, 6, 8, 10, 8, 9, 8, 6, 7, -1, -1, -1, -1}, +{2, 0, 7, 2, 7, 11, 0, 9, 7, 6, 7, 10, 9, 10, 7, -1}, +{1, 8, 0, 1, 7, 8, 1, 10, 7, 6, 7, 10, 2, 3, 11, -1}, +{11, 2, 1, 11, 1, 7, 10, 6, 1, 6, 7, 1, -1, -1, -1, -1}, +{8, 9, 6, 8, 6, 7, 9, 1, 6, 11, 6, 3, 1, 3, 6, -1}, +{0, 9, 1, 11, 6, 7, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, +{7, 8, 0, 7, 0, 6, 3, 11, 0, 11, 6, 0, -1, -1, -1, -1}, +{7, 11, 6, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, +{7, 6, 11, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, +{3, 0, 8, 11, 7, 6, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, +{0, 1, 9, 11, 7, 6, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, +{8, 1, 9, 8, 3, 1, 11, 7, 6, -1, -1, -1, -1, -1, -1, -1}, +{10, 1, 2, 6, 11, 7, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, +{1, 2, 10, 3, 0, 8, 6, 11, 7, -1, -1, -1, -1, -1, -1, -1}, +{2, 9, 0, 2, 10, 9, 6, 11, 7, -1, -1, -1, -1, -1, -1, -1}, +{6, 11, 7, 2, 10, 3, 10, 8, 3, 10, 9, 8, -1, -1, -1, -1}, +{7, 2, 3, 6, 2, 7, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, +{7, 0, 8, 7, 6, 0, 6, 2, 0, -1, -1, -1, -1, -1, -1, -1}, +{2, 7, 6, 2, 3, 7, 0, 1, 9, -1, -1, -1, -1, -1, -1, -1}, +{1, 6, 2, 1, 8, 6, 1, 9, 8, 8, 7, 6, -1, -1, -1, -1}, +{10, 7, 6, 10, 1, 7, 1, 3, 7, -1, -1, -1, -1, -1, -1, -1}, +{10, 7, 6, 1, 7, 10, 1, 8, 7, 1, 0, 8, -1, -1, -1, -1}, +{0, 3, 7, 0, 7, 10, 0, 10, 9, 6, 10, 7, -1, -1, -1, -1}, +{7, 6, 10, 7, 10, 8, 8, 10, 9, -1, -1, -1, -1, -1, -1, -1}, +{6, 8, 4, 11, 8, 6, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, +{3, 6, 11, 3, 0, 6, 0, 4, 6, -1, -1, -1, -1, -1, -1, -1}, +{8, 6, 11, 8, 4, 6, 9, 0, 1, -1, -1, -1, -1, -1, -1, -1}, +{9, 4, 6, 9, 6, 3, 9, 3, 1, 11, 3, 6, -1, -1, -1, -1}, +{6, 8, 4, 6, 11, 8, 2, 10, 1, -1, -1, -1, -1, -1, -1, -1}, +{1, 2, 10, 3, 0, 11, 0, 6, 11, 0, 4, 6, -1, -1, -1, -1}, +{4, 11, 8, 4, 6, 11, 0, 2, 9, 2, 10, 9, -1, -1, -1, -1}, +{10, 9, 3, 10, 3, 2, 9, 4, 3, 11, 3, 6, 4, 6, 3, -1}, +{8, 2, 3, 8, 4, 2, 4, 6, 2, -1, -1, -1, -1, -1, -1, -1}, +{0, 4, 2, 4, 6, 2, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, +{1, 9, 0, 2, 3, 4, 2, 4, 6, 4, 3, 8, -1, -1, -1, -1}, +{1, 9, 4, 1, 4, 2, 2, 4, 6, -1, -1, -1, -1, -1, -1, -1}, +{8, 1, 3, 8, 6, 1, 8, 4, 6, 6, 10, 1, -1, -1, -1, -1}, +{10, 1, 0, 10, 0, 6, 6, 0, 4, -1, -1, -1, -1, -1, -1, -1}, +{4, 6, 3, 4, 3, 8, 6, 10, 3, 0, 3, 9, 10, 9, 3, -1}, +{10, 9, 4, 6, 10, 4, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, +{4, 9, 5, 7, 6, 11, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, +{0, 8, 3, 4, 9, 5, 11, 7, 6, -1, -1, -1, -1, -1, -1, -1}, +{5, 0, 1, 5, 4, 0, 7, 6, 11, -1, -1, -1, -1, -1, -1, -1}, +{11, 7, 6, 8, 3, 4, 3, 5, 4, 3, 1, 5, -1, -1, -1, -1}, +{9, 5, 4, 10, 1, 2, 7, 6, 11, -1, -1, -1, -1, -1, -1, -1}, +{6, 11, 7, 1, 2, 10, 0, 8, 3, 4, 9, 5, -1, -1, -1, -1}, +{7, 6, 11, 5, 4, 10, 4, 2, 10, 4, 0, 2, -1, -1, -1, -1}, +{3, 4, 8, 3, 5, 4, 3, 2, 5, 10, 5, 2, 11, 7, 6, -1}, +{7, 2, 3, 7, 6, 2, 5, 4, 9, -1, -1, -1, -1, -1, -1, -1}, +{9, 5, 4, 0, 8, 6, 0, 6, 2, 6, 8, 7, -1, -1, -1, -1}, +{3, 6, 2, 3, 7, 6, 1, 5, 0, 5, 4, 0, -1, -1, -1, -1}, +{6, 2, 8, 6, 8, 7, 2, 1, 8, 4, 8, 5, 1, 5, 8, -1}, +{9, 5, 4, 10, 1, 6, 1, 7, 6, 1, 3, 7, -1, -1, -1, -1}, +{1, 6, 10, 1, 7, 6, 1, 0, 7, 8, 7, 0, 9, 5, 4, -1}, +{4, 0, 10, 4, 10, 5, 0, 3, 10, 6, 10, 7, 3, 7, 10, -1}, +{7, 6, 10, 7, 10, 8, 5, 4, 10, 4, 8, 10, -1, -1, -1, -1}, +{6, 9, 5, 6, 11, 9, 11, 8, 9, -1, -1, -1, -1, -1, -1, -1}, +{3, 6, 11, 0, 6, 3, 0, 5, 6, 0, 9, 5, -1, -1, -1, -1}, +{0, 11, 8, 0, 5, 11, 0, 1, 5, 5, 6, 11, -1, -1, -1, -1}, +{6, 11, 3, 6, 3, 5, 5, 3, 1, -1, -1, -1, -1, -1, -1, -1}, +{1, 2, 10, 9, 5, 11, 9, 11, 8, 11, 5, 6, -1, -1, -1, -1}, +{0, 11, 3, 0, 6, 11, 0, 9, 6, 5, 6, 9, 1, 2, 10, -1}, +{11, 8, 5, 11, 5, 6, 8, 0, 5, 10, 5, 2, 0, 2, 5, -1}, +{6, 11, 3, 6, 3, 5, 2, 10, 3, 10, 5, 3, -1, -1, -1, -1}, +{5, 8, 9, 5, 2, 8, 5, 6, 2, 3, 8, 2, -1, -1, -1, -1}, +{9, 5, 6, 9, 6, 0, 0, 6, 2, -1, -1, -1, -1, -1, -1, -1}, +{1, 5, 8, 1, 8, 0, 5, 6, 8, 3, 8, 2, 6, 2, 8, -1}, +{1, 5, 6, 2, 1, 6, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, +{1, 3, 6, 1, 6, 10, 3, 8, 6, 5, 6, 9, 8, 9, 6, -1}, +{10, 1, 0, 10, 0, 6, 9, 5, 0, 5, 6, 0, -1, -1, -1, -1}, +{0, 3, 8, 5, 6, 10, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, +{10, 5, 6, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, +{11, 5, 10, 7, 5, 11, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, +{11, 5, 10, 11, 7, 5, 8, 3, 0, -1, -1, -1, -1, -1, -1, -1}, +{5, 11, 7, 5, 10, 11, 1, 9, 0, -1, -1, -1, -1, -1, -1, -1}, +{10, 7, 5, 10, 11, 7, 9, 8, 1, 8, 3, 1, -1, -1, -1, -1}, +{11, 1, 2, 11, 7, 1, 7, 5, 1, -1, -1, -1, -1, -1, -1, -1}, +{0, 8, 3, 1, 2, 7, 1, 7, 5, 7, 2, 11, -1, -1, -1, -1}, +{9, 7, 5, 9, 2, 7, 9, 0, 2, 2, 11, 7, -1, -1, -1, -1}, +{7, 5, 2, 7, 2, 11, 5, 9, 2, 3, 2, 8, 9, 8, 2, -1}, +{2, 5, 10, 2, 3, 5, 3, 7, 5, -1, -1, -1, -1, -1, -1, -1}, +{8, 2, 0, 8, 5, 2, 8, 7, 5, 10, 2, 5, -1, -1, -1, -1}, +{9, 0, 1, 5, 10, 3, 5, 3, 7, 3, 10, 2, -1, -1, -1, -1}, +{9, 8, 2, 9, 2, 1, 8, 7, 2, 10, 2, 5, 7, 5, 2, -1}, +{1, 3, 5, 3, 7, 5, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, +{0, 8, 7, 0, 7, 1, 1, 7, 5, -1, -1, -1, -1, -1, -1, -1}, +{9, 0, 3, 9, 3, 5, 5, 3, 7, -1, -1, -1, -1, -1, -1, -1}, +{9, 8, 7, 5, 9, 7, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, +{5, 8, 4, 5, 10, 8, 10, 11, 8, -1, -1, -1, -1, -1, -1, -1}, +{5, 0, 4, 5, 11, 0, 5, 10, 11, 11, 3, 0, -1, -1, -1, -1}, +{0, 1, 9, 8, 4, 10, 8, 10, 11, 10, 4, 5, -1, -1, -1, -1}, +{10, 11, 4, 10, 4, 5, 11, 3, 4, 9, 4, 1, 3, 1, 4, -1}, +{2, 5, 1, 2, 8, 5, 2, 11, 8, 4, 5, 8, -1, -1, -1, -1}, +{0, 4, 11, 0, 11, 3, 4, 5, 11, 2, 11, 1, 5, 1, 11, -1}, +{0, 2, 5, 0, 5, 9, 2, 11, 5, 4, 5, 8, 11, 8, 5, -1}, +{9, 4, 5, 2, 11, 3, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, +{2, 5, 10, 3, 5, 2, 3, 4, 5, 3, 8, 4, -1, -1, -1, -1}, +{5, 10, 2, 5, 2, 4, 4, 2, 0, -1, -1, -1, -1, -1, -1, -1}, +{3, 10, 2, 3, 5, 10, 3, 8, 5, 4, 5, 8, 0, 1, 9, -1}, +{5, 10, 2, 5, 2, 4, 1, 9, 2, 9, 4, 2, -1, -1, -1, -1}, +{8, 4, 5, 8, 5, 3, 3, 5, 1, -1, -1, -1, -1, -1, -1, -1}, +{0, 4, 5, 1, 0, 5, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, +{8, 4, 5, 8, 5, 3, 9, 0, 5, 0, 3, 5, -1, -1, -1, -1}, +{9, 4, 5, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, +{4, 11, 7, 4, 9, 11, 9, 10, 11, -1, -1, -1, -1, -1, -1, -1}, +{0, 8, 3, 4, 9, 7, 9, 11, 7, 9, 10, 11, -1, -1, -1, -1}, +{1, 10, 11, 1, 11, 4, 1, 4, 0, 7, 4, 11, -1, -1, -1, -1}, +{3, 1, 4, 3, 4, 8, 1, 10, 4, 7, 4, 11, 10, 11, 4, -1}, +{4, 11, 7, 9, 11, 4, 9, 2, 11, 9, 1, 2, -1, -1, -1, -1}, +{9, 7, 4, 9, 11, 7, 9, 1, 11, 2, 11, 1, 0, 8, 3, -1}, +{11, 7, 4, 11, 4, 2, 2, 4, 0, -1, -1, -1, -1, -1, -1, -1}, +{11, 7, 4, 11, 4, 2, 8, 3, 4, 3, 2, 4, -1, -1, -1, -1}, +{2, 9, 10, 2, 7, 9, 2, 3, 7, 7, 4, 9, -1, -1, -1, -1}, +{9, 10, 7, 9, 7, 4, 10, 2, 7, 8, 7, 0, 2, 0, 7, -1}, +{3, 7, 10, 3, 10, 2, 7, 4, 10, 1, 10, 0, 4, 0, 10, -1}, +{1, 10, 2, 8, 7, 4, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, +{4, 9, 1, 4, 1, 7, 7, 1, 3, -1, -1, -1, -1, -1, -1, -1}, +{4, 9, 1, 4, 1, 7, 0, 8, 1, 8, 7, 1, -1, -1, -1, -1}, +{4, 0, 3, 7, 4, 3, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, +{4, 8, 7, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, +{9, 10, 8, 10, 11, 8, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, +{3, 0, 9, 3, 9, 11, 11, 9, 10, -1, -1, -1, -1, -1, -1, -1}, +{0, 1, 10, 0, 10, 8, 8, 10, 11, -1, -1, -1, -1, -1, -1, -1}, +{3, 1, 10, 11, 3, 10, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, +{1, 2, 11, 1, 11, 9, 9, 11, 8, -1, -1, -1, -1, -1, -1, -1}, +{3, 0, 9, 3, 9, 11, 1, 2, 9, 2, 11, 9, -1, -1, -1, -1}, +{0, 2, 11, 8, 0, 11, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, +{3, 2, 11, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, +{2, 3, 8, 2, 8, 10, 10, 8, 9, -1, -1, -1, -1, -1, -1, -1}, +{9, 10, 2, 0, 9, 2, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, +{2, 3, 8, 2, 8, 10, 0, 1, 8, 1, 10, 8, -1, -1, -1, -1}, +{1, 10, 2, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, +{1, 3, 8, 9, 1, 8, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, +{0, 9, 1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, +{0, 3, 8, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, +{-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}}; + +#endif Property changes on: brlcad/trunk/src/librt/primitives/metaball/mc_table.h ___________________________________________________________________ Added: svn:mime-type + text/plain Added: svn:eol-style + native Modified: brlcad/trunk/src/librt/primitives/metaball/metaball_tri.c =================================================================== --- brlcad/trunk/src/librt/primitives/metaball/metaball_tri.c 2009-12-18 20:42:07 UTC (rev 36947) +++ brlcad/trunk/src/librt/primitives/metaball/metaball_tri.c 2009-12-18 21:57:12 UTC (rev 36948) @@ -43,6 +43,7 @@ #include "wdb.h" #include "metaball.h" +#include "mc_table.h" static int bitcount(unsigned char w) { return (w==0) ? 0 : bitcount(w>>1) + (w|1); } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <br...@us...> - 2009-12-22 01:27:27
|
Revision: 36963 http://brlcad.svn.sourceforge.net/brlcad/?rev=36963&view=rev Author: brlcad Date: 2009-12-22 01:27:19 +0000 (Tue, 22 Dec 2009) Log Message: ----------- move the rt_vstub() function into vshoot.c and make it HIDDEN. rename it to vshot_stub() in the process, calling it if a primitive has a null vshot callback. Modified Paths: -------------- brlcad/trunk/src/librt/shoot.c brlcad/trunk/src/librt/vshoot.c Modified: brlcad/trunk/src/librt/shoot.c =================================================================== --- brlcad/trunk/src/librt/shoot.c 2009-12-22 01:06:23 UTC (rev 36962) +++ brlcad/trunk/src/librt/shoot.c 2009-12-22 01:27:19 UTC (rev 36963) @@ -2072,52 +2072,7 @@ } -#undef st - - -#define SEG_MISS(SEG) (SEG).seg_stp=(struct soltab *) 0; - -/** - * Stub function which will "similate" a call to a vector shot routine - */ void -rt_vstub(struct soltab **stp, struct xray **rp, struct seg *segp, int n, struct application *ap) -/* An array of solid pointers */ -/* An array of ray pointers */ -/* array of segs (results returned) */ -/* Number of ray/object pairs */ -/* pointer to an application */ -{ - register int i; - register struct seg *tmp_seg; - struct seg seghead; - int ret; - - BU_LIST_INIT(&(seghead.l)); - - /* go through each ray/solid pair and call a scalar function */ - for (i = 0; i < n; i++) { - if (stp[i] != 0) { - /* skip call if solid table pointer is NULL */ - /* do scalar call, place results in segp array */ - ret = -1; - if (rt_functab[stp[i]->st_id].ft_shot) { - ret = rt_functab[stp[i]->st_id].ft_shot(stp[i], rp[i], ap, &seghead); - } - if (ret <= 0) { - SEG_MISS(segp[i]); - } else { - tmp_seg = BU_LIST_FIRST(seg, &(seghead.l)); - BU_LIST_DEQUEUE(&(tmp_seg->l)); - segp[i] = *tmp_seg; /* structure copy */ - RT_FREE_SEG(tmp_seg, ap->a_resource); - } - } - } -} - - -void rt_zero_res_stats(struct resource *resp) { RT_CK_RESOURCE(resp); Modified: brlcad/trunk/src/librt/vshoot.c =================================================================== --- brlcad/trunk/src/librt/vshoot.c 2009-12-22 01:06:23 UTC (rev 36962) +++ brlcad/trunk/src/librt/vshoot.c 2009-12-22 01:27:19 UTC (rev 36963) @@ -35,6 +35,46 @@ /** + * Stub function which will "similate" a call to a vector shot routine + */ +HIDDEN void +vshot_stub(struct soltab **stp, struct xray **rp, struct seg *segp, int n, struct application *ap) +/* An array of solid pointers */ +/* An array of ray pointers */ +/* array of segs (results returned) */ +/* Number of ray/object pairs */ +/* pointer to an application */ +{ + register int i; + register struct seg *tmp_seg; + struct seg seghead; + int ret; + + BU_LIST_INIT(&(seghead.l)); + + /* go through each ray/solid pair and call a scalar function */ + for (i = 0; i < n; i++) { + if (stp[i] != 0) { + /* skip call if solid table pointer is NULL */ + /* do scalar call, place results in segp array */ + ret = -1; + if (rt_functab[stp[i]->st_id].ft_shot) { + ret = rt_functab[stp[i]->st_id].ft_shot(stp[i], rp[i], ap, &seghead); + } + if (ret <= 0) { + segp[i].seg_stp=(struct soltab *) 0; + } else { + tmp_seg = BU_LIST_FIRST(seg, &(seghead.l)); + BU_LIST_DEQUEUE(&(tmp_seg->l)); + segp[i] = *tmp_seg; /* structure copy */ + RT_FREE_SEG(tmp_seg, ap->a_resource); + } + } + } +} + + +/** * R T _ S H O O T R A Y * * Given a ray, shoot it at all the relevant parts of the model, @@ -202,9 +242,13 @@ /* bit vector per ray check */ /* mark elements to be skipped with ary_stp[] = SOLTAB_NULL */ ap->a_rt_i->nshots += nsol; /* later: skipped ones */ - if (rt_functab[id].ft_vshot) + if (rt_functab[id].ft_vshot) { rt_functab[id].ft_vshot(ary_stp, ary_rp, ary_seg, nsol, ap); + } else { + vshot_stub(ary_stp, ary_rp, ary_seg, nsol, ap); + } + /* set bits for all solids shot at for each ray */ /* append resulting seg list to input for boolweave */ This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sta...@us...> - 2009-12-24 03:30:54
|
Revision: 37014 http://brlcad.svn.sourceforge.net/brlcad/?rev=37014&view=rev Author: starseeker Date: 2009-12-24 03:30:42 +0000 (Thu, 24 Dec 2009) Log Message: ----------- Compile gotchas on gentoo - FALSE returning as not defined in a couple files - looks like this was coming in from opennurbs and is gone with the latest update - just go with 0; also include assert.h in brep.cpp since it's not getting pulled in through opennurbs any more. Modified Paths: -------------- brlcad/trunk/src/librt/opennurbs_ext.cpp brlcad/trunk/src/librt/primitives/brep/brep.cpp brlcad/trunk/src/librt/primitives/nmg/nmg_brep.cpp Modified: brlcad/trunk/src/librt/opennurbs_ext.cpp =================================================================== --- brlcad/trunk/src/librt/opennurbs_ext.cpp 2009-12-24 03:00:56 UTC (rev 37013) +++ brlcad/trunk/src/librt/opennurbs_ext.cpp 2009-12-24 03:30:42 UTC (rev 37014) @@ -424,7 +424,7 @@ for (int i = 0; i < m_face->LoopCount(); i++) { ON_BrepLoop* loop = m_face->Loop(i); if (loop->m_type == ON_BrepLoop::outer) { - if (loop->GetBBox(bb[0], bb[1], FALSE)) { + if (loop->GetBBox(bb[0], bb[1], 0)) { TRACE("BBox for Loop min<" << bb[0][0] << ", " << bb[0][1] ", " << bb[0][2] << ">"); TRACE("BBox for Loop max<" << bb[1][0] << ", " << bb[1][1] ", " << bb[1][2] << ">"); } Modified: brlcad/trunk/src/librt/primitives/brep/brep.cpp =================================================================== --- brlcad/trunk/src/librt/primitives/brep/brep.cpp 2009-12-24 03:00:56 UTC (rev 37013) +++ brlcad/trunk/src/librt/primitives/brep/brep.cpp 2009-12-24 03:30:42 UTC (rev 37014) @@ -38,6 +38,8 @@ #define BN_VMATH_PREFIX_INDICES 1 #define ROOT_TOL 1.E-7 +#include "assert.h" + #include "vmath.h" #include "brep.h" Modified: brlcad/trunk/src/librt/primitives/nmg/nmg_brep.cpp =================================================================== --- brlcad/trunk/src/librt/primitives/nmg/nmg_brep.cpp 2009-12-24 03:00:56 UTC (rev 37013) +++ brlcad/trunk/src/librt/primitives/nmg/nmg_brep.cpp 2009-12-24 03:30:42 UTC (rev 37014) @@ -37,7 +37,7 @@ HIDDEN ON_Surface* sideSurface(const ON_3dPoint& SW, const ON_3dPoint& SE, const ON_3dPoint& NE, const ON_3dPoint& NW) { - ON_NurbsSurface *surf = ON_NurbsSurface::New(3, FALSE, 2, 2, 2, 2); + ON_NurbsSurface *surf = ON_NurbsSurface::New(3, 0, 2, 2, 2, 2); surf->SetCV(0, 0, SW); surf->SetCV(1, 0, SE); surf->SetCV(1, 1, NE); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <br...@us...> - 2009-12-28 09:47:05
|
Revision: 37034 http://brlcad.svn.sourceforge.net/brlcad/?rev=37034&view=rev Author: brlcad Date: 2009-12-28 09:46:59 +0000 (Mon, 28 Dec 2009) Log Message: ----------- few more ifree() callers Modified Paths: -------------- brlcad/trunk/src/librt/constraint.c brlcad/trunk/src/librt/db5_bin.c brlcad/trunk/src/librt/db_comb.c brlcad/trunk/src/librt/dir.c Modified: brlcad/trunk/src/librt/constraint.c =================================================================== --- brlcad/trunk/src/librt/constraint.c 2009-12-28 09:43:45 UTC (rev 37033) +++ brlcad/trunk/src/librt/constraint.c 2009-12-28 09:46:59 UTC (rev 37034) @@ -54,13 +54,12 @@ * constraint object. */ void -rt_constraint_ifree(struct rt_db_internal *ip, struct resource *resp) +rt_constraint_ifree(struct rt_db_internal *ip) { register struct rt_constraint_internal *constraint; RT_CK_DB_INTERNAL(ip); constraint = (struct rt_constraint_internal *)ip->idb_ptr; - if (!resp) resp = &rt_uniresource; if (constraint) { constraint->magic = 0; /* sanity */ Modified: brlcad/trunk/src/librt/db5_bin.c =================================================================== --- brlcad/trunk/src/librt/db5_bin.c 2009-12-28 09:43:45 UTC (rev 37033) +++ brlcad/trunk/src/librt/db5_bin.c 2009-12-28 09:46:59 UTC (rev 37034) @@ -420,12 +420,11 @@ * thing. */ void -rt_binunif_ifree( struct rt_db_internal *ip, struct resource *resp ) +rt_binunif_ifree(struct rt_db_internal *ip) { struct rt_binunif_internal *bip; RT_CK_DB_INTERNAL(ip); - if (!resp) resp = &rt_uniresource; bip = (struct rt_binunif_internal *)ip->idb_ptr; RT_CK_BINUNIF(bip); bu_free( (genptr_t) bip->u.uint8, "binunif ifree" ); Modified: brlcad/trunk/src/librt/db_comb.c =================================================================== --- brlcad/trunk/src/librt/db_comb.c 2009-12-28 09:43:45 UTC (rev 37033) +++ brlcad/trunk/src/librt/db_comb.c 2009-12-28 09:46:59 UTC (rev 37034) @@ -872,17 +872,16 @@ * Free the storage associated with the rt_db_internal version of this combination. */ void -rt_comb_ifree(struct rt_db_internal *ip, struct resource *resp) +rt_comb_ifree(struct rt_db_internal *ip) { register struct rt_comb_internal *comb; RT_CK_DB_INTERNAL(ip); - RT_CK_RESOURCE(resp); comb = (struct rt_comb_internal *)ip->idb_ptr; if (comb) { /* If tree hasn't been stolen, release it */ - if (comb->tree) db_free_tree(comb->tree, resp); + if (comb->tree) db_free_tree(comb->tree, &rt_uniresource); comb->tree = NULL; bu_vls_free(&comb->shader); Modified: brlcad/trunk/src/librt/dir.c =================================================================== --- brlcad/trunk/src/librt/dir.c 2009-12-28 09:43:45 UTC (rev 37033) +++ brlcad/trunk/src/librt/dir.c 2009-12-28 09:46:59 UTC (rev 37034) @@ -250,7 +250,7 @@ if (ip->idb_meth) { RT_CK_FUNCTAB(ip->idb_meth); if (ip->idb_ptr && ip->idb_meth->ft_ifree) { - ip->idb_meth->ft_ifree(ip, resp); + ip->idb_meth->ft_ifree(ip); } } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <br...@us...> - 2009-12-28 14:52:41
|
Revision: 37037 http://brlcad.svn.sourceforge.net/brlcad/?rev=37037&view=rev Author: brlcad Date: 2009-12-28 14:52:33 +0000 (Mon, 28 Dec 2009) Log Message: ----------- s/log/logstr/g where it's a bu_vls string for quellage purposes. Modified Paths: -------------- brlcad/trunk/src/librt/primitives/bot/bot.c brlcad/trunk/src/librt/primitives/dsp/dsp.c brlcad/trunk/src/librt/primitives/ebm/ebm.c brlcad/trunk/src/librt/primitives/extrude/extrude.c brlcad/trunk/src/librt/primitives/metaball/metaball.c brlcad/trunk/src/librt/primitives/nmg/nmg.c brlcad/trunk/src/librt/primitives/pipe/pipe.c brlcad/trunk/src/librt/primitives/sketch/sketch.c brlcad/trunk/src/librt/primitives/table.c brlcad/trunk/src/librt/tcl.c Modified: brlcad/trunk/src/librt/primitives/bot/bot.c =================================================================== --- brlcad/trunk/src/librt/primitives/bot/bot.c 2009-12-28 14:28:09 UTC (rev 37036) +++ brlcad/trunk/src/librt/primitives/bot/bot.c 2009-12-28 14:52:33 UTC (rev 37037) @@ -1336,7 +1336,7 @@ } if (free && op != ip) { - rt_bot_ifree(ip, NULL); + rt_bot_ifree(ip); } return(0); Modified: brlcad/trunk/src/librt/primitives/dsp/dsp.c =================================================================== --- brlcad/trunk/src/librt/primitives/dsp/dsp.c 2009-12-28 14:28:09 UTC (rev 37036) +++ brlcad/trunk/src/librt/primitives/dsp/dsp.c 2009-12-28 14:52:33 UTC (rev 37037) @@ -3524,8 +3524,8 @@ RT_CK_BINUNIF(dsp_ip->dsp_bip->idb_ptr); break; } - - + + xlim = dsp_ip->dsp_xcnt - 1; ylim = dsp_ip->dsp_ycnt - 1; @@ -3777,7 +3777,7 @@ } } - + if (dir == DSP_CUT_DIR_llUR) { verts[0] = &strip1Verts[y]; verts[1] = &strip2Verts[y+1]; @@ -4031,7 +4031,7 @@ BU_GETSTRUCT(dsp_ip->dsp_bip, rt_db_internal); - ret = rt_retrieve_binunif(dsp_ip->dsp_bip, dbip, bu_vls_addr(&dsp_ip->dsp_name)); + ret = rt_retrieve_binunif (dsp_ip->dsp_bip, dbip, bu_vls_addr(&dsp_ip->dsp_name)); if (ret) return -1; @@ -4651,7 +4651,7 @@ * Example: "db get ell.s B" to get only the B vector. */ int -rt_dsp_get(struct bu_vls *log, const struct rt_db_internal *intern, const char *attr) +rt_dsp_get(struct bu_vls *logstr, const struct rt_db_internal *intern, const char *attr) { register const struct bu_structparse *sp = NULL; const struct rt_dsp_internal *dsp_ip; @@ -4666,7 +4666,7 @@ if (attr == (char *)0) { /* Print out solid type and all attributes */ - bu_vls_printf(log, "dsp"); + bu_vls_printf(logstr, "dsp"); switch (dsp_ip->dsp_datasrc) { case RT_DSP_SRC_V4_FILE: @@ -4679,8 +4679,8 @@ } while (sp && sp->sp_name != NULL) { - bu_vls_printf(log, " %s ", sp->sp_name); - bu_vls_struct_item(log, sp, (char *)dsp_ip, ' '); + bu_vls_printf(logstr, " %s ", sp->sp_name); + bu_vls_struct_item(logstr, sp, (char *)dsp_ip, ' '); ++sp; } @@ -4695,9 +4695,9 @@ break; } - if (bu_vls_struct_item_named(log, sp, attr, + if (bu_vls_struct_item_named(logstr, sp, attr, (char *)dsp_ip, ' ') < 0) { - bu_vls_printf(log, + bu_vls_printf(logstr, "Objects of type %s do not have a %s attribute.", "dsp", attr); return BRLCAD_ERROR; @@ -4717,7 +4717,7 @@ * rt_functab[].ft_adjust() */ int -rt_dsp_adjust(struct bu_vls *log, struct rt_db_internal *intern, int argc, char **argv) +rt_dsp_adjust(struct bu_vls *logstr, struct rt_db_internal *intern, int argc, char **argv) { register const struct bu_structparse *sp = NULL; const struct rt_dsp_internal *dsp_ip; @@ -4738,7 +4738,7 @@ if (! sp) return BRLCAD_ERROR; - return bu_structparse_argv(log, argc, argv, sp, + return bu_structparse_argv(logstr, argc, argv, sp, (char *)intern->idb_ptr); } @@ -4930,10 +4930,10 @@ bu_log("alpha:%g beta:%g\n", alpha, beta); } if (alpha < -SMALL_FASTF) { - bu_log ("Alpha negative: %g x:%g dx:%d\n", alpha, x, dx); + bu_log("Alpha negative: %g x:%g dx:%d\n", alpha, x, dx); } if (beta < -SMALL_FASTF) { - bu_log ("Beta negative: %g x:%g dx:%d\n", beta, y, dy); + bu_log("Beta negative: %g x:%g dx:%d\n", beta, y, dy); } CLAMP(alpha, 0.0, 1.0); CLAMP(beta, 0.0, 1.0); Modified: brlcad/trunk/src/librt/primitives/ebm/ebm.c =================================================================== --- brlcad/trunk/src/librt/primitives/ebm/ebm.c 2009-12-28 14:28:09 UTC (rev 37036) +++ brlcad/trunk/src/librt/primitives/ebm/ebm.c 2009-12-28 14:52:33 UTC (rev 37037) @@ -1574,7 +1574,7 @@ * no paramaters requested returns all */ int -rt_ebm_get(struct bu_vls *log, const struct rt_db_internal *intern, const char *attr) +rt_ebm_get(struct bu_vls *logstr, const struct rt_db_internal *intern, const char *attr) { register struct rt_ebm_internal *ebm=(struct rt_ebm_internal *)intern->idb_ptr; int i; @@ -1582,26 +1582,26 @@ RT_EBM_CK_MAGIC(ebm); if (attr == (char *)NULL) { - bu_vls_strcpy(log, "ebm"); - bu_vls_printf(log, " F %s W %d N %d H %.25g", + bu_vls_strcpy(logstr, "ebm"); + bu_vls_printf(logstr, " F %s W %d N %d H %.25g", ebm->file, ebm->xdim, ebm->ydim, ebm->tallness); - bu_vls_printf(log, " M {"); + bu_vls_printf(logstr, " M {"); for (i=0; i<16; i++) - bu_vls_printf(log, " %.25g", ebm->mat[i]); - bu_vls_printf(log, " }"); + bu_vls_printf(logstr, " %.25g", ebm->mat[i]); + bu_vls_printf(logstr, " }"); } else if (!strcmp(attr, "F")) { - bu_vls_printf(log, "%s", ebm->file); + bu_vls_printf(logstr, "%s", ebm->file); } else if (!strcmp(attr, "W")) { - bu_vls_printf(log, "%d", ebm->xdim); + bu_vls_printf(logstr, "%d", ebm->xdim); } else if (!strcmp(attr, "N")) { - bu_vls_printf(log, "%d", ebm->ydim); + bu_vls_printf(logstr, "%d", ebm->ydim); } else if (!strcmp(attr, "H")) { - bu_vls_printf(log, "%.25g", ebm->tallness); + bu_vls_printf(logstr, "%.25g", ebm->tallness); } else if (!strcmp(attr, "M")) { for (i=0; i<16; i++) - bu_vls_printf(log, "%.25g ", ebm->mat[i]); + bu_vls_printf(logstr, "%.25g ", ebm->mat[i]); } else { - bu_vls_printf(log, "ERROR: Unknown attribute, choices are F, W, N, or H\n"); + bu_vls_printf(logstr, "ERROR: Unknown attribute, choices are F, W, N, or H\n"); return BRLCAD_ERROR; } @@ -1622,7 +1622,7 @@ * "M" - matrix to transform EBM solid into model coordinates */ int -rt_ebm_adjust(struct bu_vls *log, struct rt_db_internal *intern, int argc, char **argv) +rt_ebm_adjust(struct bu_vls *logstr, struct rt_db_internal *intern, int argc, char **argv) { struct rt_ebm_internal *ebm; @@ -1634,7 +1634,7 @@ while (argc >= 2) { if (!strcmp(argv[0], "F")) { if (strlen(argv[1]) >= RT_EBM_NAME_LEN) { - bu_vls_printf(log, "ERROR: File name too long"); + bu_vls_printf(logstr, "ERROR: File name too long"); return BRLCAD_ERROR; } bu_strlcpy(ebm->file, argv[1], RT_EBM_NAME_LEN); @@ -1654,12 +1654,12 @@ if (tcl_list_to_fastf_array(brlcad_interp, argv[1], &ar_ptr, &len) != len) { - bu_vls_printf(log, "ERROR: incorrect number of coefficents for matrix\n"); + bu_vls_printf(logstr, "ERROR: incorrect number of coefficents for matrix\n"); return BRLCAD_ERROR; } MAT_COPY(ebm->mat, array) } else { - bu_vls_printf(log, "ERROR: illegal argument, choices are F, W, N, or H\n"); + bu_vls_printf(logstr, "ERROR: illegal argument, choices are F, W, N, or H\n"); return BRLCAD_ERROR; } argc -= 2; @@ -1670,11 +1670,11 @@ int -rt_ebm_form(struct bu_vls *log, const struct rt_functab *ftp) +rt_ebm_form(struct bu_vls *logstr, const struct rt_functab *ftp) { RT_CK_FUNCTAB(ftp); - bu_vls_printf(log, "F %%s W %%d N %%d H %%f M { %%f %%f %%f %%f %%f %%f %%f %%f %%f %%f %%f %%f %%f %%f %%f %%f }"); + bu_vls_printf(logstr, "F %%s W %%d N %%d H %%f M { %%f %%f %%f %%f %%f %%f %%f %%f %%f %%f %%f %%f %%f %%f %%f %%f }"); return TCL_OK; Modified: brlcad/trunk/src/librt/primitives/extrude/extrude.c =================================================================== --- brlcad/trunk/src/librt/primitives/extrude/extrude.c 2009-12-28 14:28:09 UTC (rev 37036) +++ brlcad/trunk/src/librt/primitives/extrude/extrude.c 2009-12-28 14:52:33 UTC (rev 37037) @@ -2406,42 +2406,42 @@ int -rt_extrude_form(struct bu_vls *log, const struct rt_functab *ftp) +rt_extrude_form(struct bu_vls *logstr, const struct rt_functab *ftp) { RT_CK_FUNCTAB(ftp); - bu_vls_printf(log, "V {%%f %%f %%f} H {%%f %%f %%f} A {%%f %%f %%f} B {%%f %%f %%f} S %%s K %%d"); + bu_vls_printf(logstr, "V {%%f %%f %%f} H {%%f %%f %%f} A {%%f %%f %%f} B {%%f %%f %%f} S %%s K %%d"); return BRLCAD_OK; } int -rt_extrude_get(struct bu_vls *log, const struct rt_db_internal *intern, const char *attr) +rt_extrude_get(struct bu_vls *logstr, const struct rt_db_internal *intern, const char *attr) { struct rt_extrude_internal *extr=(struct rt_extrude_internal *) intern->idb_ptr; RT_EXTRUDE_CK_MAGIC(extr); if (attr == (char *)NULL) { - bu_vls_strcpy(log, "extrude"); - bu_vls_printf(log, " V {%.25g %.25g %.25g}", V3ARGS(extr->V)); - bu_vls_printf(log, " H {%.25g %.25g %.25g}", V3ARGS(extr->h)); - bu_vls_printf(log, " A {%.25g %.25g %.25g}", V3ARGS(extr->u_vec)); - bu_vls_printf(log, " B {%.25g %.25g %.25g}", V3ARGS(extr->v_vec)); - bu_vls_printf(log, " S %s", extr->sketch_name); + bu_vls_strcpy(logstr, "extrude"); + bu_vls_printf(logstr, " V {%.25g %.25g %.25g}", V3ARGS(extr->V)); + bu_vls_printf(logstr, " H {%.25g %.25g %.25g}", V3ARGS(extr->h)); + bu_vls_printf(logstr, " A {%.25g %.25g %.25g}", V3ARGS(extr->u_vec)); + bu_vls_printf(logstr, " B {%.25g %.25g %.25g}", V3ARGS(extr->v_vec)); + bu_vls_printf(logstr, " S %s", extr->sketch_name); } else if (*attr == 'V') - bu_vls_printf(log, "%.25g %.25g %.25g", V3ARGS(extr->V)); + bu_vls_printf(logstr, "%.25g %.25g %.25g", V3ARGS(extr->V)); else if (*attr == 'H') - bu_vls_printf(log, "%.25g %.25g %.25g", V3ARGS(extr->h)); + bu_vls_printf(logstr, "%.25g %.25g %.25g", V3ARGS(extr->h)); else if (*attr == 'A') - bu_vls_printf(log, "%.25g %.25g %.25g", V3ARGS(extr->u_vec)); + bu_vls_printf(logstr, "%.25g %.25g %.25g", V3ARGS(extr->u_vec)); else if (*attr == 'B') - bu_vls_printf(log, "%.25g %.25g %.25g", V3ARGS(extr->v_vec)); + bu_vls_printf(logstr, "%.25g %.25g %.25g", V3ARGS(extr->v_vec)); else if (*attr == 'S') - bu_vls_printf(log, "%s", extr->sketch_name); + bu_vls_printf(logstr, "%s", extr->sketch_name); else { - bu_vls_strcat(log, "ERROR: unrecognized attribute, must be V, H, A, B, or S!"); + bu_vls_strcat(logstr, "ERROR: unrecognized attribute, must be V, H, A, B, or S!"); return BRLCAD_ERROR; } @@ -2450,7 +2450,7 @@ int -rt_extrude_adjust(struct bu_vls *log, struct rt_db_internal *intern, int argc, char **argv) +rt_extrude_adjust(struct bu_vls *logstr, struct rt_db_internal *intern, int argc, char **argv) { struct rt_extrude_internal *extr; fastf_t *new; @@ -2466,21 +2466,21 @@ if (*argv[0] == 'V') { new = extr->V; if (tcl_list_to_fastf_array(brlcad_interp, argv[1], &new, &array_len) != array_len) { - bu_vls_printf(log, "ERROR: incorrect number of coordinates for vertex\n"); + bu_vls_printf(logstr, "ERROR: incorrect number of coordinates for vertex\n"); return BRLCAD_ERROR; } } else if (*argv[0] == 'H') { new = extr->h; if (tcl_list_to_fastf_array(brlcad_interp, argv[1], &new, &array_len) != array_len) { - bu_vls_printf(log, "ERROR: incorrect number of coordinates for vector\n"); + bu_vls_printf(logstr, "ERROR: incorrect number of coordinates for vector\n"); return BRLCAD_ERROR; } } else if (*argv[0] == 'A') { new = extr->u_vec; if (tcl_list_to_fastf_array(brlcad_interp, argv[1], &new, &array_len) != array_len) { - bu_vls_printf(log, "ERROR: incorrect number of coordinates for vector\n"); + bu_vls_printf(logstr, "ERROR: incorrect number of coordinates for vector\n"); return BRLCAD_ERROR; } @@ -2491,7 +2491,7 @@ } else if (*argv[0] == 'B') { new = extr->v_vec; if (tcl_list_to_fastf_array(brlcad_interp, argv[1], &new, &array_len) != array_len) { - bu_vls_printf(log, "ERROR: incorrect number of coordinates for vector\n"); + bu_vls_printf(logstr, "ERROR: incorrect number of coordinates for vector\n"); return BRLCAD_ERROR; } /* insure that u_vec and v_vec are the same length */ Modified: brlcad/trunk/src/librt/primitives/metaball/metaball.c =================================================================== --- brlcad/trunk/src/librt/primitives/metaball/metaball.c 2009-12-28 14:28:09 UTC (rev 37036) +++ brlcad/trunk/src/librt/primitives/metaball/metaball.c 2009-12-28 14:52:33 UTC (rev 37037) @@ -812,13 +812,13 @@ * used for db put/asc2g */ int -rt_metaball_adjust(struct bu_vls *log, struct rt_db_internal *intern, int argc, char **argv) +rt_metaball_adjust(struct bu_vls *logstr, struct rt_db_internal *intern, int argc, char **argv) { struct rt_metaball_internal *mb; char *pts, *pend;; if(argc != 3) { - bu_vls_printf(log, "Invalid number of arguments: %d\n", argc); + bu_vls_printf(logstr, "Invalid number of arguments: %d\n", argc); return BRLCAD_ERROR; } @@ -827,7 +827,7 @@ RT_METABALL_CK_MAGIC(mb); if( strlen(*argv) != 1 || (**argv < '0' || **argv > '2') ) { - bu_vls_printf(log, "Invalid method type, must be one of 0, 1, or 2."); + bu_vls_printf(logstr, "Invalid method type, must be one of 0, 1, or 2."); return BRLCAD_ERROR; } mb->method = *argv[0] - '0'; @@ -847,12 +847,12 @@ len = sscanf(pts, "{%lG %lG %lG %lG %lG}", loc+X, loc+Y, loc+Z, &fldstr, &goo); if(len == EOF) break; if(len != 5) { - bu_vls_printf(log, "Failed to parse point information: \"%s\"", pts); + bu_vls_printf(logstr, "Failed to parse point information: \"%s\"", pts); return BRLCAD_ERROR; } pts++; if(rt_metaball_add_point (mb, (const point_t *)&loc, fldstr, goo)) { - bu_vls_printf(log, "Failure adding point: {%f %f %f %f %f}", V3ARGS(loc), fldstr, goo); + bu_vls_printf(logstr, "Failure adding point: {%f %f %f %f %f}", V3ARGS(loc), fldstr, goo); return BRLCAD_ERROR; } } Modified: brlcad/trunk/src/librt/primitives/nmg/nmg.c =================================================================== --- brlcad/trunk/src/librt/primitives/nmg/nmg.c 2009-12-28 14:28:09 UTC (rev 37036) +++ brlcad/trunk/src/librt/primitives/nmg/nmg.c 2009-12-28 14:52:33 UTC (rev 37037) @@ -2681,7 +2681,7 @@ int -rt_nmg_get(struct bu_vls *log, const struct rt_db_internal *intern, const char *attr) +rt_nmg_get(struct bu_vls *logstr, const struct rt_db_internal *intern, const char *attr) { register struct model *m=(struct model *)intern->idb_ptr; struct bu_ptbl verts; @@ -2698,33 +2698,33 @@ NMG_CK_MODEL(m); if (attr == (char *)NULL) { - bu_vls_strcpy(log, "nmg"); + bu_vls_strcpy(logstr, "nmg"); bu_ptbl_init(&verts, 256, "nmg verts"); nmg_vertex_tabulate(&verts, &m->magic); /* first list all the vertices */ - bu_vls_strcat(log, " V {"); + bu_vls_strcat(logstr, " V {"); for (i=0; i<BU_PTBL_LEN(&verts); i++) { v = (struct vertex *) BU_PTBL_GET(&verts, i); NMG_CK_VERTEX(v); vg = v->vg_p; if (!vg) { - bu_vls_printf(log, "Vertex has no geometry\n"); + bu_vls_printf(logstr, "Vertex has no geometry\n"); bu_ptbl_free(&verts); return BRLCAD_ERROR; } - bu_vls_printf(log, " { %.25g %.25g %.25g }", V3ARGS(vg->coord)); + bu_vls_printf(logstr, " { %.25g %.25g %.25g }", V3ARGS(vg->coord)); } - bu_vls_strcat(log, " }"); + bu_vls_strcat(logstr, " }"); /* use the backwards macros here so that "asc2g" will build the same structures */ /* now all the nmgregions */ for (BU_LIST_FOR_BACKWARDS(r, nmgregion, &m->r_hd)) { - /* bu_vls_strcat(log, " R {"); */ + /* bu_vls_strcat(logstr, " R {"); */ /* and all the shells */ for (BU_LIST_FOR_BACKWARDS(s, shell, &r->s_hd)) { - /* bu_vls_strcat(log, " S {"); */ + /* bu_vls_strcat(logstr, " S {"); */ /* all the faces */ if (BU_LIST_NON_EMPTY(&s->fu_hd)) { @@ -2732,34 +2732,34 @@ if (fu->orientation != OT_SAME) continue; - bu_vls_strcat(log, " F {"); + bu_vls_strcat(logstr, " F {"); /* all the loops in this face */ for (BU_LIST_FOR_BACKWARDS(lu, loopuse, &fu->lu_hd)) { if (BU_LIST_FIRST_MAGIC(&lu->down_hd) == NMG_VERTEXUSE_MAGIC) { vu = BU_LIST_FIRST(vertexuse, &lu->down_hd); - bu_vls_printf(log, " %d", + bu_vls_printf(logstr, " %d", bu_ptbl_locate(&verts, (long *)vu->v_p)); } else { - bu_vls_strcat(log, " {"); + bu_vls_strcat(logstr, " {"); for (BU_LIST_FOR (eu, edgeuse, &lu->down_hd)) { vu = eu->vu_p; - bu_vls_printf(log, " %d", + bu_vls_printf(logstr, " %d", bu_ptbl_locate(&verts, (long *)vu->v_p)); } /* end of this loop */ - bu_vls_strcat(log, " }"); + bu_vls_strcat(logstr, " }"); } } /* end of this face */ - bu_vls_strcat(log, " }"); + bu_vls_strcat(logstr, " }"); } } } /* end of this nmgregion */ - /* bu_vls_strcat(log, " }"); */ + /* bu_vls_strcat(logstr, " }"); */ } bu_ptbl_free(&verts); } else if (!strcmp(attr, "V")) { @@ -2772,15 +2772,15 @@ NMG_CK_VERTEX(v); vg = v->vg_p; if (!vg) { - bu_vls_printf(log, "Vertex has no geometry\n"); + bu_vls_printf(logstr, "Vertex has no geometry\n"); bu_ptbl_free(&verts); return BRLCAD_ERROR; } - bu_vls_printf(log, " { %.25g %.25g %.25g }", V3ARGS(vg->coord)); + bu_vls_printf(logstr, " { %.25g %.25g %.25g }", V3ARGS(vg->coord)); } bu_ptbl_free(&verts); } else { - bu_vls_printf(log, "Unrecognized parameter\n"); + bu_vls_printf(logstr, "Unrecognized parameter\n"); return BRLCAD_ERROR; } @@ -2789,7 +2789,7 @@ int -rt_nmg_adjust(struct bu_vls *log, struct rt_db_internal *intern, int argc, char **argv) +rt_nmg_adjust(struct bu_vls *logstr, struct rt_db_internal *intern, int argc, char **argv) { struct model *m; struct nmgregion *r=NULL; @@ -2815,7 +2815,7 @@ obj = Tcl_NewStringObj(argv[i+1], -1); if (Tcl_ListObjGetElements(brlcad_interp, obj, &num_verts, &obj_array) != TCL_OK) { - bu_vls_printf(log, + bu_vls_printf(logstr, "ERROR: failed to parse vertex list\n"); Tcl_DecrRefCount(obj); return BRLCAD_ERROR; @@ -2828,7 +2828,7 @@ tmp = &verts[j].pt[0]; if (tcl_obj_to_fastf_array(brlcad_interp, obj_array[j], &tmp, &len) != 3) { - bu_vls_printf(log, + bu_vls_printf(logstr, "ERROR: incorrect number of coordinates for vertex\n"); return BRLCAD_ERROR; } @@ -2846,7 +2846,7 @@ goto cont; } else if (!strcmp(argv[0], "F")) { if (!verts) { - bu_vls_printf(log, + bu_vls_printf(logstr, "ERROR: cannot set faces without vertices\n"); return BRLCAD_ERROR; } @@ -2860,7 +2860,7 @@ obj = Tcl_NewStringObj(argv[1], -1); if (Tcl_ListObjGetElements(brlcad_interp, obj, &num_loops, &obj_array) != TCL_OK) { - bu_vls_printf(log, + bu_vls_printf(logstr, "ERROR: failed to parse face list\n"); Tcl_DecrRefCount(obj); return BRLCAD_ERROR; @@ -2873,7 +2873,7 @@ (void)tcl_obj_to_int_array(brlcad_interp, obj_array[i], &loop, &loop_len); if (!loop_len) { - bu_vls_printf(log, + bu_vls_printf(logstr, "ERROR: unable to parse face list\n"); return BRLCAD_ERROR; } @@ -2904,7 +2904,7 @@ } } } else { - bu_vls_printf(log, + bu_vls_printf(logstr, "ERROR: Unrecognized parameter, must be V or F\n"); return BRLCAD_ERROR; } Modified: brlcad/trunk/src/librt/primitives/pipe/pipe.c =================================================================== --- brlcad/trunk/src/librt/primitives/pipe/pipe.c 2009-12-28 14:28:09 UTC (rev 37036) +++ brlcad/trunk/src/librt/primitives/pipe/pipe.c 2009-12-28 14:52:33 UTC (rev 37037) @@ -3653,7 +3653,7 @@ * db get name N ==> get number of vertices */ int -rt_pipe_get(struct bu_vls *log, const struct rt_db_internal *intern, const char *attr) +rt_pipe_get(struct bu_vls *logstr, const struct rt_db_internal *intern, const char *attr) { register struct rt_pipe_internal *pipe=(struct rt_pipe_internal *)intern->idb_ptr; struct wdb_pipept *ptp; @@ -3667,11 +3667,11 @@ num_segs++; if (attr == (char *)NULL) { - bu_vls_strcat(log, "pipe"); + bu_vls_strcat(logstr, "pipe"); seg_no = 0; for (BU_LIST_FOR(ptp, wdb_pipept, &pipe->pipe_segs_head)) { - bu_vls_printf(log, " V%d { %.25G %.25G %.25G } O%d %.25G I%d %.25G R%d %.25G", + bu_vls_printf(logstr, " V%d { %.25G %.25G %.25G } O%d %.25G I%d %.25G R%d %.25G", seg_no, V3ARGS(ptp->pp_coord), seg_no, ptp->pp_od, seg_no, ptp->pp_id, @@ -3679,13 +3679,13 @@ seg_no++; } } else if (attr[0] == 'N') { - bu_vls_printf(log, "%d", num_segs); + bu_vls_printf(logstr, "%d", num_segs); } else { int curr_seg=0; seg_no = atoi(&attr[1]); if (seg_no < 0 || seg_no >= num_segs) { - bu_vls_printf(log, "segment number out of range (0 - %d)", num_segs-1); + bu_vls_printf(logstr, "segment number out of range (0 - %d)", num_segs-1); return BRLCAD_ERROR; } @@ -3698,26 +3698,26 @@ switch (attr[0]) { case 'V': - bu_vls_printf(log, "%.25G %.25G %.25G", V3ARGS(ptp->pp_coord)); + bu_vls_printf(logstr, "%.25G %.25G %.25G", V3ARGS(ptp->pp_coord)); break; case 'I': - bu_vls_printf(log, "%.25G", ptp->pp_id); + bu_vls_printf(logstr, "%.25G", ptp->pp_id); break; case 'O': - bu_vls_printf(log, "%.25G", ptp->pp_od); + bu_vls_printf(logstr, "%.25G", ptp->pp_od); break; case 'R': - bu_vls_printf(log, "%.25G", ptp->pp_bendradius); + bu_vls_printf(logstr, "%.25G", ptp->pp_bendradius); break; case 'P': - bu_vls_printf(log, " V%d { %.25G %.25G %.25G } I%d %.25G O%d %.25G R%d %.25G", + bu_vls_printf(logstr, " V%d { %.25G %.25G %.25G } I%d %.25G O%d %.25G R%d %.25G", seg_no, V3ARGS(ptp->pp_coord), seg_no, ptp->pp_id, seg_no, ptp->pp_od, seg_no, ptp->pp_bendradius); break; default: - bu_vls_printf(log, "unrecognized attribute (%c), choices are V, I, O, R, or P", attr[0]); + bu_vls_printf(logstr, "unrecognized attribute (%c), choices are V, I, O, R, or P", attr[0]); return BRLCAD_ERROR; } } @@ -3727,7 +3727,7 @@ int -rt_pipe_adjust(struct bu_vls *log, struct rt_db_internal *intern, int argc, char **argv) +rt_pipe_adjust(struct bu_vls *logstr, struct rt_db_internal *intern, int argc, char **argv) { struct rt_pipe_internal *pipe; struct wdb_pipept *ptp; @@ -3755,7 +3755,7 @@ } if (!isdigit(argv[0][1])) { - bu_vls_printf(log, "no vertex number specified"); + bu_vls_printf(logstr, "no vertex number specified"); return BRLCAD_ERROR; } @@ -3780,7 +3780,7 @@ num_segs++; } if (seg_no < 0 || seg_no >= num_segs) { - bu_vls_printf(log, "vertex number out of range"); + bu_vls_printf(logstr, "vertex number out of range"); return BRLCAD_ERROR; } @@ -3801,21 +3801,21 @@ v_str = Tcl_GetStringFromObj(list, NULL); while (isspace(*v_str)) v_str++; if (*v_str == '\0') { - bu_vls_printf(log, "incomplete vertex specification"); + bu_vls_printf(logstr, "incomplete vertex specification"); Tcl_DecrRefCount(list); return BRLCAD_ERROR; } ptp->pp_coord[0] = atof(v_str); v_str = bu_next_token(v_str); if (*v_str == '\0') { - bu_vls_printf(log, "incomplete vertex specification"); + bu_vls_printf(logstr, "incomplete vertex specification"); Tcl_DecrRefCount(list); return BRLCAD_ERROR; } ptp->pp_coord[1] = atof(v_str); v_str = bu_next_token(v_str); if (*v_str == '\0') { - bu_vls_printf(log, "incomplete vertex specification"); + bu_vls_printf(logstr, "incomplete vertex specification"); Tcl_DecrRefCount(list); return BRLCAD_ERROR; } @@ -3828,7 +3828,7 @@ case 'O': tmp = atof(argv[1]); if (tmp <= 0.0) { - bu_vls_printf(log, "outer diameter cannot be 0.0 or less"); + bu_vls_printf(logstr, "outer diameter cannot be 0.0 or less"); return BRLCAD_ERROR; } ptp->pp_od = tmp; @@ -3837,7 +3837,7 @@ ptp->pp_bendradius = atof(argv[1]); break; default: - bu_vls_printf(log, "unrecognized attribute, choices are V, I, O, or R"); + bu_vls_printf(logstr, "unrecognized attribute, choices are V, I, O, or R"); return BRLCAD_ERROR; } Modified: brlcad/trunk/src/librt/primitives/sketch/sketch.c =================================================================== --- brlcad/trunk/src/librt/primitives/sketch/sketch.c 2009-12-28 14:28:09 UTC (rev 37036) +++ brlcad/trunk/src/librt/primitives/sketch/sketch.c 2009-12-28 14:52:33 UTC (rev 37037) @@ -2034,66 +2034,66 @@ } -int rt_sketch_form(struct bu_vls *log, const struct rt_functab *ftp) +int rt_sketch_form(struct bu_vls *logstr, const struct rt_functab *ftp) { - BU_CK_VLS(log); + BU_CK_VLS(logstr); RT_CK_FUNCTAB(ftp); - bu_vls_printf(log, "V {%%f %%f %%f} A {%%f %%f %%f} B {%%f %%f %%f} VL {{%%f %%f} {%%f %%f} ...} SL {{segment_data} {segment_data}}"); + bu_vls_printf(logstr, "V {%%f %%f %%f} A {%%f %%f %%f} B {%%f %%f %%f} VL {{%%f %%f} {%%f %%f} ...} SL {{segment_data} {segment_data}}"); return BRLCAD_OK; } int -rt_sketch_get(struct bu_vls *log, const struct rt_db_internal *intern, const char *attr) +rt_sketch_get(struct bu_vls *logstr, const struct rt_db_internal *intern, const char *attr) { register struct rt_sketch_internal *skt=(struct rt_sketch_internal *)intern->idb_ptr; int i; struct curve *crv; - BU_CK_VLS(log); + BU_CK_VLS(logstr); RT_SKETCH_CK_MAGIC(skt); if (attr == (char *)NULL) { - bu_vls_strcpy(log, "sketch"); - bu_vls_printf(log, " V {%.25g %.25g %.25g}", V3ARGS(skt->V)); - bu_vls_printf(log, " A {%.25g %.25g %.25g}", V3ARGS(skt->u_vec)); - bu_vls_printf(log, " B {%.25g %.25g %.25g}", V3ARGS(skt->v_vec)); - bu_vls_strcat(log, " VL {"); + bu_vls_strcpy(logstr, "sketch"); + bu_vls_printf(logstr, " V {%.25g %.25g %.25g}", V3ARGS(skt->V)); + bu_vls_printf(logstr, " A {%.25g %.25g %.25g}", V3ARGS(skt->u_vec)); + bu_vls_printf(logstr, " B {%.25g %.25g %.25g}", V3ARGS(skt->v_vec)); + bu_vls_strcat(logstr, " VL {"); for (i=0; i<skt->vert_count; i++) - bu_vls_printf(log, " {%.25g %.25g}", V2ARGS(skt->verts[i])); - bu_vls_strcat(log, " }"); + bu_vls_printf(logstr, " {%.25g %.25g}", V2ARGS(skt->verts[i])); + bu_vls_strcat(logstr, " }"); crv = &skt->skt_curve; - if (curve_to_tcl_list(log, crv)) { + if (curve_to_tcl_list(logstr, crv)) { return BRLCAD_ERROR; } } else if (!strcmp(attr, "V")) { - bu_vls_printf(log, "%.25g %.25g %.25g", V3ARGS(skt->V)); + bu_vls_printf(logstr, "%.25g %.25g %.25g", V3ARGS(skt->V)); } else if (!strcmp(attr, "A")) { - bu_vls_printf(log, "%.25g %.25g %.25g", V3ARGS(skt->u_vec)); + bu_vls_printf(logstr, "%.25g %.25g %.25g", V3ARGS(skt->u_vec)); } else if (!strcmp(attr, "B")) { - bu_vls_printf(log, "%.25g %.25g %.25g", V3ARGS(skt->v_vec)); + bu_vls_printf(logstr, "%.25g %.25g %.25g", V3ARGS(skt->v_vec)); } else if (!strcmp(attr, "VL")) { for (i=0; i<skt->vert_count; i++) - bu_vls_printf(log, " {%.25g %.25g}", V2ARGS(skt->verts[i])); + bu_vls_printf(logstr, " {%.25g %.25g}", V2ARGS(skt->verts[i])); } else if (!strcmp(attr, "SL")) { crv = &skt->skt_curve; - if (curve_to_tcl_list(log, crv)) { + if (curve_to_tcl_list(logstr, crv)) { return BRLCAD_ERROR; } } else if (*attr == 'V') { i = atoi((attr+1)); if (i < 0 || i >= skt->vert_count) { - bu_vls_printf(log, "ERROR: Illegal vertex number\n"); + bu_vls_printf(logstr, "ERROR: Illegal vertex number\n"); return BRLCAD_ERROR; } - bu_vls_printf(log, "%.25g %.25g", V2ARGS(skt->verts[i])); + bu_vls_printf(logstr, "%.25g %.25g", V2ARGS(skt->verts[i])); } else { /* unrecognized attribute */ - bu_vls_printf(log, "ERROR: Unknown attribute, choices are V, A, B, VL, SL, or V#\n"); + bu_vls_printf(logstr, "ERROR: Unknown attribute, choices are V, A, B, VL, SL, or V#\n"); return BRLCAD_ERROR; } @@ -2273,7 +2273,7 @@ int -rt_sketch_adjust(struct bu_vls *log, struct rt_db_internal *intern, int argc, char **argv) +rt_sketch_adjust(struct bu_vls *logstr, struct rt_db_internal *intern, int argc, char **argv) { struct rt_sketch_internal *skt; int ret, array_len; @@ -2289,7 +2289,7 @@ array_len = 3; if (tcl_list_to_fastf_array(brlcad_interp, argv[1], &new, &array_len) != array_len) { - bu_vls_printf(log, "ERROR: Incorrect number of coordinates for vertex\n"); + bu_vls_printf(logstr, "ERROR: Incorrect number of coordinates for vertex\n"); return BRLCAD_ERROR; } } else if (!strcmp(argv[0], "A")) { @@ -2297,7 +2297,7 @@ array_len = 3; if (tcl_list_to_fastf_array(brlcad_interp, argv[1], &new, &array_len) != array_len) { - bu_vls_printf(log, "ERROR: Incorrect number of coordinates for vertex\n"); + bu_vls_printf(logstr, "ERROR: Incorrect number of coordinates for vertex\n"); return BRLCAD_ERROR; } } else if (!strcmp(argv[0], "B")) { @@ -2305,7 +2305,7 @@ array_len = 3; if (tcl_list_to_fastf_array(brlcad_interp, argv[1], &new, &array_len) != array_len) { - bu_vls_printf(log, "ERROR: Incorrect number of coordinates for vertex\n"); + bu_vls_printf(logstr, "ERROR: Incorrect number of coordinates for vertex\n"); return BRLCAD_ERROR; } } else if (!strcmp(argv[0], "VL")) { @@ -2326,7 +2326,7 @@ len = 0; (void)tcl_list_to_fastf_array(brlcad_interp, argv[1], &new_verts, &len); if (len%2) { - bu_vls_printf(log, "ERROR: Incorrect number of coordinates for vertices\n"); + bu_vls_printf(logstr, "ERROR: Incorrect number of coordinates for vertices\n"); return BRLCAD_ERROR; } @@ -2357,12 +2357,12 @@ vert_no = atoi(argv[0] + 1); new_vert = skt->verts[vert_no]; if (vert_no < 0 || vert_no > skt->vert_count) { - bu_vls_printf(log, "ERROR: Illegal vertex number\n"); + bu_vls_printf(logstr, "ERROR: Illegal vertex number\n"); return BRLCAD_ERROR; } array_len = 2; if (tcl_list_to_fastf_array(brlcad_interp, argv[1], &new_vert, &array_len) != array_len) { - bu_vls_printf(log, "ERROR: Incorrect number of coordinates for vertex\n"); + bu_vls_printf(logstr, "ERROR: Incorrect number of coordinates for vertex\n"); return BRLCAD_ERROR; } } Modified: brlcad/trunk/src/librt/primitives/table.c =================================================================== --- brlcad/trunk/src/librt/primitives/table.c 2009-12-28 14:28:09 UTC (rev 37036) +++ brlcad/trunk/src/librt/primitives/table.c 2009-12-28 14:52:33 UTC (rev 37037) @@ -66,8 +66,8 @@ BU_EXTERN(int rt_##name##_import4, (struct rt_db_internal *ip, const struct bu_external *ep, const mat_t mat, const struct db_i *dbip, struct resource *resp)); \ BU_EXTERN(int rt_##name##_export4, (struct bu_external *ep, const struct rt_db_internal *ip, double local2mm, const struct db_i *dbip, struct resource *resp)); \ BU_EXTERN(void rt_##name##_ifree, (struct rt_db_internal *ip)); \ - BU_EXTERN(int rt_##name##_get, (struct bu_vls *log, const struct rt_db_internal *intern, const char *attr)); \ - BU_EXTERN(int rt_##name##_adjust, (struct bu_vls *log, struct rt_db_internal *intern, int argc, char **argv)); \ + BU_EXTERN(int rt_##name##_get, (struct bu_vls *logstr, const struct rt_db_internal *intern, const char *attr)); \ + BU_EXTERN(int rt_##name##_adjust, (struct bu_vls *logstr, struct rt_db_internal *intern, int argc, char **argv)); \ BU_EXTERN(int rt_##name##_describe, (struct bu_vls *str, const struct rt_db_internal *ip, int verbose, double mm2local, struct resource *resp, struct db_i *db_i)); \ BU_EXTERN(void rt_##name##_make, (const struct rt_functab *ftp, struct rt_db_internal *intern)); \ BU_EXTERN(int rt_##name##_xform, (struct rt_db_internal *op, const mat_t mat, struct rt_db_internal *ip, int free, struct db_i *dbip, struct resource *resp)); \ @@ -213,26 +213,26 @@ const struct rt_db_internal *ip, int verbose, double mm2local, struct resource *resp, struct db_i *db_i)); BU_EXTERN(void rt_binunif_make, (const struct rt_functab *ftp, struct rt_db_internal *intern)); -BU_EXTERN(int rt_binunif_get, (struct bu_vls *log, const struct rt_db_internal *intern, const char *attr)); -BU_EXTERN(int rt_binunif_adjust, (struct bu_vls *log, struct rt_db_internal *intern, int argc, char **argv)); +BU_EXTERN(int rt_binunif_get, (struct bu_vls *logstr, const struct rt_db_internal *intern, const char *attr)); +BU_EXTERN(int rt_binunif_adjust, (struct bu_vls *logstr, struct rt_db_internal *intern, int argc, char **argv)); /* from tcl.c and db5_comb.c */ BU_EXTERN(int rt_comb_export5, (struct bu_external *ep, const struct rt_db_internal *ip, double local2mm, const struct db_i *dbip, struct resource *resp)); BU_EXTERN(int rt_comb_import5, (struct rt_db_internal *ip, const struct bu_external *ep, const mat_t mat, const struct db_i *dbip, struct resource *resp)); -BU_EXTERN(int rt_comb_get, (struct bu_vls *log, const struct rt_db_internal *intern, const char *item)); -BU_EXTERN(int rt_comb_adjust, (struct bu_vls *log, struct rt_db_internal *intern, int argc, char **argv)); -BU_EXTERN(int rt_comb_form, (struct bu_vls *log, const struct rt_functab *ftp)); +BU_EXTERN(int rt_comb_get, (struct bu_vls *logstr, const struct rt_db_internal *intern, const char *item)); +BU_EXTERN(int rt_comb_adjust, (struct bu_vls *logstr, struct rt_db_internal *intern, int argc, char **argv)); +BU_EXTERN(int rt_comb_form, (struct bu_vls *logstr, const struct rt_functab *ftp)); BU_EXTERN(void rt_comb_make, (const struct rt_functab *ftp, struct rt_db_internal *intern)); BU_EXTERN(void rt_comb_ifree, (struct rt_db_internal *ip)); /* generics for solid */ -BU_EXTERN(int rt_parsetab_get, (struct bu_vls *log, const struct rt_db_internal *intern, const char *attr)); -BU_EXTERN(int rt_parsetab_adjust, (struct bu_vls *log, struct rt_db_internal *intern, int argc, char **argv)); -BU_EXTERN(int rt_parsetab_form, (struct bu_vls *log, const struct rt_functab *ftp)); +BU_EXTERN(int rt_parsetab_get, (struct bu_vls *logstr, const struct rt_db_internal *intern, const char *attr)); +BU_EXTERN(int rt_parsetab_adjust, (struct bu_vls *logstr, struct rt_db_internal *intern, int argc, char **argv)); +BU_EXTERN(int rt_parsetab_form, (struct bu_vls *logstr, const struct rt_functab *ftp)); BU_EXTERN(void rt_generic_make, (const struct rt_functab *ftp, struct rt_db_internal *intern)); /* EBM solid */ -BU_EXTERN(int rt_ebm_form, (struct bu_vls *log, const struct rt_functab *ftp)); +BU_EXTERN(int rt_ebm_form, (struct bu_vls *logstr, const struct rt_functab *ftp)); BU_EXTERN(void rt_ebm_make, (const struct rt_functab *, struct rt_db_internal *)); /* DSP solid */ @@ -242,16 +242,16 @@ BU_EXTERN(void rt_nmg_make, (const struct rt_functab *, struct rt_db_internal *)); /* BOT solid */ -BU_EXTERN(int rt_bot_form, (struct bu_vls *log, const struct rt_functab *ftp)); +BU_EXTERN(int rt_bot_form, (struct bu_vls *logstr, const struct rt_functab *ftp)); /* SKETCH */ -BU_EXTERN(int rt_sketch_form, (struct bu_vls *log, const struct rt_functab *ftp)); +BU_EXTERN(int rt_sketch_form, (struct bu_vls *logstr, const struct rt_functab *ftp)); /* CLINE */ -BU_EXTERN(int rt_cline_form, (struct bu_vls *log, const struct rt_functab *ftp)); +BU_EXTERN(int rt_cline_form, (struct bu_vls *logstr, const struct rt_functab *ftp)); /* EXTRUSION */ -BU_EXTERN(int rt_extrude_form, (struct bu_vls *log, const struct rt_functab *ftp)); +BU_EXTERN(int rt_extrude_form, (struct bu_vls *logstr, const struct rt_functab *ftp)); /* PNTS */ @@ -259,16 +259,16 @@ BU_EXTERN(int rt_generic_xform, (struct rt_db_internal *op, const mat_t mat, struct rt_db_internal *ip, int free, struct db_i *dbip, struct resource *resp)); /* Stub Tcl interfaces */ -int rt_nul_get(struct bu_vls *log, const struct rt_db_internal *intern, const char *attr) { - bu_vls_printf(log, "rt_nul_get"); +int rt_nul_get(struct bu_vls *logstr, const struct rt_db_internal *intern, const char *attr) { + bu_vls_printf(logstr, "rt_nul_get"); return BRLCAD_ERROR; } -int rt_nul_adjust(struct bu_vls *log, struct rt_db_internal *intern, int argc, char **argv) { - bu_vls_printf(log, "rt_nul_adjust"); +int rt_nul_adjust(struct bu_vls *logstr, struct rt_db_internal *intern, int argc, char **argv) { + bu_vls_printf(logstr, "rt_nul_adjust"); return BRLCAD_ERROR; } -int rt_nul_form(struct bu_vls *log, const struct rt_functab *ftp) { - bu_vls_printf(log, "rt_nul_form"); +int rt_nul_form(struct bu_vls *logstr, const struct rt_functab *ftp) { + bu_vls_printf(logstr, "rt_nul_form"); return BRLCAD_ERROR; } Modified: brlcad/trunk/src/librt/tcl.c =================================================================== --- brlcad/trunk/src/librt/tcl.c 2009-12-28 14:28:09 UTC (rev 37036) +++ brlcad/trunk/src/librt/tcl.c 2009-12-28 14:52:33 UTC (rev 37037) @@ -1043,12 +1043,7 @@ * Invoked via rt_functab[ID_COMBINATION].ft_tcladjust() */ int -rt_comb_adjust( - struct bu_vls *log, - struct rt_db_internal *intern, - int argc, - char **argv, - struct resource *resp) +rt_comb_adjust(struct bu_vls *logstr, struct rt_db_internal *intern, int argc, char **argv) { struct rt_comb_internal *comb; char buf[128]; @@ -1137,7 +1132,7 @@ i = sscanf(argv[1], "%u %u %u", &r, &g, &b); if (i != 3) { - bu_vls_printf(log, "adjust rgb %s: not valid rgb 3-tuple\n", argv[1]); + bu_vls_printf(logstr, "adjust rgb %s: not valid rgb 3-tuple\n", argv[1]); return BRLCAD_ERROR; } comb->rgb[0] = (unsigned char)r; @@ -1183,9 +1178,9 @@ } comb->tree = TREE_NULL; } else { - new = db_tree_parse(log, argv[1], resp); + new = db_tree_parse(logstr, argv[1], resp); if (new == TREE_NULL) { - bu_vls_printf(log, "db adjust tree: bad tree '%s'\n", argv[1]); + bu_vls_printf(logstr, "db adjust tree: bad tree '%s'\n", argv[1]); return BRLCAD_ERROR; } if (comb->tree) @@ -1193,7 +1188,7 @@ comb->tree = new; } } else { - bu_vls_printf(log, "db adjust %s : no such attribute", buf); + bu_vls_printf(logstr, "db adjust %s : no such attribute", buf); return BRLCAD_ERROR; } argc -= 2; @@ -1203,7 +1198,7 @@ return BRLCAD_OK; not_region: - bu_vls_printf(log, "adjusting attribute %s is not valid for a non-region combination.", buf); + bu_vls_printf(logstr, "adjusting attribute %s is not valid for a non-region combination.", buf); return BRLCAD_ERROR; } @@ -1305,7 +1300,7 @@ * all. Example: "db get ell.s B" to get only the B vector. */ int -rt_parsetab_get(struct bu_vls *log, const struct rt_db_internal *intern, const char *attr) +rt_parsetab_get(struct bu_vls *logstr, const struct rt_db_internal *intern, const char *attr) { register const struct bu_structparse *sp = NULL; register const struct rt_functab *ftp; @@ -1316,7 +1311,7 @@ sp = ftp->ft_parsetab; if (!sp) { - bu_vls_printf(log, + bu_vls_printf(logstr, "%s {a Tcl output routine for this type of object has not yet been implemented}", ftp->ft_label); return BRLCAD_ERROR; @@ -1328,20 +1323,20 @@ bu_vls_init(&str); /* Print out solid type and all attributes */ - bu_vls_printf(log, "%s", ftp->ft_label); + bu_vls_printf(logstr, "%s", ftp->ft_label); while (sp->sp_name != NULL) { - bu_vls_printf(log, " %s", sp->sp_name); + bu_vls_printf(logstr, " %s", sp->sp_name); bu_vls_trunc(&str, 0); bu_vls_struct_item(&str, sp, (char *)intern->idb_ptr, ' '); if (sp->sp_count < 2) - bu_vls_printf(log, " %V", &str); + bu_vls_printf(logstr, " %V", &str); else { - bu_vls_printf(log, " {"); - bu_vls_printf(log, "%V", &str); - bu_vls_printf(log, "} "); + bu_vls_printf(logstr, " {"); + bu_vls_printf(logstr, "%V", &str); + bu_vls_printf(logstr, "} "); } ++sp; @@ -1349,8 +1344,8 @@ bu_vls_free(&str); } else { - if (bu_vls_struct_item_named(log, sp, attr, (char *)intern->idb_ptr, ' ') < 0) { - bu_vls_printf(log, + if (bu_vls_struct_item_named(logstr, sp, attr, (char *)intern->idb_ptr, ' ') < 0) { + bu_vls_printf(logstr, "Objects of type %s do not have a %s attribute.", ftp->ft_label, attr); return BRLCAD_ERROR; @@ -1365,11 +1360,11 @@ * R T _ C O M B _ F O R M */ int -rt_comb_form(struct bu_vls *log, const struct rt_functab *ftp) +rt_comb_form(struct bu_vls *logstr, const struct rt_functab *ftp) { RT_CK_FUNCTAB(ftp); - bu_vls_printf(log, + bu_vls_printf(logstr, "region {%%s} id {%%d} air {%%d} los {%%d} GIFTmater {%%d} rgb {%%d %%d %%d} \ shader {%%s} material {%%s} inherit {%%s} tree {%%s}"); @@ -1436,7 +1431,7 @@ * rt_functab[].ft_adjust() */ int -rt_parsetab_adjust(struct bu_vls *log, struct rt_db_internal *intern, int argc, char **argv) +rt_parsetab_adjust(struct bu_vls *logstr, struct rt_db_internal *intern, int argc, char **argv) { const struct rt_functab *ftp; @@ -1445,12 +1440,11 @@ RT_CK_FUNCTAB(ftp); if (ftp->ft_parsetab == (struct bu_structparse *)NULL) { - bu_vls_printf(log, "%s type objects do not yet have a 'db put' (adjust) handler.", ftp->ft_label); + bu_vls_printf(logstr, "%s type objects do not yet have a 'db put' (adjust) handler.", ftp->ft_label); return BRLCAD_ERROR; } - return bu_structparse_argv(log, argc, argv, ftp->ft_parsetab, - (char *)intern->idb_ptr); + return bu_structparse_argv(logstr, argc, argv, ftp->ft_parsetab, (char *)intern->idb_ptr); } @@ -1461,15 +1455,15 @@ * fully described by their bu_structparse table in ft_parsetab. */ int -rt_parsetab_form(struct bu_vls *log, const struct rt_functab *ftp) +rt_parsetab_form(struct bu_vls *logstr, const struct rt_functab *ftp) { RT_CK_FUNCTAB(ftp); if (ftp->ft_parsetab) { - bu_structparse_get_terse_form(log, ftp->ft_parsetab); + bu_structparse_get_terse_form(logstr, ftp->ft_parsetab); return BRLCAD_OK; } - bu_vls_printf(log, + bu_vls_printf(logstr, "%s is a valid object type, but a 'form' routine has not yet been implemented.", ftp->ft_label); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <br...@us...> - 2009-12-28 15:49:26
|
Revision: 37041 http://brlcad.svn.sourceforge.net/brlcad/?rev=37041&view=rev Author: brlcad Date: 2009-12-28 15:49:18 +0000 (Mon, 28 Dec 2009) Log Message: ----------- more resource fallout. rt_comb_adjust() needs a resource pointer to pass to db_free_tree() and db_tree_parse() so provide the uniresource. add a slew of nullity/resource parameter validations to public api (should never be required to pass a non-null resource) while we're at it. Modified Paths: -------------- brlcad/trunk/src/librt/db_tree.c brlcad/trunk/src/librt/tcl.c Modified: brlcad/trunk/src/librt/db_tree.c =================================================================== --- brlcad/trunk/src/librt/db_tree.c 2009-12-28 15:27:49 UTC (rev 37040) +++ brlcad/trunk/src/librt/db_tree.c 2009-12-28 15:49:18 UTC (rev 37041) @@ -110,6 +110,9 @@ db_init_db_tree_state(struct db_tree_state *tsp, struct db_i *dbip, struct resource *resp) { RT_CK_DBI(dbip); + if (!resp) { + resp = &rt_uniresource; + } RT_CK_RESOURCE(resp); memset((char *)tsp, 0, sizeof(*tsp)); @@ -550,6 +553,10 @@ union tree *subtree; RT_CK_TREE(tp); + if (!resp) { + resp = &rt_uniresource; + } + RT_CK_RESOURCE(resp); switch (tp->tr_op) { @@ -595,6 +602,10 @@ union tree *subtree; RT_CK_TREE(tp); + if (!resp) { + resp = &rt_uniresource; + } + RT_CK_RESOURCE(resp); switch (tp->tr_op) { @@ -663,6 +674,9 @@ if (*tp == TREE_NULL) return -1; RT_CK_TREE(*tp); + if (!resp) { + resp = &rt_uniresource; + } RT_CK_RESOURCE(resp); if ((parent = db_find_named_leafs_parent(&side, *tp, cp)) == TREE_NULL) { @@ -1352,6 +1366,9 @@ union tree *new; RT_CK_TREE(tp); + if (!resp) { + resp = &rt_uniresource; + } RT_CK_RESOURCE(resp); RT_GET_TREE(new, resp); @@ -1453,6 +1470,9 @@ db_free_tree(union tree *tp, struct resource *resp) { RT_CK_TREE(tp); + if (!resp) { + resp = &rt_uniresource; + } RT_CK_RESOURCE(resp); /* @@ -1594,6 +1614,9 @@ int repush_child=0; RT_CK_TREE(tp); + if (!resp) { + resp = &rt_uniresource; + } RT_CK_RESOURCE(resp); switch (tp->tr_op) { @@ -1929,6 +1952,9 @@ union tree *new; RT_CK_TREE(tp); + if (!resp) { + resp = &rt_uniresource; + } RT_CK_RESOURCE(resp); if (cur >= lim) bu_bomb("db_tally_subtree_regions: array overflow\n"); Modified: brlcad/trunk/src/librt/tcl.c =================================================================== --- brlcad/trunk/src/librt/tcl.c 2009-12-28 15:27:49 UTC (rev 37040) +++ brlcad/trunk/src/librt/tcl.c 2009-12-28 15:49:18 UTC (rev 37041) @@ -743,6 +743,7 @@ if (!resp) { resp = &rt_uniresource; } + RT_CK_RESOURCE(resp); /* Skip over leading spaces in input */ while (*str && isspace(*str)) str++; @@ -902,6 +903,11 @@ struct bu_vls logstr; union tree *tp; + if (!resp) { + resp = &rt_uniresource; + } + RT_CK_RESOURCE(resp); + bu_vls_init(&logstr); tp = db_tree_parse(&logstr, str, resp); Tcl_AppendResult(interp, bu_vls_addr(&logstr), (char *)NULL); @@ -1055,7 +1061,6 @@ double d; RT_CK_DB_INTERNAL(intern); - RT_CK_RESOURCE(resp); comb = (struct rt_comb_internal *)intern->idb_ptr; RT_CK_COMB(comb); @@ -1178,17 +1183,17 @@ if (*argv[1] == '\0' || strcmp(argv[1], "none") == 0) { if (comb->tree) { - db_free_tree(comb->tree, resp); + db_free_tree(comb->tree, &rt_uniresource); } comb->tree = TREE_NULL; } else { - new = db_tree_parse(logstr, argv[1], resp); + new = db_tree_parse(logstr, argv[1], &rt_uniresource); if (new == TREE_NULL) { bu_vls_printf(logstr, "db adjust tree: bad tree '%s'\n", argv[1]); return BRLCAD_ERROR; } if (comb->tree) - db_free_tree(comb->tree, resp); + db_free_tree(comb->tree, &rt_uniresource); comb->tree = new; } } else { This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <br...@us...> - 2010-01-02 19:22:26
|
Revision: 37110 http://brlcad.svn.sourceforge.net/brlcad/?rev=37110&view=rev Author: brlcad Date: 2010-01-02 19:22:15 +0000 (Sat, 02 Jan 2010) Log Message: ----------- awesome. with this commit, librt's C code is now free of all verbose compilation warnings (on 32-bit osx). quellage includes unused params/vars, shadows, and added tests. removed the ray parameter from rt_tcl_pr_hit(). Modified Paths: -------------- brlcad/trunk/src/librt/brep_test.cpp brlcad/trunk/src/librt/nurb_example.c brlcad/trunk/src/librt/primitives/xxx/xxx.c brlcad/trunk/src/librt/wdb.c Modified: brlcad/trunk/src/librt/brep_test.cpp =================================================================== --- brlcad/trunk/src/librt/brep_test.cpp 2010-01-02 19:05:31 UTC (rev 37109) +++ brlcad/trunk/src/librt/brep_test.cpp 2010-01-02 19:22:15 UTC (rev 37110) @@ -37,6 +37,9 @@ int main(int argc, char** argv) { + if (argc > 1) + printf("Usage: %s\n", argv[0]); + #ifdef __x86_vector__ printf("using x86 vectorization\n"); #elif defined(__fpu_vector__) @@ -45,34 +48,34 @@ { // test correctness - double _a[8] VEC_ALIGN = {0,1,2,3, 4, 5, 6, 7}; - double _b[8] VEC_ALIGN = {2,4,6,8,10,12,14,16}; + double _a[8] VEC_ALIGN = {0, 1, 2, 3, 4, 5, 6, 7}; + double _b[8] VEC_ALIGN = {2, 4, 6, 8, 10, 12, 14, 16}; dvec<8> a(_a, true); dvec<8> b(_b, true); dvec<8> c = a + b; - double _c[8] VEC_ALIGN = {2,5,8,11,14,17,20,23}; - assert( c == dvec<8>(_c,true) ); + double _c[8] VEC_ALIGN = {2, 5, 8, 11, 14, 17, 20, 23}; + assert(c == dvec<8>(_c, true)); dvec<8> d = a - b; - double _d[8] VEC_ALIGN = {-2,-3,-4,-5,-6,-7,-8,-9}; - assert( d == dvec<8>(_d,true) ); + double _d[8] VEC_ALIGN = {-2, -3, -4, -5, -6, -7, -8, -9}; + assert(d == dvec<8>(_d, true)); dvec<8> e = a * b; - double _e[8] VEC_ALIGN = {0,4,12,24,40,60,84,112}; - assert( e == dvec<8>(_e,true) ); + double _e[8] VEC_ALIGN = {0, 4, 12, 24, 40, 60, 84, 112}; + assert(e == dvec<8>(_e, true)); dvec<8> f = a / b; - double _f[8] VEC_ALIGN = {0,0.25,0.333333333333,0.375,0.40,0.4166666666,0.42857142,0.4375}; - assert( f == dvec<8>(_f,true) ); + double _f[8] VEC_ALIGN = {0, 0.25, 0.333333333333, 0.375, 0.40, 0.4166666666, 0.42857142, 0.4375}; + assert(f == dvec<8>(_f, true)); dvec<8> g = a.madd(c, b); - double _g[8] VEC_ALIGN = {2,9,22,41,66,97,134,177}; - assert( g == dvec<8>(_g,true) ); + double _g[8] VEC_ALIGN = {2, 9, 22, 41, 66, 97, 134, 177}; + assert(g == dvec<8>(_g, true)); - dvec<8> h = a.madd(2.0,b); - double _h[8] VEC_ALIGN = {2,6,10,14,18,22,26,30}; - assert( h == dvec<8>(_h,true) ); + dvec<8> h = a.madd(2.0, b); + double _h[8] VEC_ALIGN = {2, 6, 10, 14, 18, 22, 26, 30}; + assert(h == dvec<8>(_h, true)); srand(time(NULL)); double total = 0.0; @@ -97,46 +100,46 @@ clock_t start = clock(); for (int i = 0; i < COUNT; i++) { - double _a[8] VEC_ALIGN = {rval[i%8],rval[i%8+1],rval[i%8+2],rval[i%8+3], - rval[i%8+4],rval[i%8+5],rval[i%8+6],rval[i%8+7]}; - double _b[8] VEC_ALIGN = {rval[i%8+1],rval[i%8+2],rval[i%8+3],rval[i%8+4], - rval[i%8+5],rval[i%8+6],rval[i%8+7],rval[i%8+8]}; + double l_a[8] VEC_ALIGN = {rval[i%8], rval[i%8+1], rval[i%8+2], rval[i%8+3], + rval[i%8+4], rval[i%8+5], rval[i%8+6], rval[i%8+7]}; + double l_b[8] VEC_ALIGN = {rval[i%8+1], rval[i%8+2], rval[i%8+3], rval[i%8+4], + rval[i%8+5], rval[i%8+6], rval[i%8+7], rval[i%8+8]}; - dvec<8> a(_a,true); - dvec<8> b(_b,true); + dvec<8> la(l_a, true); + dvec<8> lb(l_b, true); - dvec<8> c = a + b; - dvec<8> d = c - a; - dvec<8> e = d * c; - dvec<8> f = e / a; - dvec<8> g = a.madd(rval[i%16],f); - dvec<8> h = g.madd(f, a+b*c-d/e*f); - total += h[7]; + dvec<8> lc = la + lb; + dvec<8> ld = lc - la; + dvec<8> le = ld * lc; + dvec<8> lf = le / la; + dvec<8> lg = la.madd(rval[i%16], lf); + dvec<8> lh = lg.madd(lf, la+lb*lc-ld/le*lf); + total += lh[7]; } printf("dvec<8> time: %3.4g\n", (double)(clock()-start)/(double)CLOCKS_PER_SEC); } /* test correctness */ - vec2d a(100.0,-100.0); - vec2d b(200.0,-200.0); + vec2d a(100.0, -100.0); + vec2d b(200.0, -200.0); vec2d c = a + b; - assert( vequals(c, vec2d(300.0,-300.0)) ); + assert(vequals(c, vec2d(300.0, -300.0))); vec2d d = a - b; - assert( vequals(d, vec2d(-100.0,100.0)) ); + assert(vequals(d, vec2d(-100.0, 100.0))); vec2d e = a * b; - assert( vequals(e, vec2d(20000.0,20000.0)) ); + assert(vequals(e, vec2d(20000.0, 20000.0))); vec2d f = b / a; - assert( vequals(f, vec2d(2.0,2.0)) ); + assert(vequals(f, vec2d(2.0, 2.0))); - vec2d g = a.madd(20.0,b); - assert( vequals(g, vec2d(2200.0, -2200.0)) ); + vec2d g = a.madd(20.0, b); + assert(vequals(g, vec2d(2200.0, -2200.0))); - vec2d h = a.madd(d,b); - assert( vequals(h, vec2d(-9800.0,-10200.0)) ); + vec2d h = a.madd(d, b); + assert(vequals(h, vec2d(-9800.0, -10200.0))); /* simple performance test */ @@ -162,16 +165,16 @@ clock_t start = clock(); for (int i = 0; i < COUNT; i++) { - vec2d a(rval[i%12], rval[i%12+2]); - vec2d b(rval[i%12+1], rval[i%12+3]); + vec2d la(rval[i%12], rval[i%12+2]); + vec2d lb(rval[i%12+1], rval[i%12+3]); - vec2d c = a + b; - vec2d d = c - a; - vec2d e = d * c; - vec2d f = e / a; - vec2d g = a.madd(rval[i%12],f); - vec2d h = g.madd(g, a + b - c + d - e + f); - total += h.x() + h.y(); + vec2d lc = la + lb; + vec2d ld = lc - la; + vec2d le = ld * lc; + vec2d lf = le / la; + vec2d lg = la.madd(rval[i%12], lf); + vec2d lh = lg.madd(lg, la + lb - lc + ld - le + lf); + total += lh.x() + lh.y(); } printf("vec2d time: %3.4g\n", (double)(clock()-start)/(double)CLOCKS_PER_SEC); Modified: brlcad/trunk/src/librt/nurb_example.c =================================================================== --- brlcad/trunk/src/librt/nurb_example.c 2010-01-02 19:05:31 UTC (rev 37109) +++ brlcad/trunk/src/librt/nurb_example.c 2010-01-02 19:22:15 UTC (rev 37110) @@ -47,70 +47,79 @@ struct face_g_snurb *srf2, *srf3; struct knot_vector new_kv; - rt_nurb_sinterp( &srf, 4, (const fastf_t *)grid, 10, 10 ); + rt_nurb_sinterp(&srf, 4, (const fastf_t *)grid, 10, 10); #if 0 /* Draw control mesh in blue */ - pl_color( stdout, 145, 145, 255 ); - rt_nurb_plot_snurb( stdout, &srf ); + pl_color(stdout, 145, 145, 255); + rt_nurb_plot_snurb(stdout, &srf); #endif #if 0 - rt_nurb_reverse_srf( &srf ); - rt_nurb_kvnorm( &srf.u ); - rt_nurb_kvnorm( &srf.v ); + rt_nurb_reverse_srf(&srf); + rt_nurb_kvnorm(&srf.u); + rt_nurb_kvnorm(&srf.v); #endif /* lets take a look at it. Refine to 100 points in both directions. */ - rt_nurb_kvknot( &new_kv, srf.order[0], 0.0, 1.0, 100, (struct resource *)NULL); - srf2 = (struct face_g_snurb *) rt_nurb_s_refine( &srf, 0, &new_kv, (struct resource *)NULL); - srf3 = (struct face_g_snurb *) rt_nurb_s_refine( srf2, 1, &new_kv, (struct resource *)NULL); + rt_nurb_kvknot(&new_kv, srf.order[0], 0.0, 1.0, 100, (struct resource *)NULL); + srf2 = (struct face_g_snurb *) rt_nurb_s_refine(&srf, 0, &new_kv, (struct resource *)NULL); + srf3 = (struct face_g_snurb *) rt_nurb_s_refine(srf2, 1, &new_kv, (struct resource *)NULL); /* Draw refined mesh in yellow */ - pl_color( stdout, 200, 200, 50 ); - rt_nurb_plot_snurb( stdout, srf3 ); + pl_color(stdout, 200, 200, 50); + rt_nurb_plot_snurb(stdout, srf3); } -int main(int argc, char *argv[]) + +int +main(int argc, char *argv[]) { fastf_t hscale; fastf_t v; int i, j; + if (argc > 1) + printf("Usage: %s\n", argv[0]); + hscale = 2.5; /* generate a 10 x 10 grid of random height data */ pl_color(stdout, 155, 55, 55); - for ( i = 0; i < 10; i++) - for ( j = 0; j < 10; j++) - { + for (i = 0; i < 10; i++) { + for (j = 0; j < 10; j++) { v = hscale * drand48() + 10.0; grid[i][j][0] = i; grid[i][j][1] = j; grid[i][j][2] = v; - pd_3move( stdout, - grid[i][j][0], grid[i][j][1], grid[i][j][2] - .14); - pd_3cont( stdout, - grid[i][j][0], grid[i][j][1], grid[i][j][2] + .14); + pd_3move(stdout, + grid[i][j][0], grid[i][j][1], grid[i][j][2] - .14); + pd_3cont(stdout, + grid[i][j][0], grid[i][j][1], grid[i][j][2] + .14); - pd_3move( stdout, - grid[i][j][0] - .14, grid[i][j][1], grid[i][j][2]); - pd_3cont( stdout, - grid[i][j][0] + .14, grid[i][j][1], grid[i][j][2] ); + pd_3move(stdout, + grid[i][j][0] - .14, grid[i][j][1], grid[i][j][2]); + pd_3cont(stdout, + grid[i][j][0] + .14, grid[i][j][1], grid[i][j][2]); - pd_3move( stdout, - grid[i][j][0], grid[i][j][1]-.14, grid[i][j][2]); - pd_3cont( stdout, - grid[i][j][0], grid[i][j][1]+.14, grid[i][j][2]); + pd_3move(stdout, + grid[i][j][0], grid[i][j][1]-.14, grid[i][j][2]); + pd_3cont(stdout, + grid[i][j][0], grid[i][j][1]+.14, grid[i][j][2]); } + } + interpolate_data(); + + return 0; } + /* * Local Variables: * mode: C Modified: brlcad/trunk/src/librt/primitives/xxx/xxx.c =================================================================== --- brlcad/trunk/src/librt/primitives/xxx/xxx.c 2010-01-02 19:05:31 UTC (rev 37109) +++ brlcad/trunk/src/librt/primitives/xxx/xxx.c 2010-01-02 19:22:15 UTC (rev 37110) @@ -91,6 +91,8 @@ if (stp) RT_CK_SOLTAB(stp); RT_CK_DB_INTERNAL(ip); + if (rtip) RT_CK_RTI(rtip); + xxx_ip = (struct rt_xxx_internal *)ip->idb_ptr; RT_XXX_CK_MAGIC(xxx_ip); @@ -129,11 +131,12 @@ struct xxx_specific *xxx; if (!stp) return -1; + RT_CK_SOLTAB(stp); xxx = (struct xxx_specific *)stp->st_specific; if (!xxx) return -1; - RT_CK_SOLTAB(stp); - if (rp) RT_CK_RAY(rp); + if (ap) RT_CK_APPLICATION(ap); + if (!seghead) return -1; /* the EXAMPLE_NEW_SEGMENT block shows how one might add a new result * if the ray did hit the primitive. the segment values would need to @@ -213,10 +216,13 @@ { struct xxx_specific *xxx; - if (!stp) return; + if (ap) RT_CK_APPLICATION(ap); + if (!stp || !uvp) return; + RT_CK_SOLTAB(stp); + if (hitp) RT_CK_HIT(hitp); + xxx = (struct xxx_specific *)stp->st_specific; if (!xxx) return; - RT_CK_SOLTAB(stp); } @@ -229,32 +235,23 @@ struct xxx_specific *xxx; if (!stp) return; + RT_CK_SOLTAB(stp); xxx = (struct xxx_specific *)stp->st_specific; if (!xxx) return; - RT_CK_SOLTAB(stp); bu_free((char *)xxx, "xxx_specific"); } /** - * R T _ X X X _ C L A S S - */ -int -rt_xxx_class(const struct soltab *stp, const vect_t min, const vect_t max, const struct bn_tol *tol) -{ - return RT_CLASSIFY_UNIMPLEMENTED; -} - - -/** * R T _ X X X _ P L O T */ int -rt_xxx_plot(struct bu_list *vhead, struct rt_db_internal *ip, const struct rt_tess_tol *ttol, const struct bn_tol *tol) +rt_xxx_plot(struct bu_list *vhead, struct rt_db_internal *ip, const struct rt_tess_tol *ttol __attribute__((unused)), const struct bn_tol *tol __attribute__((unused))) { struct rt_xxx_internal *xxx_ip; + if (!vhead) return -1; RT_CK_DB_INTERNAL(ip); xxx_ip = (struct rt_xxx_internal *)ip->idb_ptr; RT_XXX_CK_MAGIC(xxx_ip); @@ -271,10 +268,12 @@ * 0 OK. *r points to nmgregion that holds this tessellation. */ int -rt_xxx_tess(struct nmgregion **r, struct model *m, struct rt_db_internal *ip, const struct rt_tess_tol *ttol, const struct bn_tol *tol) +rt_xxx_tess(struct nmgregion **r, struct model *m, struct rt_db_internal *ip, const struct rt_tess_tol *ttol __attribute__((unused)), const struct bn_tol *tol __attribute__((unused))) { struct rt_xxx_internal *xxx_ip; + if (r) NMG_CK_REGION(*r); + if (m) NMG_CK_MODEL(m); RT_CK_DB_INTERNAL(ip); xxx_ip = (struct rt_xxx_internal *)ip->idb_ptr; RT_XXX_CK_MAGIC(xxx_ip); @@ -298,8 +297,9 @@ struct rt_xxx_internal *xxx_ip; fastf_t vv[ELEMENTS_PER_VECT*1]; - RT_CK_DB_INTERNAL(ip) - BU_CK_EXTERNAL(ep); + RT_CK_DB_INTERNAL(ip); + BU_CK_EXTERNAL(ep); + if (dbip) RT_CK_DBI(dbip); BU_ASSERT_LONG(ep->ext_nbytes, ==, SIZEOF_NETWORK_DOUBLE * 3*4); @@ -344,6 +344,7 @@ if (ip->idb_type != ID_XXX) return(-1); xxx_ip = (struct rt_xxx_internal *)ip->idb_ptr; RT_XXX_CK_MAGIC(xxx_ip); + if (dbip) RT_CK_DBI(dbip); BU_CK_EXTERNAL(ep); ep->ext_nbytes = SIZEOF_NETWORK_DOUBLE * ELEMENTS_PER_VECT; @@ -380,13 +381,16 @@ RT_XXX_CK_MAGIC(xxx_ip); bu_vls_strcat(str, "truncated general xxx (XXX)\n"); + if (!verbose) + return 0; + sprintf(buf, "\tV (%g, %g, %g)\n", INTCLAMP(xxx_ip->v[X] * mm2local), INTCLAMP(xxx_ip->v[Y] * mm2local), INTCLAMP(xxx_ip->v[Z] * mm2local)); bu_vls_strcat(str, buf); - return(0); + return 0; } @@ -412,19 +416,6 @@ } -/** - * R T _ X X X _ X F O R M - * - * Create transformed version of internal form. Free *ip if - * requested. Implement this if it's faster than doing an - * export/import4 cycle. - */ -int -rt_xxx_xform(struct rt_db_internal *op, const mat_t mat, struct rt_db_internal *ip, int free) -{ -} - - /* * Local Variables: * mode: C Modified: brlcad/trunk/src/librt/wdb.c =================================================================== --- brlcad/trunk/src/librt/wdb.c 2010-01-02 19:05:31 UTC (rev 37109) +++ brlcad/trunk/src/librt/wdb.c 2010-01-02 19:22:15 UTC (rev 37110) @@ -449,7 +449,7 @@ * BRLCAD_ERROR */ int -wdb_import_from_path2(struct bu_vls *log, struct rt_db_internal *ip, const char *path, struct rt_wdb *wdb, matp_t matp) +wdb_import_from_path2(struct bu_vls *logstr, struct rt_db_internal *ip, const char *path, struct rt_wdb *wdb, matp_t matp) { struct db_i *dbip; int status; @@ -472,7 +472,7 @@ db_full_path_init(&new_path); if (db_string_to_path(&new_path, dbip, path) < 0) { - bu_vls_printf(log, "wdb_import_from_path: '%s' contains unknown object names\n", path); + bu_vls_printf(logstr, "wdb_import_from_path: '%s' contains unknown object names\n", path); return BRLCAD_ERROR; } @@ -484,17 +484,17 @@ MAT_COPY(matp, ts.ts_mat); if (ret < 0) { - bu_vls_printf(log, "wdb_import_from_path: '%s' is a bad path\n", path); + bu_vls_printf(logstr, "wdb_import_from_path: '%s' is a bad path\n", path); return BRLCAD_ERROR; } status = wdb_import(wdb, ip, dp_curr->d_namep, ts.ts_mat); if (status == -4) { - bu_vls_printf(log, "%s not found in path %s\n", dp_curr->d_namep, path); + bu_vls_printf(logstr, "%s not found in path %s\n", dp_curr->d_namep, path); return BRLCAD_ERROR; } if (status < 0) { - bu_vls_printf(log, "wdb_import failure: %s", dp_curr->d_namep); + bu_vls_printf(logstr, "wdb_import failure: %s", dp_curr->d_namep); return BRLCAD_ERROR; } } else { @@ -502,11 +502,11 @@ status = wdb_import(wdb, ip, path, (matp_t)NULL); if (status == -4) { - bu_vls_printf(log, "%s: not found\n", path); + bu_vls_printf(logstr, "%s: not found\n", path); return BRLCAD_ERROR; } if (status < 0) { - bu_vls_printf(log, "wdb_import failure: %s", path); + bu_vls_printf(logstr, "wdb_import failure: %s", path); return BRLCAD_ERROR; } } @@ -527,11 +527,11 @@ * BRLCAD_ERROR */ int -wdb_import_from_path(struct bu_vls *log, struct rt_db_internal *ip, const char *path, struct rt_wdb *wdb) +wdb_import_from_path(struct bu_vls *logstr, struct rt_db_internal *ip, const char *path, struct rt_wdb *wdb) { mat_t mat; - return wdb_import_from_path2(log, ip, path, wdb, mat); + return wdb_import_from_path2(logstr, ip, path, wdb, mat); } @@ -567,7 +567,7 @@ * Notice that in most cases, this tree will be grossly unbalanced. */ void -wdb_tree_describe(struct bu_vls *log, const union tree *tp) +wdb_tree_describe(struct bu_vls *logstr, const union tree *tp) { if (!tp) return; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sta...@us...> - 2010-01-02 22:08:17
|
Revision: 37114 http://brlcad.svn.sourceforge.net/brlcad/?rev=37114&view=rev Author: starseeker Date: 2010-01-02 22:08:06 +0000 (Sat, 02 Jan 2010) Log Message: ----------- Quellage in librt on Gentoo linux - this isn't all of it but commit what I've done so far to see if I'm doing something The Wrong Way... - haven't tested yet because I haven't gotten a complete librt build yet. Modified Paths: -------------- brlcad/trunk/src/librt/db5_io.c brlcad/trunk/src/librt/db5_scan.c brlcad/trunk/src/librt/dir.c brlcad/trunk/src/librt/fortray.c brlcad/trunk/src/librt/prep.c brlcad/trunk/src/librt/primitives/arb8/arb8.c Modified: brlcad/trunk/src/librt/db5_io.c =================================================================== --- brlcad/trunk/src/librt/db5_io.c 2010-01-02 20:01:52 UTC (rev 37113) +++ brlcad/trunk/src/librt/db5_io.c 2010-01-02 22:08:06 UTC (rev 37114) @@ -1224,47 +1224,47 @@ struct resource *resp, const int major) { - struct bu_external attributes; - struct bu_external body; + struct bu_external *attributes; + struct bu_external *body; int minor; int ret; RT_CK_DB_INTERNAL( ip ); if (dbip) RT_CK_DBI(dbip); /* may be null */ RT_CK_RESOURCE(resp); - BU_INIT_EXTERNAL( &body ); + BU_INIT_EXTERNAL( body ); minor = ip->idb_type; /* XXX not necessarily v5 numbers. */ /* Scale change on export is 1.0 -- no change */ ret = -1; if (ip->idb_meth->ft_export5) { - ret = ip->idb_meth->ft_export5(&body, ip, conv2mm, dbip, resp); + ret = ip->idb_meth->ft_export5(body, ip, conv2mm, dbip, resp); } if (ret < 0) { bu_log("rt_db_cvt_to_external5(%s): ft_export5 failure\n", name); - bu_free_external( &body ); + bu_free_external( body ); BU_INIT_EXTERNAL(ext); return -1; /* FAIL */ } - BU_CK_EXTERNAL( &body ); + BU_CK_EXTERNAL( body ); /* If present, convert attributes to on-disk format. */ if ( ip->idb_avs.magic == BU_AVS_MAGIC ) { - db5_export_attributes( &attributes, &ip->idb_avs ); - BU_CK_EXTERNAL( &attributes ); + db5_export_attributes( attributes, &ip->idb_avs ); + BU_CK_EXTERNAL( attributes ); } else { - BU_INIT_EXTERNAL(&attributes); + BU_INIT_EXTERNAL(attributes); } db5_export_object3( ext, DB5HDR_HFLAGS_DLI_APPLICATION_DATA_OBJECT, - name, 0, &attributes, &body, + name, 0, attributes, body, major, minor, DB5_ZZZ_UNCOMPRESSED, DB5_ZZZ_UNCOMPRESSED ); BU_CK_EXTERNAL( ext ); - bu_free_external( &body ); - bu_free_external( &attributes ); + bu_free_external( body ); + bu_free_external( attributes ); return 0; /* OK */ } @@ -1409,7 +1409,7 @@ struct resource *resp, const int major) { - struct bu_external ext; + struct bu_external *ext; RT_CK_DIR(dp); RT_CK_DBI(dbip); @@ -1418,36 +1418,37 @@ BU_ASSERT_LONG( dbip->dbi_version, ==, 5 ); - if ( rt_db_cvt_to_external5( &ext, dp->d_namep, ip, 1.0, dbip, resp, major ) < 0 ) { + if ( rt_db_cvt_to_external5( ext, dp->d_namep, ip, 1.0, dbip, resp, major ) < 0 ) { bu_log("rt_db_put_internal5(%s): export failure\n", dp->d_namep); goto fail; } - BU_CK_EXTERNAL( &ext ); + BU_INIT_EXTERNAL( ext ); + BU_CK_EXTERNAL( ext ); - if ( ext.ext_nbytes != dp->d_len || dp->d_addr == RT_DIR_PHONY_ADDR ) { - if ( db5_realloc( dbip, dp, &ext ) < 0 ) { + if ( ext->ext_nbytes != dp->d_len || dp->d_addr == RT_DIR_PHONY_ADDR ) { + if ( db5_realloc( dbip, dp, ext ) < 0 ) { bu_log("rt_db_put_internal5(%s) db_realloc5() failed\n", dp->d_namep); goto fail; } } - BU_ASSERT_LONG( ext.ext_nbytes, ==, dp->d_len ); + BU_ASSERT_LONG( ext->ext_nbytes, ==, dp->d_len ); if ( dp->d_flags & RT_DIR_INMEM ) { - memcpy(dp->d_un.ptr, ext.ext_buf, ext.ext_nbytes); + memcpy(dp->d_un.ptr, ext->ext_buf, ext->ext_nbytes); goto ok; } - if ( db_write( dbip, (char *)ext.ext_buf, ext.ext_nbytes, dp->d_addr ) < 0 ) { + if ( db_write( dbip, (char *)ext->ext_buf, ext->ext_nbytes, dp->d_addr ) < 0 ) { goto fail; } ok: - bu_free_external( &ext ); + bu_free_external( ext ); rt_db_free_internal(ip); return 0; /* OK */ fail: - bu_free_external( &ext ); + bu_free_external( ext ); rt_db_free_internal(ip); return -2; /* FAIL */ } Modified: brlcad/trunk/src/librt/db5_scan.c =================================================================== --- brlcad/trunk/src/librt/db5_scan.c 2010-01-02 20:01:52 UTC (rev 37113) +++ brlcad/trunk/src/librt/db5_scan.c 2010-01-02 22:08:06 UTC (rev 37114) @@ -356,10 +356,10 @@ struct directory *dp; struct bu_external ext; struct db5_raw_internal raw; - struct bu_attribute_value_set avs; + struct bu_attribute_value_set *avs; const char *cp; - bu_avs_init_empty(&avs); + bu_avs_init_empty(avs); /* File is v5 format */ dbip->dbi_version = 5; @@ -390,21 +390,21 @@ dbip->dbi_title = bu_strdup(DB5_GLOBAL_OBJECT_NAME); return 0; /* not a fatal error, need to let user proceed to fix it */ } - if (db5_import_attributes(&avs, &raw.attributes) < 0) { + if (db5_import_attributes(avs, &raw.attributes) < 0) { bu_log("db_dirbuild(%s): improper database, corrupted attribute-only %s object\n", dbip->dbi_filename, DB5_GLOBAL_OBJECT_NAME); bu_free_external(&ext); return -1; /* this is fatal */ } - BU_CK_AVS(&avs); + BU_CK_AVS(avs); /* Parse out the attributes */ - if ((cp = bu_avs_get(&avs, "title")) != NULL) { + if ((cp = bu_avs_get(avs, "title")) != NULL) { dbip->dbi_title = bu_strdup(cp); } else { dbip->dbi_title = bu_strdup("Untitled BRL-CAD database"); } - if ((cp = bu_avs_get(&avs, "units")) != NULL) { + if ((cp = bu_avs_get(avs, "units")) != NULL) { double dd; if (sscanf(cp, "%lf", &dd) != 1 || NEAR_ZERO(dd, VUNITIZE_TOL)) { bu_log("db_dirbuild(%s): improper database, %s object attribute 'units'=%s is invalid\n", @@ -415,11 +415,11 @@ dbip->dbi_base2local = 1/dd; } } - if ((cp = bu_avs_get(&avs, "regionid_colortable")) != NULL) { + if ((cp = bu_avs_get(avs, "regionid_colortable")) != NULL) { /* Import the region-id coloring table */ db5_import_color_table((char *)cp); } - bu_avs_free(&avs); + bu_avs_free(avs); bu_free_external(&ext); /* not until after done with avs! */ return 0; } Modified: brlcad/trunk/src/librt/dir.c =================================================================== --- brlcad/trunk/src/librt/dir.c 2010-01-02 20:01:52 UTC (rev 37113) +++ brlcad/trunk/src/librt/dir.c 2010-01-02 22:08:06 UTC (rev 37114) @@ -205,32 +205,32 @@ const struct rt_db_internal *ip, double conv2mm ) { - struct bu_external ext; + struct bu_external *ext; int ret; RT_CK_DB_INTERNAL(ip); RT_CK_FUNCTAB( ip->idb_meth ); - BU_INIT_EXTERNAL( &ext ); + BU_INIT_EXTERNAL( ext ); ret = -1; if (ip->idb_meth->ft_export4) { - ret = ip->idb_meth->ft_export4(&ext, ip, conv2mm, NULL /*dbip*/, &rt_uniresource); + ret = ip->idb_meth->ft_export4(ext, ip, conv2mm, NULL /*dbip*/, &rt_uniresource); } if (ret < 0) { bu_log("rt_file_put_internal(%s): solid export failure\n", name ); - bu_free_external( &ext ); + bu_free_external( ext ); return(-2); /* FAIL */ } - BU_CK_EXTERNAL( &ext ); + BU_CK_EXTERNAL( ext ); - if ( db_fwrite_external( fp, name, &ext ) < 0 ) { + if ( db_fwrite_external( fp, name, ext ) < 0 ) { bu_log("rt_fwrite_internal(%s): db_fwrite_external() error\n", name ); - bu_free_external( &ext ); + bu_free_external( ext ); return(-3); } - bu_free_external( &ext ); + bu_free_external( ext ); return(0); } Modified: brlcad/trunk/src/librt/fortray.c =================================================================== --- brlcad/trunk/src/librt/fortray.c 2010-01-02 20:01:52 UTC (rev 37113) +++ brlcad/trunk/src/librt/fortray.c 2010-01-02 22:08:06 UTC (rev 37114) @@ -292,21 +292,22 @@ double *dir __attribute__((unused))) { register struct context *ctp; - struct hit hit; + struct hit *hit = HIT_NULL; struct soltab *stp; register int i; i = *idx - 1; /* Selects which inhit is used */ /* Reconstruct the hit structure */ - hit.hit_dist = indist[i]; + hit->hit_dist = indist[i]; ctp = &context[i]; stp = ctp->co_stp; - VMOVE( hit.hit_vpriv, ctp->co_vpriv ); - hit.hit_private = ctp->co_priv; + VMOVE( hit->hit_vpriv, ctp->co_vpriv ); + hit->hit_private = ctp->co_priv; /* The new macro doesn't use ray argument */ - RT_HIT_NORMAL( normal, &hit, stp, NULL, ctp->co_inflip ); + RT_HIT_NORMAL( normal, hit, stp, NULL, ctp->co_inflip ); + bu_free(hit, "free hit struct"); } Modified: brlcad/trunk/src/librt/prep.c =================================================================== --- brlcad/trunk/src/librt/prep.c 2010-01-02 20:01:52 UTC (rev 37113) +++ brlcad/trunk/src/librt/prep.c 2010-01-02 22:08:06 UTC (rev 37114) @@ -515,25 +515,25 @@ const struct soltab *stp, struct resource *resp) { - struct rt_db_internal intern; + struct rt_db_internal *intern; int ret; - if (rt_db_get_internal(&intern, stp->st_dp, rtip->rti_dbip, stp->st_matp, resp) < 0) { + if (rt_db_get_internal(intern, stp->st_dp, rtip->rti_dbip, stp->st_matp, resp) < 0) { bu_log("rt_vlist_solid(%s): rt_db_get_internal() failed\n", stp->st_name); return(-1); /* FAIL */ } - RT_CK_DB_INTERNAL(&intern); + RT_CK_DB_INTERNAL(intern); ret = -1; - if (rt_functab[intern.idb_type].ft_plot) { - ret = rt_functab[intern.idb_type].ft_plot(vhead, &intern, &rtip->rti_ttol, &rtip->rti_tol); + if (rt_functab[intern->idb_type].ft_plot) { + ret = rt_functab[intern->idb_type].ft_plot(vhead, intern, &rtip->rti_ttol, &rtip->rti_tol); } if (ret < 0) { bu_log("rt_vlist_solid(%s): ft_plot() failure\n", stp->st_name); - rt_db_free_internal(&intern); + rt_db_free_internal(intern); return(-2); } - rt_db_free_internal(&intern); + rt_db_free_internal(intern); return 0; } @@ -557,21 +557,21 @@ const struct soltab *stp, struct resource *resp) { - struct bu_list vhead; + struct bu_list *vhead; struct region *regp; RT_CK_RTI(rtip); RT_CK_SOLTAB(stp); - BU_LIST_INIT(&vhead); + BU_LIST_INIT(vhead); - if (rt_vlist_solid(&vhead, rtip, stp, resp) < 0) { + if (rt_vlist_solid(vhead, rtip, stp, resp) < 0) { bu_log("rt_plot_solid(%s): rt_vlist_solid() failed\n", stp->st_name); return(-1); /* FAIL */ } - if (BU_LIST_IS_EMPTY(&vhead)) { + if (BU_LIST_IS_EMPTY(vhead)) { bu_log("rt_plot_solid(%s): no vectors to plot?\n", stp->st_name); return(-3); /* FAIL */ @@ -585,9 +585,9 @@ (int)(255*regp->reg_mater.ma_color[2])); } - rt_vlist_to_uplot(fp, &vhead); + rt_vlist_to_uplot(fp, vhead); - RT_FREE_VLIST(&vhead); + RT_FREE_VLIST(vhead); return(0); /* OK */ } Modified: brlcad/trunk/src/librt/primitives/arb8/arb8.c =================================================================== --- brlcad/trunk/src/librt/primitives/arb8/arb8.c 2010-01-02 20:01:52 UTC (rev 37113) +++ brlcad/trunk/src/librt/primitives/arb8/arb8.c 2010-01-02 22:08:06 UTC (rev 37114) @@ -1008,16 +1008,16 @@ if (arbp->arb_opt == (struct oface *)0) { register int ret = 0; - struct rt_db_internal intern; + struct rt_db_internal *intern; struct rt_arb_internal *aip; - if (rt_db_get_internal(&intern, stp->st_dp, ap->a_rt_i->rti_dbip, stp->st_matp, ap->a_resource) < 0) { + if (rt_db_get_internal(intern, stp->st_dp, ap->a_rt_i->rti_dbip, stp->st_matp, ap->a_resource) < 0) { bu_log("rt_arb_uv(%s) rt_db_get_internal failure\n", stp->st_name); return; } - RT_CK_DB_INTERNAL(&intern); - aip = (struct rt_arb_internal *)intern.idb_ptr; + RT_CK_DB_INTERNAL(intern); + aip = (struct rt_arb_internal *)intern->idb_ptr; RT_ARB_CK_MAGIC(aip); /* @@ -1031,7 +1031,7 @@ } bu_semaphore_release(RT_SEM_MODEL); - rt_db_free_internal(&intern); + rt_db_free_internal(intern); if (ret != 0 || arbp->arb_opt == (struct oface *)0) { bu_log("rt_arb_uv(%s) dyanmic setup failure st_specific=x%x, optp=x%x\n", This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sta...@us...> - 2010-01-02 22:14:11
|
Revision: 37115 http://brlcad.svn.sourceforge.net/brlcad/?rev=37115&view=rev Author: starseeker Date: 2010-01-02 22:14:00 +0000 (Sat, 02 Jan 2010) Log Message: ----------- Undo librt changes - need to delve into macro land. Modified Paths: -------------- brlcad/trunk/src/librt/db5_io.c brlcad/trunk/src/librt/db5_scan.c brlcad/trunk/src/librt/dir.c brlcad/trunk/src/librt/fortray.c brlcad/trunk/src/librt/prep.c brlcad/trunk/src/librt/primitives/arb8/arb8.c Modified: brlcad/trunk/src/librt/db5_io.c =================================================================== --- brlcad/trunk/src/librt/db5_io.c 2010-01-02 22:08:06 UTC (rev 37114) +++ brlcad/trunk/src/librt/db5_io.c 2010-01-02 22:14:00 UTC (rev 37115) @@ -1224,47 +1224,47 @@ struct resource *resp, const int major) { - struct bu_external *attributes; - struct bu_external *body; + struct bu_external attributes; + struct bu_external body; int minor; int ret; RT_CK_DB_INTERNAL( ip ); if (dbip) RT_CK_DBI(dbip); /* may be null */ RT_CK_RESOURCE(resp); - BU_INIT_EXTERNAL( body ); + BU_INIT_EXTERNAL( &body ); minor = ip->idb_type; /* XXX not necessarily v5 numbers. */ /* Scale change on export is 1.0 -- no change */ ret = -1; if (ip->idb_meth->ft_export5) { - ret = ip->idb_meth->ft_export5(body, ip, conv2mm, dbip, resp); + ret = ip->idb_meth->ft_export5(&body, ip, conv2mm, dbip, resp); } if (ret < 0) { bu_log("rt_db_cvt_to_external5(%s): ft_export5 failure\n", name); - bu_free_external( body ); + bu_free_external( &body ); BU_INIT_EXTERNAL(ext); return -1; /* FAIL */ } - BU_CK_EXTERNAL( body ); + BU_CK_EXTERNAL( &body ); /* If present, convert attributes to on-disk format. */ if ( ip->idb_avs.magic == BU_AVS_MAGIC ) { - db5_export_attributes( attributes, &ip->idb_avs ); - BU_CK_EXTERNAL( attributes ); + db5_export_attributes( &attributes, &ip->idb_avs ); + BU_CK_EXTERNAL( &attributes ); } else { - BU_INIT_EXTERNAL(attributes); + BU_INIT_EXTERNAL(&attributes); } db5_export_object3( ext, DB5HDR_HFLAGS_DLI_APPLICATION_DATA_OBJECT, - name, 0, attributes, body, + name, 0, &attributes, &body, major, minor, DB5_ZZZ_UNCOMPRESSED, DB5_ZZZ_UNCOMPRESSED ); BU_CK_EXTERNAL( ext ); - bu_free_external( body ); - bu_free_external( attributes ); + bu_free_external( &body ); + bu_free_external( &attributes ); return 0; /* OK */ } @@ -1409,7 +1409,7 @@ struct resource *resp, const int major) { - struct bu_external *ext; + struct bu_external ext; RT_CK_DIR(dp); RT_CK_DBI(dbip); @@ -1418,37 +1418,36 @@ BU_ASSERT_LONG( dbip->dbi_version, ==, 5 ); - if ( rt_db_cvt_to_external5( ext, dp->d_namep, ip, 1.0, dbip, resp, major ) < 0 ) { + if ( rt_db_cvt_to_external5( &ext, dp->d_namep, ip, 1.0, dbip, resp, major ) < 0 ) { bu_log("rt_db_put_internal5(%s): export failure\n", dp->d_namep); goto fail; } - BU_INIT_EXTERNAL( ext ); - BU_CK_EXTERNAL( ext ); + BU_CK_EXTERNAL( &ext ); - if ( ext->ext_nbytes != dp->d_len || dp->d_addr == RT_DIR_PHONY_ADDR ) { - if ( db5_realloc( dbip, dp, ext ) < 0 ) { + if ( ext.ext_nbytes != dp->d_len || dp->d_addr == RT_DIR_PHONY_ADDR ) { + if ( db5_realloc( dbip, dp, &ext ) < 0 ) { bu_log("rt_db_put_internal5(%s) db_realloc5() failed\n", dp->d_namep); goto fail; } } - BU_ASSERT_LONG( ext->ext_nbytes, ==, dp->d_len ); + BU_ASSERT_LONG( ext.ext_nbytes, ==, dp->d_len ); if ( dp->d_flags & RT_DIR_INMEM ) { - memcpy(dp->d_un.ptr, ext->ext_buf, ext->ext_nbytes); + memcpy(dp->d_un.ptr, ext.ext_buf, ext.ext_nbytes); goto ok; } - if ( db_write( dbip, (char *)ext->ext_buf, ext->ext_nbytes, dp->d_addr ) < 0 ) { + if ( db_write( dbip, (char *)ext.ext_buf, ext.ext_nbytes, dp->d_addr ) < 0 ) { goto fail; } ok: - bu_free_external( ext ); + bu_free_external( &ext ); rt_db_free_internal(ip); return 0; /* OK */ fail: - bu_free_external( ext ); + bu_free_external( &ext ); rt_db_free_internal(ip); return -2; /* FAIL */ } Modified: brlcad/trunk/src/librt/db5_scan.c =================================================================== --- brlcad/trunk/src/librt/db5_scan.c 2010-01-02 22:08:06 UTC (rev 37114) +++ brlcad/trunk/src/librt/db5_scan.c 2010-01-02 22:14:00 UTC (rev 37115) @@ -356,10 +356,10 @@ struct directory *dp; struct bu_external ext; struct db5_raw_internal raw; - struct bu_attribute_value_set *avs; + struct bu_attribute_value_set avs; const char *cp; - bu_avs_init_empty(avs); + bu_avs_init_empty(&avs); /* File is v5 format */ dbip->dbi_version = 5; @@ -390,21 +390,21 @@ dbip->dbi_title = bu_strdup(DB5_GLOBAL_OBJECT_NAME); return 0; /* not a fatal error, need to let user proceed to fix it */ } - if (db5_import_attributes(avs, &raw.attributes) < 0) { + if (db5_import_attributes(&avs, &raw.attributes) < 0) { bu_log("db_dirbuild(%s): improper database, corrupted attribute-only %s object\n", dbip->dbi_filename, DB5_GLOBAL_OBJECT_NAME); bu_free_external(&ext); return -1; /* this is fatal */ } - BU_CK_AVS(avs); + BU_CK_AVS(&avs); /* Parse out the attributes */ - if ((cp = bu_avs_get(avs, "title")) != NULL) { + if ((cp = bu_avs_get(&avs, "title")) != NULL) { dbip->dbi_title = bu_strdup(cp); } else { dbip->dbi_title = bu_strdup("Untitled BRL-CAD database"); } - if ((cp = bu_avs_get(avs, "units")) != NULL) { + if ((cp = bu_avs_get(&avs, "units")) != NULL) { double dd; if (sscanf(cp, "%lf", &dd) != 1 || NEAR_ZERO(dd, VUNITIZE_TOL)) { bu_log("db_dirbuild(%s): improper database, %s object attribute 'units'=%s is invalid\n", @@ -415,11 +415,11 @@ dbip->dbi_base2local = 1/dd; } } - if ((cp = bu_avs_get(avs, "regionid_colortable")) != NULL) { + if ((cp = bu_avs_get(&avs, "regionid_colortable")) != NULL) { /* Import the region-id coloring table */ db5_import_color_table((char *)cp); } - bu_avs_free(avs); + bu_avs_free(&avs); bu_free_external(&ext); /* not until after done with avs! */ return 0; } Modified: brlcad/trunk/src/librt/dir.c =================================================================== --- brlcad/trunk/src/librt/dir.c 2010-01-02 22:08:06 UTC (rev 37114) +++ brlcad/trunk/src/librt/dir.c 2010-01-02 22:14:00 UTC (rev 37115) @@ -205,32 +205,32 @@ const struct rt_db_internal *ip, double conv2mm ) { - struct bu_external *ext; + struct bu_external ext; int ret; RT_CK_DB_INTERNAL(ip); RT_CK_FUNCTAB( ip->idb_meth ); - BU_INIT_EXTERNAL( ext ); + BU_INIT_EXTERNAL( &ext ); ret = -1; if (ip->idb_meth->ft_export4) { - ret = ip->idb_meth->ft_export4(ext, ip, conv2mm, NULL /*dbip*/, &rt_uniresource); + ret = ip->idb_meth->ft_export4(&ext, ip, conv2mm, NULL /*dbip*/, &rt_uniresource); } if (ret < 0) { bu_log("rt_file_put_internal(%s): solid export failure\n", name ); - bu_free_external( ext ); + bu_free_external( &ext ); return(-2); /* FAIL */ } - BU_CK_EXTERNAL( ext ); + BU_CK_EXTERNAL( &ext ); - if ( db_fwrite_external( fp, name, ext ) < 0 ) { + if ( db_fwrite_external( fp, name, &ext ) < 0 ) { bu_log("rt_fwrite_internal(%s): db_fwrite_external() error\n", name ); - bu_free_external( ext ); + bu_free_external( &ext ); return(-3); } - bu_free_external( ext ); + bu_free_external( &ext ); return(0); } Modified: brlcad/trunk/src/librt/fortray.c =================================================================== --- brlcad/trunk/src/librt/fortray.c 2010-01-02 22:08:06 UTC (rev 37114) +++ brlcad/trunk/src/librt/fortray.c 2010-01-02 22:14:00 UTC (rev 37115) @@ -292,22 +292,21 @@ double *dir __attribute__((unused))) { register struct context *ctp; - struct hit *hit = HIT_NULL; + struct hit hit; struct soltab *stp; register int i; i = *idx - 1; /* Selects which inhit is used */ /* Reconstruct the hit structure */ - hit->hit_dist = indist[i]; + hit.hit_dist = indist[i]; ctp = &context[i]; stp = ctp->co_stp; - VMOVE( hit->hit_vpriv, ctp->co_vpriv ); - hit->hit_private = ctp->co_priv; + VMOVE( hit.hit_vpriv, ctp->co_vpriv ); + hit.hit_private = ctp->co_priv; /* The new macro doesn't use ray argument */ - RT_HIT_NORMAL( normal, hit, stp, NULL, ctp->co_inflip ); - bu_free(hit, "free hit struct"); + RT_HIT_NORMAL( normal, &hit, stp, NULL, ctp->co_inflip ); } Modified: brlcad/trunk/src/librt/prep.c =================================================================== --- brlcad/trunk/src/librt/prep.c 2010-01-02 22:08:06 UTC (rev 37114) +++ brlcad/trunk/src/librt/prep.c 2010-01-02 22:14:00 UTC (rev 37115) @@ -515,25 +515,25 @@ const struct soltab *stp, struct resource *resp) { - struct rt_db_internal *intern; + struct rt_db_internal intern; int ret; - if (rt_db_get_internal(intern, stp->st_dp, rtip->rti_dbip, stp->st_matp, resp) < 0) { + if (rt_db_get_internal(&intern, stp->st_dp, rtip->rti_dbip, stp->st_matp, resp) < 0) { bu_log("rt_vlist_solid(%s): rt_db_get_internal() failed\n", stp->st_name); return(-1); /* FAIL */ } - RT_CK_DB_INTERNAL(intern); + RT_CK_DB_INTERNAL(&intern); ret = -1; - if (rt_functab[intern->idb_type].ft_plot) { - ret = rt_functab[intern->idb_type].ft_plot(vhead, intern, &rtip->rti_ttol, &rtip->rti_tol); + if (rt_functab[intern.idb_type].ft_plot) { + ret = rt_functab[intern.idb_type].ft_plot(vhead, &intern, &rtip->rti_ttol, &rtip->rti_tol); } if (ret < 0) { bu_log("rt_vlist_solid(%s): ft_plot() failure\n", stp->st_name); - rt_db_free_internal(intern); + rt_db_free_internal(&intern); return(-2); } - rt_db_free_internal(intern); + rt_db_free_internal(&intern); return 0; } @@ -557,21 +557,21 @@ const struct soltab *stp, struct resource *resp) { - struct bu_list *vhead; + struct bu_list vhead; struct region *regp; RT_CK_RTI(rtip); RT_CK_SOLTAB(stp); - BU_LIST_INIT(vhead); + BU_LIST_INIT(&vhead); - if (rt_vlist_solid(vhead, rtip, stp, resp) < 0) { + if (rt_vlist_solid(&vhead, rtip, stp, resp) < 0) { bu_log("rt_plot_solid(%s): rt_vlist_solid() failed\n", stp->st_name); return(-1); /* FAIL */ } - if (BU_LIST_IS_EMPTY(vhead)) { + if (BU_LIST_IS_EMPTY(&vhead)) { bu_log("rt_plot_solid(%s): no vectors to plot?\n", stp->st_name); return(-3); /* FAIL */ @@ -585,9 +585,9 @@ (int)(255*regp->reg_mater.ma_color[2])); } - rt_vlist_to_uplot(fp, vhead); + rt_vlist_to_uplot(fp, &vhead); - RT_FREE_VLIST(vhead); + RT_FREE_VLIST(&vhead); return(0); /* OK */ } Modified: brlcad/trunk/src/librt/primitives/arb8/arb8.c =================================================================== --- brlcad/trunk/src/librt/primitives/arb8/arb8.c 2010-01-02 22:08:06 UTC (rev 37114) +++ brlcad/trunk/src/librt/primitives/arb8/arb8.c 2010-01-02 22:14:00 UTC (rev 37115) @@ -1008,16 +1008,16 @@ if (arbp->arb_opt == (struct oface *)0) { register int ret = 0; - struct rt_db_internal *intern; + struct rt_db_internal intern; struct rt_arb_internal *aip; - if (rt_db_get_internal(intern, stp->st_dp, ap->a_rt_i->rti_dbip, stp->st_matp, ap->a_resource) < 0) { + if (rt_db_get_internal(&intern, stp->st_dp, ap->a_rt_i->rti_dbip, stp->st_matp, ap->a_resource) < 0) { bu_log("rt_arb_uv(%s) rt_db_get_internal failure\n", stp->st_name); return; } - RT_CK_DB_INTERNAL(intern); - aip = (struct rt_arb_internal *)intern->idb_ptr; + RT_CK_DB_INTERNAL(&intern); + aip = (struct rt_arb_internal *)intern.idb_ptr; RT_ARB_CK_MAGIC(aip); /* @@ -1031,7 +1031,7 @@ } bu_semaphore_release(RT_SEM_MODEL); - rt_db_free_internal(intern); + rt_db_free_internal(&intern); if (ret != 0 || arbp->arb_opt == (struct oface *)0) { bu_log("rt_arb_uv(%s) dyanmic setup failure st_specific=x%x, optp=x%x\n", This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <eri...@us...> - 2010-01-13 20:43:56
|
Revision: 37244 http://brlcad.svn.sourceforge.net/brlcad/?rev=37244&view=rev Author: erikgreenwald Date: 2010-01-13 20:43:32 +0000 (Wed, 13 Jan 2010) Log Message: ----------- shift marching cube tables out of metaball and into NMG Modified Paths: -------------- brlcad/trunk/src/librt/Makefile.am brlcad/trunk/src/librt/primitives/metaball/metaball_tri.c brlcad/trunk/src/librt/primitives/nmg/nmg_tri_mc.c Removed Paths: ------------- brlcad/trunk/src/librt/primitives/metaball/mc_table.h Modified: brlcad/trunk/src/librt/Makefile.am =================================================================== --- brlcad/trunk/src/librt/Makefile.am 2010-01-13 14:11:49 UTC (rev 37243) +++ brlcad/trunk/src/librt/Makefile.am 2010-01-13 20:43:32 UTC (rev 37244) @@ -242,7 +242,6 @@ noinst_HEADERS = \ primitives/fixpt.h \ primitives/brep/brep_debug.h \ - primitives/metaball/mc_table.h \ primitives/metaball/metaball.h \ primitives/revolve/revolve.h \ primitives/xxx/xxx.h Deleted: brlcad/trunk/src/librt/primitives/metaball/mc_table.h =================================================================== --- brlcad/trunk/src/librt/primitives/metaball/mc_table.h 2010-01-13 14:11:49 UTC (rev 37243) +++ brlcad/trunk/src/librt/primitives/metaball/mc_table.h 2010-01-13 20:43:32 UTC (rev 37244) @@ -1,299 +0,0 @@ -/* - * Table data acquired from Paul Borke's page at - * http://local.wasp.uwa.edu.au/~pbourke/geometry/polygonise/ - * - * Asserts it's from Cory Gene Bloyde, who has provided "public domain" code - * including the tables. http://www.siafoo.net/snippet/100 - * - * Grid definition matches SIGGRAPH 1987 p 164 (original presentation of technique) - */ - -#ifndef MC_TABLE_H -#define MC_TABLE_H - -int mc_edges[256]={ -0x000,0x109,0x203,0x30a,0x406,0x50f,0x605,0x70c, -0x80c,0x905,0xa0f,0xb06,0xc0a,0xd03,0xe09,0xf00, -0x190,0x099,0x393,0x29a,0x596,0x49f,0x795,0x69c, -0x99c,0x895,0xb9f,0xa96,0xd9a,0xc93,0xf99,0xe90, -0x230,0x339,0x033,0x13a,0x636,0x73f,0x435,0x53c, -0xa3c,0xb35,0x83f,0x936,0xe3a,0xf33,0xc39,0xd30, -0x3a0,0x2a9,0x1a3,0x0aa,0x7a6,0x6af,0x5a5,0x4ac, -0xbac,0xaa5,0x9af,0x8a6,0xfaa,0xea3,0xda9,0xca0, -0x460,0x569,0x663,0x76a,0x066,0x16f,0x265,0x36c, -0xc6c,0xd65,0xe6f,0xf66,0x86a,0x963,0xa69,0xb60, -0x5f0,0x4f9,0x7f3,0x6fa,0x1f6,0x0ff,0x3f5,0x2fc, -0xdfc,0xcf5,0xfff,0xef6,0x9fa,0x8f3,0xbf9,0xaf0, -0x650,0x759,0x453,0x55a,0x256,0x35f,0x055,0x15c, -0xe5c,0xf55,0xc5f,0xd56,0xa5a,0xb53,0x859,0x950, -0x7c0,0x6c9,0x5c3,0x4ca,0x3c6,0x2cf,0x1c5,0x0cc, -0xfcc,0xec5,0xdcf,0xcc6,0xbca,0xac3,0x9c9,0x8c0, -0x8c0,0x9c9,0xac3,0xbca,0xcc6,0xdcf,0xec5,0xfcc, -0x0cc,0x1c5,0x2cf,0x3c6,0x4ca,0x5c3,0x6c9,0x7c0, -0x950,0x859,0xb53,0xa5a,0xd56,0xc5f,0xf55,0xe5c, -0x15c,0x055,0x35f,0x256,0x55a,0x453,0x759,0x650, -0xaf0,0xbf9,0x8f3,0x9fa,0xef6,0xfff,0xcf5,0xdfc, -0x2fc,0x3f5,0x0ff,0x1f6,0x6fa,0x7f3,0x4f9,0x5f0, -0xb60,0xa69,0x963,0x86a,0xf66,0xe6f,0xd65,0xc6c, -0x36c,0x265,0x16f,0x066,0x76a,0x663,0x569,0x460, -0xca0,0xda9,0xea3,0xfaa,0x8a6,0x9af,0xaa5,0xbac, -0x4ac,0x5a5,0x6af,0x7a6,0x0aa,0x1a3,0x2a9,0x3a0, -0xd30,0xc39,0xf33,0xe3a,0x936,0x83f,0xb35,0xa3c, -0x53c,0x435,0x73f,0x636,0x13a,0x033,0x339,0x230, -0xe90,0xf99,0xc93,0xd9a,0xa96,0xb9f,0x895,0x99c, -0x69c,0x795,0x49f,0x596,0x29a,0x393,0x099,0x190, -0xf00,0xe09,0xd03,0xc0a,0xb06,0xa0f,0x905,0x80c, -0x70c,0x605,0x50f,0x406,0x30a,0x203,0x109,0x000}; - - -int mc_tris[256][16] = -{{-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, -{0, 8, 3, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, -{0, 1, 9, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, -{1, 8, 3, 9, 8, 1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, -{1, 2, 10, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, -{0, 8, 3, 1, 2, 10, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, -{9, 2, 10, 0, 2, 9, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, -{2, 8, 3, 2, 10, 8, 10, 9, 8, -1, -1, -1, -1, -1, -1, -1}, -{3, 11, 2, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, -{0, 11, 2, 8, 11, 0, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, -{1, 9, 0, 2, 3, 11, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, -{1, 11, 2, 1, 9, 11, 9, 8, 11, -1, -1, -1, -1, -1, -1, -1}, -{3, 10, 1, 11, 10, 3, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, -{0, 10, 1, 0, 8, 10, 8, 11, 10, -1, -1, -1, -1, -1, -1, -1}, -{3, 9, 0, 3, 11, 9, 11, 10, 9, -1, -1, -1, -1, -1, -1, -1}, -{9, 8, 10, 10, 8, 11, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, -{4, 7, 8, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, -{4, 3, 0, 7, 3, 4, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, -{0, 1, 9, 8, 4, 7, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, -{4, 1, 9, 4, 7, 1, 7, 3, 1, -1, -1, -1, -1, -1, -1, -1}, -{1, 2, 10, 8, 4, 7, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, -{3, 4, 7, 3, 0, 4, 1, 2, 10, -1, -1, -1, -1, -1, -1, -1}, -{9, 2, 10, 9, 0, 2, 8, 4, 7, -1, -1, -1, -1, -1, -1, -1}, -{2, 10, 9, 2, 9, 7, 2, 7, 3, 7, 9, 4, -1, -1, -1, -1}, -{8, 4, 7, 3, 11, 2, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, -{11, 4, 7, 11, 2, 4, 2, 0, 4, -1, -1, -1, -1, -1, -1, -1}, -{9, 0, 1, 8, 4, 7, 2, 3, 11, -1, -1, -1, -1, -1, -1, -1}, -{4, 7, 11, 9, 4, 11, 9, 11, 2, 9, 2, 1, -1, -1, -1, -1}, -{3, 10, 1, 3, 11, 10, 7, 8, 4, -1, -1, -1, -1, -1, -1, -1}, -{1, 11, 10, 1, 4, 11, 1, 0, 4, 7, 11, 4, -1, -1, -1, -1}, -{4, 7, 8, 9, 0, 11, 9, 11, 10, 11, 0, 3, -1, -1, -1, -1}, -{4, 7, 11, 4, 11, 9, 9, 11, 10, -1, -1, -1, -1, -1, -1, -1}, -{9, 5, 4, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, -{9, 5, 4, 0, 8, 3, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, -{0, 5, 4, 1, 5, 0, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, -{8, 5, 4, 8, 3, 5, 3, 1, 5, -1, -1, -1, -1, -1, -1, -1}, -{1, 2, 10, 9, 5, 4, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, -{3, 0, 8, 1, 2, 10, 4, 9, 5, -1, -1, -1, -1, -1, -1, -1}, -{5, 2, 10, 5, 4, 2, 4, 0, 2, -1, -1, -1, -1, -1, -1, -1}, -{2, 10, 5, 3, 2, 5, 3, 5, 4, 3, 4, 8, -1, -1, -1, -1}, -{9, 5, 4, 2, 3, 11, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, -{0, 11, 2, 0, 8, 11, 4, 9, 5, -1, -1, -1, -1, -1, -1, -1}, -{0, 5, 4, 0, 1, 5, 2, 3, 11, -1, -1, -1, -1, -1, -1, -1}, -{2, 1, 5, 2, 5, 8, 2, 8, 11, 4, 8, 5, -1, -1, -1, -1}, -{10, 3, 11, 10, 1, 3, 9, 5, 4, -1, -1, -1, -1, -1, -1, -1}, -{4, 9, 5, 0, 8, 1, 8, 10, 1, 8, 11, 10, -1, -1, -1, -1}, -{5, 4, 0, 5, 0, 11, 5, 11, 10, 11, 0, 3, -1, -1, -1, -1}, -{5, 4, 8, 5, 8, 10, 10, 8, 11, -1, -1, -1, -1, -1, -1, -1}, -{9, 7, 8, 5, 7, 9, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, -{9, 3, 0, 9, 5, 3, 5, 7, 3, -1, -1, -1, -1, -1, -1, -1}, -{0, 7, 8, 0, 1, 7, 1, 5, 7, -1, -1, -1, -1, -1, -1, -1}, -{1, 5, 3, 3, 5, 7, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, -{9, 7, 8, 9, 5, 7, 10, 1, 2, -1, -1, -1, -1, -1, -1, -1}, -{10, 1, 2, 9, 5, 0, 5, 3, 0, 5, 7, 3, -1, -1, -1, -1}, -{8, 0, 2, 8, 2, 5, 8, 5, 7, 10, 5, 2, -1, -1, -1, -1}, -{2, 10, 5, 2, 5, 3, 3, 5, 7, -1, -1, -1, -1, -1, -1, -1}, -{7, 9, 5, 7, 8, 9, 3, 11, 2, -1, -1, -1, -1, -1, -1, -1}, -{9, 5, 7, 9, 7, 2, 9, 2, 0, 2, 7, 11, -1, -1, -1, -1}, -{2, 3, 11, 0, 1, 8, 1, 7, 8, 1, 5, 7, -1, -1, -1, -1}, -{11, 2, 1, 11, 1, 7, 7, 1, 5, -1, -1, -1, -1, -1, -1, -1}, -{9, 5, 8, 8, 5, 7, 10, 1, 3, 10, 3, 11, -1, -1, -1, -1}, -{5, 7, 0, 5, 0, 9, 7, 11, 0, 1, 0, 10, 11, 10, 0, -1}, -{11, 10, 0, 11, 0, 3, 10, 5, 0, 8, 0, 7, 5, 7, 0, -1}, -{11, 10, 5, 7, 11, 5, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, -{10, 6, 5, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, -{0, 8, 3, 5, 10, 6, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, -{9, 0, 1, 5, 10, 6, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, -{1, 8, 3, 1, 9, 8, 5, 10, 6, -1, -1, -1, -1, -1, -1, -1}, -{1, 6, 5, 2, 6, 1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, -{1, 11, 10, 1, 4, 11, 1, 0, 4, 7, 11, 4, -1, -1, -1, -1}, -{4, 7, 8, 9, 0, 11, 9, 11, 10, 11, 0, 3, -1, -1, -1, -1}, -{4, 7, 11, 4, 11, 9, 9, 11, 10, -1, -1, -1, -1, -1, -1, -1}, -{9, 5, 4, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, -{9, 5, 4, 0, 8, 3, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, -{0, 5, 4, 1, 5, 0, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, -{8, 5, 4, 8, 3, 5, 3, 1, 5, -1, -1, -1, -1, -1, -1, -1}, -{1, 2, 10, 9, 5, 4, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, -{3, 0, 8, 1, 2, 10, 4, 9, 5, -1, -1, -1, -1, -1, -1, -1}, -{5, 2, 10, 5, 4, 2, 4, 0, 2, -1, -1, -1, -1, -1, -1, -1}, -{2, 10, 5, 3, 2, 5, 3, 5, 4, 3, 4, 8, -1, -1, -1, -1}, -{9, 5, 4, 2, 3, 11, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, -{0, 11, 2, 0, 8, 11, 4, 9, 5, -1, -1, -1, -1, -1, -1, -1}, -{0, 5, 4, 0, 1, 5, 2, 3, 11, -1, -1, -1, -1, -1, -1, -1}, -{2, 1, 5, 2, 5, 8, 2, 8, 11, 4, 8, 5, -1, -1, -1, -1}, -{10, 3, 11, 10, 1, 3, 9, 5, 4, -1, -1, -1, -1, -1, -1, -1}, -{4, 9, 5, 0, 8, 1, 8, 10, 1, 8, 11, 10, -1, -1, -1, -1}, -{5, 4, 0, 5, 0, 11, 5, 11, 10, 11, 0, 3, -1, -1, -1, -1}, -{5, 4, 8, 5, 8, 10, 10, 8, 11, -1, -1, -1, -1, -1, -1, -1}, -{9, 7, 8, 5, 7, 9, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, -{9, 3, 0, 9, 5, 3, 5, 7, 3, -1, -1, -1, -1, -1, -1, -1}, -{0, 7, 8, 0, 1, 7, 1, 5, 7, -1, -1, -1, -1, -1, -1, -1}, -{1, 5, 3, 3, 5, 7, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, -{9, 7, 8, 9, 5, 7, 10, 1, 2, -1, -1, -1, -1, -1, -1, -1}, -{10, 1, 2, 9, 5, 0, 5, 3, 0, 5, 7, 3, -1, -1, -1, -1}, -{8, 0, 2, 8, 2, 5, 8, 5, 7, 10, 5, 2, -1, -1, -1, -1}, -{2, 10, 5, 2, 5, 3, 3, 5, 7, -1, -1, -1, -1, -1, -1, -1}, -{7, 9, 5, 7, 8, 9, 3, 11, 2, -1, -1, -1, -1, -1, -1, -1}, -{9, 5, 7, 9, 7, 2, 9, 2, 0, 2, 7, 11, -1, -1, -1, -1}, -{2, 3, 11, 0, 1, 8, 1, 7, 8, 1, 5, 7, -1, -1, -1, -1}, -{11, 2, 1, 11, 1, 7, 7, 1, 5, -1, -1, -1, -1, -1, -1, -1}, -{9, 5, 8, 8, 5, 7, 10, 1, 3, 10, 3, 11, -1, -1, -1, -1}, -{5, 7, 0, 5, 0, 9, 7, 11, 0, 1, 0, 10, 11, 10, 0, -1}, -{11, 10, 0, 11, 0, 3, 10, 5, 0, 8, 0, 7, 5, 7, 0, -1}, -{11, 10, 5, 7, 11, 5, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, -{10, 6, 5, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, -{0, 8, 3, 5, 10, 6, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, -{9, 0, 1, 5, 10, 6, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, -{1, 8, 3, 1, 9, 8, 5, 10, 6, -1, -1, -1, -1, -1, -1, -1}, -{1, 6, 5, 2, 6, 1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, -{2, 6, 9, 2, 9, 1, 6, 7, 9, 0, 9, 3, 7, 3, 9, -1}, -{7, 8, 0, 7, 0, 6, 6, 0, 2, -1, -1, -1, -1, -1, -1, -1}, -{7, 3, 2, 6, 7, 2, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, -{2, 3, 11, 10, 6, 8, 10, 8, 9, 8, 6, 7, -1, -1, -1, -1}, -{2, 0, 7, 2, 7, 11, 0, 9, 7, 6, 7, 10, 9, 10, 7, -1}, -{1, 8, 0, 1, 7, 8, 1, 10, 7, 6, 7, 10, 2, 3, 11, -1}, -{11, 2, 1, 11, 1, 7, 10, 6, 1, 6, 7, 1, -1, -1, -1, -1}, -{8, 9, 6, 8, 6, 7, 9, 1, 6, 11, 6, 3, 1, 3, 6, -1}, -{0, 9, 1, 11, 6, 7, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, -{7, 8, 0, 7, 0, 6, 3, 11, 0, 11, 6, 0, -1, -1, -1, -1}, -{7, 11, 6, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, -{7, 6, 11, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, -{3, 0, 8, 11, 7, 6, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, -{0, 1, 9, 11, 7, 6, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, -{8, 1, 9, 8, 3, 1, 11, 7, 6, -1, -1, -1, -1, -1, -1, -1}, -{10, 1, 2, 6, 11, 7, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, -{1, 2, 10, 3, 0, 8, 6, 11, 7, -1, -1, -1, -1, -1, -1, -1}, -{2, 9, 0, 2, 10, 9, 6, 11, 7, -1, -1, -1, -1, -1, -1, -1}, -{6, 11, 7, 2, 10, 3, 10, 8, 3, 10, 9, 8, -1, -1, -1, -1}, -{7, 2, 3, 6, 2, 7, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, -{7, 0, 8, 7, 6, 0, 6, 2, 0, -1, -1, -1, -1, -1, -1, -1}, -{2, 7, 6, 2, 3, 7, 0, 1, 9, -1, -1, -1, -1, -1, -1, -1}, -{1, 6, 2, 1, 8, 6, 1, 9, 8, 8, 7, 6, -1, -1, -1, -1}, -{10, 7, 6, 10, 1, 7, 1, 3, 7, -1, -1, -1, -1, -1, -1, -1}, -{10, 7, 6, 1, 7, 10, 1, 8, 7, 1, 0, 8, -1, -1, -1, -1}, -{0, 3, 7, 0, 7, 10, 0, 10, 9, 6, 10, 7, -1, -1, -1, -1}, -{7, 6, 10, 7, 10, 8, 8, 10, 9, -1, -1, -1, -1, -1, -1, -1}, -{6, 8, 4, 11, 8, 6, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, -{3, 6, 11, 3, 0, 6, 0, 4, 6, -1, -1, -1, -1, -1, -1, -1}, -{8, 6, 11, 8, 4, 6, 9, 0, 1, -1, -1, -1, -1, -1, -1, -1}, -{9, 4, 6, 9, 6, 3, 9, 3, 1, 11, 3, 6, -1, -1, -1, -1}, -{6, 8, 4, 6, 11, 8, 2, 10, 1, -1, -1, -1, -1, -1, -1, -1}, -{1, 2, 10, 3, 0, 11, 0, 6, 11, 0, 4, 6, -1, -1, -1, -1}, -{4, 11, 8, 4, 6, 11, 0, 2, 9, 2, 10, 9, -1, -1, -1, -1}, -{10, 9, 3, 10, 3, 2, 9, 4, 3, 11, 3, 6, 4, 6, 3, -1}, -{8, 2, 3, 8, 4, 2, 4, 6, 2, -1, -1, -1, -1, -1, -1, -1}, -{0, 4, 2, 4, 6, 2, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, -{1, 9, 0, 2, 3, 4, 2, 4, 6, 4, 3, 8, -1, -1, -1, -1}, -{1, 9, 4, 1, 4, 2, 2, 4, 6, -1, -1, -1, -1, -1, -1, -1}, -{8, 1, 3, 8, 6, 1, 8, 4, 6, 6, 10, 1, -1, -1, -1, -1}, -{10, 1, 0, 10, 0, 6, 6, 0, 4, -1, -1, -1, -1, -1, -1, -1}, -{4, 6, 3, 4, 3, 8, 6, 10, 3, 0, 3, 9, 10, 9, 3, -1}, -{10, 9, 4, 6, 10, 4, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, -{4, 9, 5, 7, 6, 11, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, -{0, 8, 3, 4, 9, 5, 11, 7, 6, -1, -1, -1, -1, -1, -1, -1}, -{5, 0, 1, 5, 4, 0, 7, 6, 11, -1, -1, -1, -1, -1, -1, -1}, -{11, 7, 6, 8, 3, 4, 3, 5, 4, 3, 1, 5, -1, -1, -1, -1}, -{9, 5, 4, 10, 1, 2, 7, 6, 11, -1, -1, -1, -1, -1, -1, -1}, -{6, 11, 7, 1, 2, 10, 0, 8, 3, 4, 9, 5, -1, -1, -1, -1}, -{7, 6, 11, 5, 4, 10, 4, 2, 10, 4, 0, 2, -1, -1, -1, -1}, -{3, 4, 8, 3, 5, 4, 3, 2, 5, 10, 5, 2, 11, 7, 6, -1}, -{7, 2, 3, 7, 6, 2, 5, 4, 9, -1, -1, -1, -1, -1, -1, -1}, -{9, 5, 4, 0, 8, 6, 0, 6, 2, 6, 8, 7, -1, -1, -1, -1}, -{3, 6, 2, 3, 7, 6, 1, 5, 0, 5, 4, 0, -1, -1, -1, -1}, -{6, 2, 8, 6, 8, 7, 2, 1, 8, 4, 8, 5, 1, 5, 8, -1}, -{9, 5, 4, 10, 1, 6, 1, 7, 6, 1, 3, 7, -1, -1, -1, -1}, -{1, 6, 10, 1, 7, 6, 1, 0, 7, 8, 7, 0, 9, 5, 4, -1}, -{4, 0, 10, 4, 10, 5, 0, 3, 10, 6, 10, 7, 3, 7, 10, -1}, -{7, 6, 10, 7, 10, 8, 5, 4, 10, 4, 8, 10, -1, -1, -1, -1}, -{6, 9, 5, 6, 11, 9, 11, 8, 9, -1, -1, -1, -1, -1, -1, -1}, -{3, 6, 11, 0, 6, 3, 0, 5, 6, 0, 9, 5, -1, -1, -1, -1}, -{0, 11, 8, 0, 5, 11, 0, 1, 5, 5, 6, 11, -1, -1, -1, -1}, -{6, 11, 3, 6, 3, 5, 5, 3, 1, -1, -1, -1, -1, -1, -1, -1}, -{1, 2, 10, 9, 5, 11, 9, 11, 8, 11, 5, 6, -1, -1, -1, -1}, -{0, 11, 3, 0, 6, 11, 0, 9, 6, 5, 6, 9, 1, 2, 10, -1}, -{11, 8, 5, 11, 5, 6, 8, 0, 5, 10, 5, 2, 0, 2, 5, -1}, -{6, 11, 3, 6, 3, 5, 2, 10, 3, 10, 5, 3, -1, -1, -1, -1}, -{5, 8, 9, 5, 2, 8, 5, 6, 2, 3, 8, 2, -1, -1, -1, -1}, -{9, 5, 6, 9, 6, 0, 0, 6, 2, -1, -1, -1, -1, -1, -1, -1}, -{1, 5, 8, 1, 8, 0, 5, 6, 8, 3, 8, 2, 6, 2, 8, -1}, -{1, 5, 6, 2, 1, 6, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, -{1, 3, 6, 1, 6, 10, 3, 8, 6, 5, 6, 9, 8, 9, 6, -1}, -{10, 1, 0, 10, 0, 6, 9, 5, 0, 5, 6, 0, -1, -1, -1, -1}, -{0, 3, 8, 5, 6, 10, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, -{10, 5, 6, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, -{11, 5, 10, 7, 5, 11, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, -{11, 5, 10, 11, 7, 5, 8, 3, 0, -1, -1, -1, -1, -1, -1, -1}, -{5, 11, 7, 5, 10, 11, 1, 9, 0, -1, -1, -1, -1, -1, -1, -1}, -{10, 7, 5, 10, 11, 7, 9, 8, 1, 8, 3, 1, -1, -1, -1, -1}, -{11, 1, 2, 11, 7, 1, 7, 5, 1, -1, -1, -1, -1, -1, -1, -1}, -{0, 8, 3, 1, 2, 7, 1, 7, 5, 7, 2, 11, -1, -1, -1, -1}, -{9, 7, 5, 9, 2, 7, 9, 0, 2, 2, 11, 7, -1, -1, -1, -1}, -{7, 5, 2, 7, 2, 11, 5, 9, 2, 3, 2, 8, 9, 8, 2, -1}, -{2, 5, 10, 2, 3, 5, 3, 7, 5, -1, -1, -1, -1, -1, -1, -1}, -{8, 2, 0, 8, 5, 2, 8, 7, 5, 10, 2, 5, -1, -1, -1, -1}, -{9, 0, 1, 5, 10, 3, 5, 3, 7, 3, 10, 2, -1, -1, -1, -1}, -{9, 8, 2, 9, 2, 1, 8, 7, 2, 10, 2, 5, 7, 5, 2, -1}, -{1, 3, 5, 3, 7, 5, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, -{0, 8, 7, 0, 7, 1, 1, 7, 5, -1, -1, -1, -1, -1, -1, -1}, -{9, 0, 3, 9, 3, 5, 5, 3, 7, -1, -1, -1, -1, -1, -1, -1}, -{9, 8, 7, 5, 9, 7, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, -{5, 8, 4, 5, 10, 8, 10, 11, 8, -1, -1, -1, -1, -1, -1, -1}, -{5, 0, 4, 5, 11, 0, 5, 10, 11, 11, 3, 0, -1, -1, -1, -1}, -{0, 1, 9, 8, 4, 10, 8, 10, 11, 10, 4, 5, -1, -1, -1, -1}, -{10, 11, 4, 10, 4, 5, 11, 3, 4, 9, 4, 1, 3, 1, 4, -1}, -{2, 5, 1, 2, 8, 5, 2, 11, 8, 4, 5, 8, -1, -1, -1, -1}, -{0, 4, 11, 0, 11, 3, 4, 5, 11, 2, 11, 1, 5, 1, 11, -1}, -{0, 2, 5, 0, 5, 9, 2, 11, 5, 4, 5, 8, 11, 8, 5, -1}, -{9, 4, 5, 2, 11, 3, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, -{2, 5, 10, 3, 5, 2, 3, 4, 5, 3, 8, 4, -1, -1, -1, -1}, -{5, 10, 2, 5, 2, 4, 4, 2, 0, -1, -1, -1, -1, -1, -1, -1}, -{3, 10, 2, 3, 5, 10, 3, 8, 5, 4, 5, 8, 0, 1, 9, -1}, -{5, 10, 2, 5, 2, 4, 1, 9, 2, 9, 4, 2, -1, -1, -1, -1}, -{8, 4, 5, 8, 5, 3, 3, 5, 1, -1, -1, -1, -1, -1, -1, -1}, -{0, 4, 5, 1, 0, 5, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, -{8, 4, 5, 8, 5, 3, 9, 0, 5, 0, 3, 5, -1, -1, -1, -1}, -{9, 4, 5, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, -{4, 11, 7, 4, 9, 11, 9, 10, 11, -1, -1, -1, -1, -1, -1, -1}, -{0, 8, 3, 4, 9, 7, 9, 11, 7, 9, 10, 11, -1, -1, -1, -1}, -{1, 10, 11, 1, 11, 4, 1, 4, 0, 7, 4, 11, -1, -1, -1, -1}, -{3, 1, 4, 3, 4, 8, 1, 10, 4, 7, 4, 11, 10, 11, 4, -1}, -{4, 11, 7, 9, 11, 4, 9, 2, 11, 9, 1, 2, -1, -1, -1, -1}, -{9, 7, 4, 9, 11, 7, 9, 1, 11, 2, 11, 1, 0, 8, 3, -1}, -{11, 7, 4, 11, 4, 2, 2, 4, 0, -1, -1, -1, -1, -1, -1, -1}, -{11, 7, 4, 11, 4, 2, 8, 3, 4, 3, 2, 4, -1, -1, -1, -1}, -{2, 9, 10, 2, 7, 9, 2, 3, 7, 7, 4, 9, -1, -1, -1, -1}, -{9, 10, 7, 9, 7, 4, 10, 2, 7, 8, 7, 0, 2, 0, 7, -1}, -{3, 7, 10, 3, 10, 2, 7, 4, 10, 1, 10, 0, 4, 0, 10, -1}, -{1, 10, 2, 8, 7, 4, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, -{4, 9, 1, 4, 1, 7, 7, 1, 3, -1, -1, -1, -1, -1, -1, -1}, -{4, 9, 1, 4, 1, 7, 0, 8, 1, 8, 7, 1, -1, -1, -1, -1}, -{4, 0, 3, 7, 4, 3, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, -{4, 8, 7, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, -{9, 10, 8, 10, 11, 8, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, -{3, 0, 9, 3, 9, 11, 11, 9, 10, -1, -1, -1, -1, -1, -1, -1}, -{0, 1, 10, 0, 10, 8, 8, 10, 11, -1, -1, -1, -1, -1, -1, -1}, -{3, 1, 10, 11, 3, 10, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, -{1, 2, 11, 1, 11, 9, 9, 11, 8, -1, -1, -1, -1, -1, -1, -1}, -{3, 0, 9, 3, 9, 11, 1, 2, 9, 2, 11, 9, -1, -1, -1, -1}, -{0, 2, 11, 8, 0, 11, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, -{3, 2, 11, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, -{2, 3, 8, 2, 8, 10, 10, 8, 9, -1, -1, -1, -1, -1, -1, -1}, -{9, 10, 2, 0, 9, 2, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, -{2, 3, 8, 2, 8, 10, 0, 1, 8, 1, 10, 8, -1, -1, -1, -1}, -{1, 10, 2, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, -{1, 3, 8, 9, 1, 8, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, -{0, 9, 1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, -{0, 3, 8, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, -{-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}}; - -#endif Modified: brlcad/trunk/src/librt/primitives/metaball/metaball_tri.c =================================================================== --- brlcad/trunk/src/librt/primitives/metaball/metaball_tri.c 2010-01-13 14:11:49 UTC (rev 37243) +++ brlcad/trunk/src/librt/primitives/metaball/metaball_tri.c 2010-01-13 20:43:32 UTC (rev 37244) @@ -43,7 +43,6 @@ #include "wdb.h" #include "metaball.h" -#include "mc_table.h" static int bitcount(unsigned char w) { return (w==0) ? 0 : bitcount(w>>1) + (w|1); } Modified: brlcad/trunk/src/librt/primitives/nmg/nmg_tri_mc.c =================================================================== --- brlcad/trunk/src/librt/primitives/nmg/nmg_tri_mc.c 2010-01-13 14:11:49 UTC (rev 37243) +++ brlcad/trunk/src/librt/primitives/nmg/nmg_tri_mc.c 2010-01-13 20:43:32 UTC (rev 37244) @@ -40,7 +40,7 @@ * [ ] experiment with decimating * [ ] hoist code where final cube edge intersections is known * [ ] implement ray-firing to find edge intersects - * [ ] hoise table stuff + * [X] hoise table stuff * [ ] hoist NMG mesh writer. (End of Feb10) * ============================================================ * [ ] try decimation? @@ -62,6 +62,303 @@ #include "raytrace.h" #include "plot3.h" +/* + * Table data acquired from Paul Borke's page at + * http://local.wasp.uwa.edu.au/~pbourke/geometry/polygonise/ + * + * Asserts it's from Cory Gene Bloyde, who has provided "public domain" code + * including the tables. http://www.siafoo.net/snippet/100 + * + * Grid definition matches SIGGRAPH 1987 p 164 (original presentation of technique) + */ + +static int mc_edges[256]={ +0x000,0x109,0x203,0x30a,0x406,0x50f,0x605,0x70c, +0x80c,0x905,0xa0f,0xb06,0xc0a,0xd03,0xe09,0xf00, +0x190,0x099,0x393,0x29a,0x596,0x49f,0x795,0x69c, +0x99c,0x895,0xb9f,0xa96,0xd9a,0xc93,0xf99,0xe90, +0x230,0x339,0x033,0x13a,0x636,0x73f,0x435,0x53c, +0xa3c,0xb35,0x83f,0x936,0xe3a,0xf33,0xc39,0xd30, +0x3a0,0x2a9,0x1a3,0x0aa,0x7a6,0x6af,0x5a5,0x4ac, +0xbac,0xaa5,0x9af,0x8a6,0xfaa,0xea3,0xda9,0xca0, +0x460,0x569,0x663,0x76a,0x066,0x16f,0x265,0x36c, +0xc6c,0xd65,0xe6f,0xf66,0x86a,0x963,0xa69,0xb60, +0x5f0,0x4f9,0x7f3,0x6fa,0x1f6,0x0ff,0x3f5,0x2fc, +0xdfc,0xcf5,0xfff,0xef6,0x9fa,0x8f3,0xbf9,0xaf0, +0x650,0x759,0x453,0x55a,0x256,0x35f,0x055,0x15c, +0xe5c,0xf55,0xc5f,0xd56,0xa5a,0xb53,0x859,0x950, +0x7c0,0x6c9,0x5c3,0x4ca,0x3c6,0x2cf,0x1c5,0x0cc, +0xfcc,0xec5,0xdcf,0xcc6,0xbca,0xac3,0x9c9,0x8c0, +0x8c0,0x9c9,0xac3,0xbca,0xcc6,0xdcf,0xec5,0xfcc, +0x0cc,0x1c5,0x2cf,0x3c6,0x4ca,0x5c3,0x6c9,0x7c0, +0x950,0x859,0xb53,0xa5a,0xd56,0xc5f,0xf55,0xe5c, +0x15c,0x055,0x35f,0x256,0x55a,0x453,0x759,0x650, +0xaf0,0xbf9,0x8f3,0x9fa,0xef6,0xfff,0xcf5,0xdfc, +0x2fc,0x3f5,0x0ff,0x1f6,0x6fa,0x7f3,0x4f9,0x5f0, +0xb60,0xa69,0x963,0x86a,0xf66,0xe6f,0xd65,0xc6c, +0x36c,0x265,0x16f,0x066,0x76a,0x663,0x569,0x460, +0xca0,0xda9,0xea3,0xfaa,0x8a6,0x9af,0xaa5,0xbac, +0x4ac,0x5a5,0x6af,0x7a6,0x0aa,0x1a3,0x2a9,0x3a0, +0xd30,0xc39,0xf33,0xe3a,0x936,0x83f,0xb35,0xa3c, +0x53c,0x435,0x73f,0x636,0x13a,0x033,0x339,0x230, +0xe90,0xf99,0xc93,0xd9a,0xa96,0xb9f,0x895,0x99c, +0x69c,0x795,0x49f,0x596,0x29a,0x393,0x099,0x190, +0xf00,0xe09,0xd03,0xc0a,0xb06,0xa0f,0x905,0x80c, +0x70c,0x605,0x50f,0x406,0x30a,0x203,0x109,0x000}; + +static int mc_tris[256][16] = +{{-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, +{0, 8, 3, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, +{0, 1, 9, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, +{1, 8, 3, 9, 8, 1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, +{1, 2, 10, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, +{0, 8, 3, 1, 2, 10, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, +{9, 2, 10, 0, 2, 9, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, +{2, 8, 3, 2, 10, 8, 10, 9, 8, -1, -1, -1, -1, -1, -1, -1}, +{3, 11, 2, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, +{0, 11, 2, 8, 11, 0, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, +{1, 9, 0, 2, 3, 11, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, +{1, 11, 2, 1, 9, 11, 9, 8, 11, -1, -1, -1, -1, -1, -1, -1}, +{3, 10, 1, 11, 10, 3, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, +{0, 10, 1, 0, 8, 10, 8, 11, 10, -1, -1, -1, -1, -1, -1, -1}, +{3, 9, 0, 3, 11, 9, 11, 10, 9, -1, -1, -1, -1, -1, -1, -1}, +{9, 8, 10, 10, 8, 11, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, +{4, 7, 8, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, +{4, 3, 0, 7, 3, 4, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, +{0, 1, 9, 8, 4, 7, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, +{4, 1, 9, 4, 7, 1, 7, 3, 1, -1, -1, -1, -1, -1, -1, -1}, +{1, 2, 10, 8, 4, 7, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, +{3, 4, 7, 3, 0, 4, 1, 2, 10, -1, -1, -1, -1, -1, -1, -1}, +{9, 2, 10, 9, 0, 2, 8, 4, 7, -1, -1, -1, -1, -1, -1, -1}, +{2, 10, 9, 2, 9, 7, 2, 7, 3, 7, 9, 4, -1, -1, -1, -1}, +{8, 4, 7, 3, 11, 2, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, +{11, 4, 7, 11, 2, 4, 2, 0, 4, -1, -1, -1, -1, -1, -1, -1}, +{9, 0, 1, 8, 4, 7, 2, 3, 11, -1, -1, -1, -1, -1, -1, -1}, +{4, 7, 11, 9, 4, 11, 9, 11, 2, 9, 2, 1, -1, -1, -1, -1}, +{3, 10, 1, 3, 11, 10, 7, 8, 4, -1, -1, -1, -1, -1, -1, -1}, +{1, 11, 10, 1, 4, 11, 1, 0, 4, 7, 11, 4, -1, -1, -1, -1}, +{4, 7, 8, 9, 0, 11, 9, 11, 10, 11, 0, 3, -1, -1, -1, -1}, +{4, 7, 11, 4, 11, 9, 9, 11, 10, -1, -1, -1, -1, -1, -1, -1}, +{9, 5, 4, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, +{9, 5, 4, 0, 8, 3, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, +{0, 5, 4, 1, 5, 0, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, +{8, 5, 4, 8, 3, 5, 3, 1, 5, -1, -1, -1, -1, -1, -1, -1}, +{1, 2, 10, 9, 5, 4, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, +{3, 0, 8, 1, 2, 10, 4, 9, 5, -1, -1, -1, -1, -1, -1, -1}, +{5, 2, 10, 5, 4, 2, 4, 0, 2, -1, -1, -1, -1, -1, -1, -1}, +{2, 10, 5, 3, 2, 5, 3, 5, 4, 3, 4, 8, -1, -1, -1, -1}, +{9, 5, 4, 2, 3, 11, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, +{0, 11, 2, 0, 8, 11, 4, 9, 5, -1, -1, -1, -1, -1, -1, -1}, +{0, 5, 4, 0, 1, 5, 2, 3, 11, -1, -1, -1, -1, -1, -1, -1}, +{2, 1, 5, 2, 5, 8, 2, 8, 11, 4, 8, 5, -1, -1, -1, -1}, +{10, 3, 11, 10, 1, 3, 9, 5, 4, -1, -1, -1, -1, -1, -1, -1}, +{4, 9, 5, 0, 8, 1, 8, 10, 1, 8, 11, 10, -1, -1, -1, -1}, +{5, 4, 0, 5, 0, 11, 5, 11, 10, 11, 0, 3, -1, -1, -1, -1}, +{5, 4, 8, 5, 8, 10, 10, 8, 11, -1, -1, -1, -1, -1, -1, -1}, +{9, 7, 8, 5, 7, 9, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, +{9, 3, 0, 9, 5, 3, 5, 7, 3, -1, -1, -1, -1, -1, -1, -1}, +{0, 7, 8, 0, 1, 7, 1, 5, 7, -1, -1, -1, -1, -1, -1, -1}, +{1, 5, 3, 3, 5, 7, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, +{9, 7, 8, 9, 5, 7, 10, 1, 2, -1, -1, -1, -1, -1, -1, -1}, +{10, 1, 2, 9, 5, 0, 5, 3, 0, 5, 7, 3, -1, -1, -1, -1}, +{8, 0, 2, 8, 2, 5, 8, 5, 7, 10, 5, 2, -1, -1, -1, -1}, +{2, 10, 5, 2, 5, 3, 3, 5, 7, -1, -1, -1, -1, -1, -1, -1}, +{7, 9, 5, 7, 8, 9, 3, 11, 2, -1, -1, -1, -1, -1, -1, -1}, +{9, 5, 7, 9, 7, 2, 9, 2, 0, 2, 7, 11, -1, -1, -1, -1}, +{2, 3, 11, 0, 1, 8, 1, 7, 8, 1, 5, 7, -1, -1, -1, -1}, +{11, 2, 1, 11, 1, 7, 7, 1, 5, -1, -1, -1, -1, -1, -1, -1}, +{9, 5, 8, 8, 5, 7, 10, 1, 3, 10, 3, 11, -1, -1, -1, -1}, +{5, 7, 0, 5, 0, 9, 7, 11, 0, 1, 0, 10, 11, 10, 0, -1}, +{11, 10, 0, 11, 0, 3, 10, 5, 0, 8, 0, 7, 5, 7, 0, -1}, +{11, 10, 5, 7, 11, 5, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, +{10, 6, 5, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, +{0, 8, 3, 5, 10, 6, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, +{9, 0, 1, 5, 10, 6, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, +{1, 8, 3, 1, 9, 8, 5, 10, 6, -1, -1, -1, -1, -1, -1, -1}, +{1, 6, 5, 2, 6, 1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, +{1, 11, 10, 1, 4, 11, 1, 0, 4, 7, 11, 4, -1, -1, -1, -1}, +{4, 7, 8, 9, 0, 11, 9, 11, 10, 11, 0, 3, -1, -1, -1, -1}, +{4, 7, 11, 4, 11, 9, 9, 11, 10, -1, -1, -1, -1, -1, -1, -1}, +{9, 5, 4, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, +{9, 5, 4, 0, 8, 3, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, +{0, 5, 4, 1, 5, 0, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, +{8, 5, 4, 8, 3, 5, 3, 1, 5, -1, -1, -1, -1, -1, -1, -1}, +{1, 2, 10, 9, 5, 4, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, +{3, 0, 8, 1, 2, 10, 4, 9, 5, -1, -1, -1, -1, -1, -1, -1}, +{5, 2, 10, 5, 4, 2, 4, 0, 2, -1, -1, -1, -1, -1, -1, -1}, +{2, 10, 5, 3, 2, 5, 3, 5, 4, 3, 4, 8, -1, -1, -1, -1}, +{9, 5, 4, 2, 3, 11, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, +{0, 11, 2, 0, 8, 11, 4, 9, 5, -1, -1, -1, -1, -1, -1, -1}, +{0, 5, 4, 0, 1, 5, 2, 3, 11, -1, -1, -1, -1, -1, -1, -1}, +{2, 1, 5, 2, 5, 8, 2, 8, 11, 4, 8, 5, -1, -1, -1, -1}, +{10, 3, 11, 10, 1, 3, 9, 5, 4, -1, -1, -1, -1, -1, -1, -1}, +{4, 9, 5, 0, 8, 1, 8, 10, 1, 8, 11, 10, -1, -1, -1, -1}, +{5, 4, 0, 5, 0, 11, 5, 11, 10, 11, 0, 3, -1, -1, -1, -1}, +{5, 4, 8, 5, 8, 10, 10, 8, 11, -1, -1, -1, -1, -1, -1, -1}, +{9, 7, 8, 5, 7, 9, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, +{9, 3, 0, 9, 5, 3, 5, 7, 3, -1, -1, -1, -1, -1, -1, -1}, +{0, 7, 8, 0, 1, 7, 1, 5, 7, -1, -1, -1, -1, -1, -1, -1}, +{1, 5, 3, 3, 5, 7, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, +{9, 7, 8, 9, 5, 7, 10, 1, 2, -1, -1, -1, -1, -1, -1, -1}, +{10, 1, 2, 9, 5, 0, 5, 3, 0, 5, 7, 3, -1, -1, -1, -1}, +{8, 0, 2, 8, 2, 5, 8, 5, 7, 10, 5, 2, -1, -1, -1, -1}, +{2, 10, 5, 2, 5, 3, 3, 5, 7, -1, -1, -1, -1, -1, -1, -1}, +{7, 9, 5, 7, 8, 9, 3, 11, 2, -1, -1, -1, -1, -1, -1, -1}, +{9, 5, 7, 9, 7, 2, 9, 2, 0, 2, 7, 11, -1, -1, -1, -1}, +{2, 3, 11, 0, 1, 8, 1, 7, 8, 1, 5, 7, -1, -1, -1, -1}, +{11, 2, 1, 11, 1, 7, 7, 1, 5, -1, -1, -1, -1, -1, -1, -1}, +{9, 5, 8, 8, 5, 7, 10, 1, 3, 10, 3, 11, -1, -1, -1, -1}, +{5, 7, 0, 5, 0, 9, 7, 11, 0, 1, 0, 10, 11, 10, 0, -1}, +{11, 10, 0, 11, 0, 3, 10, 5, 0, 8, 0, 7, 5, 7, 0, -1}, +{11, 10, 5, 7, 11, 5, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, +{10, 6, 5, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, +{0, 8, 3, 5, 10, 6, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, +{9, 0, 1, 5, 10, 6, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, +{1, 8, 3, 1, 9, 8, 5, 10, 6, -1, -1, -1, -1, -1, -1, -1}, +{1, 6, 5, 2, 6, 1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, +{2, 6, 9, 2, 9, 1, 6, 7, 9, 0, 9, 3, 7, 3, 9, -1}, +{7, 8, 0, 7, 0, 6, 6, 0, 2, -1, -1, -1, -1, -1, -1, -1}, +{7, 3, 2, 6, 7, 2, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, +{2, 3, 11, 10, 6, 8, 10, 8, 9, 8, 6, 7, -1, -1, -1, -1}, +{2, 0, 7, 2, 7, 11, 0, 9, 7, 6, 7, 10, 9, 10, 7, -1}, +{1, 8, 0, 1, 7, 8, 1, 10, 7, 6, 7, 10, 2, 3, 11, -1}, +{11, 2, 1, 11, 1, 7, 10, 6, 1, 6, 7, 1, -1, -1, -1, -1}, +{8, 9, 6, 8, 6, 7, 9, 1, 6, 11, 6, 3, 1, 3, 6, -1}, +{0, 9, 1, 11, 6, 7, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, +{7, 8, 0, 7, 0, 6, 3, 11, 0, 11, 6, 0, -1, -1, -1, -1}, +{7, 11, 6, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, +{7, 6, 11, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, +{3, 0, 8, 11, 7, 6, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, +{0, 1, 9, 11, 7, 6, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, +{8, 1, 9, 8, 3, 1, 11, 7, 6, -1, -1, -1, -1, -1, -1, -1}, +{10, 1, 2, 6, 11, 7, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, +{1, 2, 10, 3, 0, 8, 6, 11, 7, -1, -1, -1, -1, -1, -1, -1}, +{2, 9, 0, 2, 10, 9, 6, 11, 7, -1, -1, -1, -1, -1, -1, -1}, +{6, 11, 7, 2, 10, 3, 10, 8, 3, 10, 9, 8, -1, -1, -1, -1}, +{7, 2, 3, 6, 2, 7, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, +{7, 0, 8, 7, 6, 0, 6, 2, 0, -1, -1, -1, -1, -1, -1, -1}, +{2, 7, 6, 2, 3, 7, 0, 1, 9, -1, -1, -1, -1, -1, -1, -1}, +{1, 6, 2, 1, 8, 6, 1, 9, 8, 8, 7, 6, -1, -1, -1, -1}, +{10, 7, 6, 10, 1, 7, 1, 3, 7, -1, -1, -1, -1, -1, -1, -1}, +{10, 7, 6, 1, 7, 10, 1, 8, 7, 1, 0, 8, -1, -1, -1, -1}, +{0, 3, 7, 0, 7, 10, 0, 10, 9, 6, 10, 7, -1, -1, -1, -1}, +{7, 6, 10, 7, 10, 8, 8, 10, 9, -1, -1, -1, -1, -1, -1, -1}, +{6, 8, 4, 11, 8, 6, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, +{3, 6, 11, 3, 0, 6, 0, 4, 6, -1, -1, -1, -1, -1, -1, -1}, +{8, 6, 11, 8, 4, 6, 9, 0, 1, -1, -1, -1, -1, -1, -1, -1}, +{9, 4, 6, 9, 6, 3, 9, 3, 1, 11, 3, 6, -1, -1, -1, -1}, +{6, 8, 4, 6, 11, 8, 2, 10, 1, -1, -1, -1, -1, -1, -1, -1}, +{1, 2, 10, 3, 0, 11, 0, 6, 11, 0, 4, 6, -1, -1, -1, -1}, +{4, 11, 8, 4, 6, 11, 0, 2, 9, 2, 10, 9, -1, -1, -1, -1}, +{10, 9, 3, 10, 3, 2, 9, 4, 3, 11, 3, 6, 4, 6, 3, -1}, +{8, 2, 3, 8, 4, 2, 4, 6, 2, -1, -1, -1, -1, -1, -1, -1}, +{0, 4, 2, 4, 6, 2, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, +{1, 9, 0, 2, 3, 4, 2, 4, 6, 4, 3, 8, -1, -1, -1, -1}, +{1, 9, 4, 1, 4, 2, 2, 4, 6, -1, -1, -1, -1, -1, -1, -1}, +{8, 1, 3, 8, 6, 1, 8, 4, 6, 6, 10, 1, -1, -1, -1, -1}, +{10, 1, 0, 10, 0, 6, 6, 0, 4, -1, -1, -1, -1, -1, -1, -1}, +{4, 6, 3, 4, 3, 8, 6, 10, 3, 0, 3, 9, 10, 9, 3, -1}, +{10, 9, 4, 6, 10, 4, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, +{4, 9, 5, 7, 6, 11, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, +{0, 8, 3, 4, 9, 5, 11, 7, 6, -1, -1, -1, -1, -1, -1, -1}, +{5, 0, 1, 5, 4, 0, 7, 6, 11, -1, -1, -1, -1, -1, -1, -1}, +{11, 7, 6, 8, 3, 4, 3, 5, 4, 3, 1, 5, -1, -1, -1, -1}, +{9, 5, 4, 10, 1, 2, 7, 6, 11, -1, -1, -1, -1, -1, -1, -1}, +{6, 11, 7, 1, 2, 10, 0, 8, 3, 4, 9, 5, -1, -1, -1, -1}, +{7, 6, 11, 5, 4, 10, 4, 2, 10, 4, 0, 2, -1, -1, -1, -1}, +{3, 4, 8, 3, 5, 4, 3, 2, 5, 10, 5, 2, 11, 7, 6, -1}, +{7, 2, 3, 7, 6, 2, 5, 4, 9, -1, -1, -1, -1, -1, -1, -1}, +{9, 5, 4, 0, 8, 6, 0, 6, 2, 6, 8, 7, -1, -1, -1, -1}, +{3, 6, 2, 3, 7, 6, 1, 5, 0, 5, 4, 0, -1, -1, -1, -1}, +{6, 2, 8, 6, 8, 7, 2, 1, 8, 4, 8, 5, 1, 5, 8, -1}, +{9, 5, 4, 10, 1, 6, 1, 7, 6, 1, 3, 7, -1, -1, -1, -1}, +{1, 6, 10, 1, 7, 6, 1, 0, 7, 8, 7, 0, 9, 5, 4, -1}, +{4, 0, 10, 4, 10, 5, 0, 3, 10, 6, 10, 7, 3, 7, 10, -1}, +{7, 6, 10, 7, 10, 8, 5, 4, 10, 4, 8, 10, -1, -1, -1, -1}, +{6, 9, 5, 6, 11, 9, 11, 8, 9, -1, -1, -1, -1, -1, -1, -1}, +{3, 6, 11, 0, 6, 3, 0, 5, 6, 0, 9, 5, -1, -1, -1, -1}, +{0, 11, 8, 0, 5, 11, 0, 1, 5, 5, 6, 11, -1, -1, -1, -1}, +{6, 11, 3, 6, 3, 5, 5, 3, 1, -1, -1, -1, -1, -1, -1, -1}, +{1, 2, 10, 9, 5, 11, 9, 11, 8, 11, 5, 6, -1, -1, -1, -1}, +{0, 11, 3, 0, 6, 11, 0, 9, 6, 5, 6, 9, 1, 2, 10, -1}, +{11, 8, 5, 11, 5, 6, 8, 0, 5, 10, 5, 2, 0, 2, 5, -1}, +{6, 11, 3, 6, 3, 5, 2, 10, 3, 10, 5, 3, -1, -1, -1, -1}, +{5, 8, 9, 5, 2, 8, 5, 6, 2, 3, 8, 2, -1, -1, -1, -1}, +{9, 5, 6, 9, 6, 0, 0, 6, 2, -1, -1, -1, -1, -1, -1, -1}, +{1, 5, 8, 1, 8, 0, 5, 6, 8, 3, 8, 2, 6, 2, 8, -1}, +{1, 5, 6, 2, 1, 6, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, +{1, 3, 6, 1, 6, 10, 3, 8, 6, 5, 6, 9, 8, 9, 6, -1}, +{10, 1, 0, 10, 0, 6, 9, 5, 0, 5, 6, 0, -1, -1, -1, -1}, +{0, 3, 8, 5, 6, 10, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, +{10, 5, 6, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, +{11, 5, 10, 7, 5, 11, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, +{11, 5, 10, 11, 7, 5, 8, 3, 0, -1, -1, -1, -1, -1, -1, -1}, +{5, 11, 7, 5, 10, 11, 1, 9, 0, -1, -1, -1, -1, -1, -1, -1}, +{10, 7, 5, 10, 11, 7, 9, 8, 1, 8, 3, 1, -1, -1, -1, -1}, +{11, 1, 2, 11, 7, 1, 7, 5, 1, -1, -1, -1, -1, -1, -1, -1}, +{0, 8, 3, 1, 2, 7, 1, 7, 5, 7, 2, 11, -1, -1, -1, -1}, +{9, 7, 5, 9, 2, 7, 9, 0, 2, 2, 11, 7, -1, -1, -1, -1}, +{7, 5, 2, 7, 2, 11, 5, 9, 2, 3, 2, 8, 9, 8, 2, -1}, +{2, 5, 10, 2, 3, 5, 3, 7, 5, -1, -1, -1, -1, -1, -1, -1}, +{8, 2, 0, 8, 5, 2, 8, 7, 5, 10, 2, 5, -1, -1, -1, -1}, +{9, 0, 1, 5, 10, 3, 5, 3, 7, 3, 10, 2, -1, -1, -1, -1}, +{9, 8, 2, 9, 2, 1, 8, 7, 2, 10, 2, 5, 7, 5, 2, -1}, +{1, 3, 5, 3, 7, 5, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, +{0, 8, 7, 0, 7, 1, 1, 7, 5, -1, -1, -1, -1, -1, -1, -1}, +{9, 0, 3, 9, 3, 5, 5, 3, 7, -1, -1, -1, -1, -1, -1, -1}, +{9, 8, 7, 5, 9, 7, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, +{5, 8, 4, 5, 10, 8, 10, 11, 8, -1, -1, -1, -1, -1, -1, -1}, +{5, 0, 4, 5, 11, 0, 5, 10, 11, 11, 3, 0, -1, -1, -1, -1}, +{0, 1, 9, 8, 4, 10, 8, 10, 11, 10, 4, 5, -1, -1, -1, -1}, +{10, 11, 4, 10, 4, 5, 11, 3, 4, 9, 4, 1, 3, 1, 4, -1}, +{2, 5, 1, 2, 8, 5, 2, 11, 8, 4, 5, 8, -1, -1, -1, -1}, +{0, 4, 11, 0, 11, 3, 4, 5, 11, 2, 11, 1, 5, 1, 11, -1}, +{0, 2, 5, 0, 5, 9, 2, 11, 5, 4, 5, 8, 11, 8, 5, -1}, +{9, 4, 5, 2, 11, 3, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, +{2, 5, 10, 3, 5, 2, 3, 4, 5, 3, 8, 4, -1, -1, -1, -1}, +{5, 10, 2, 5, 2, 4, 4, 2, 0, -1, -1, -1, -1, -1, -1, -1}, +{3, 10, 2, 3, 5, 10, 3, 8, 5, 4, 5, 8, 0, 1, 9, -1}, +{5, 10, 2, 5, 2, 4, 1, 9, 2, 9, 4, 2, -1, -1, -1, -1}, +{8, 4, 5, 8, 5, 3, 3, 5, 1, -1, -1, -1, -1, -1, -1, -1}, +{0, 4, 5, 1, 0, 5, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, +{8, 4, 5, 8, 5, 3, 9, 0, 5, 0, 3, 5, -1, -1, -1, -1}, +{9, 4, 5, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, +{4, 11, 7, 4, 9, 11, 9, 10, 11, -1, -1, -1, -1, -1, -1, -1}, +{0, 8, 3, 4, 9, 7, 9, 11, 7, 9, 10, 11, -1, -1, -1, -1}, +{1, 10, 11, 1, 11, 4, 1, 4, 0, 7, 4, 11, -1, -1, -1, -1}, +{3, 1, 4, 3, 4, 8, 1, 10, 4, 7, 4, 11, 10, 11, 4, -1}, +{4, 11, 7, 9, 11, 4, 9, 2, 11, 9, 1, 2, -1, -1, -1, -1}, +{9, 7, 4, 9, 11, 7, 9, 1, 11, 2, 11, 1, 0, 8, 3, -1}, +{11, 7, 4, 11, 4, 2, 2, 4, 0, -1, -1, -1, -1, -1, -1, -1}, +{11, 7, 4, 11, 4, 2, 8, 3, 4, 3, 2, 4, -1, -1, -1, -1}, +{2, 9, 10, 2, 7, 9, 2, 3, 7, 7, 4, 9, -1, -1, -1, -1}, +{9, 10, 7, 9, 7, 4, 10, 2, 7, 8, 7, 0, 2, 0, 7, -1}, +{3, 7, 10, 3, 10, 2, 7, 4, 10, 1, 10, 0, 4, 0, 10, -1}, +{1, 10, 2, 8, 7, 4, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, +{4, 9, 1, 4, 1, 7, 7, 1, 3, -1, -1, -1, -1, -1, -1, -1}, +{4, 9, 1, 4, 1, 7, 0, 8, 1, 8, 7, 1, -1, -1, -1, -1}, +{4, 0, 3, 7, 4, 3, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, +{4, 8, 7, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, +{9, 10, 8, 10, 11, 8, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, +{3, 0, 9, 3, 9, 11, 11, 9, 10, -1, -1, -1, -1, -1, -1, -1}, +{0, 1, 10, 0, 10, 8, 8, 10, 11, -1, -1, -1, -1, -1, -1, -1}, +{3, 1, 10, 11, 3, 10, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, +{1, 2, 11, 1, 11, 9, 9, 11, 8, -1, -1, -1, -1, -1, -1, -1}, +{3, 0, 9, 3, 9, 11, 1, 2, 9, 2, 11, 9, -1, -1, -1, -1}, +{0, 2, 11, 8, 0, 11, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, +{3, 2, 11, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, +{2, 3, 8, 2, 8, 10, 10, 8, 9, -1, -1, -1, -1, -1, -1, -1}, +{9, 10, 2, 0, 9, 2, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, +{2, 3, 8, 2, 8, 10, 0, 1, 8, 1, 10, 8, -1, -1, -1, -1}, +{1, 10, 2, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, +{1, 3, 8, 9, 1, 8, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, +{0, 9, 1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, +{0, 3, 8, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, +{-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}}; + + + + void nmg_triangulate_model_mc(struct model *m, const struct bn_tol *tol) { This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <br...@us...> - 2010-01-29 13:01:59
|
Revision: 37465 http://brlcad.svn.sourceforge.net/brlcad/?rev=37465&view=rev Author: brlcad Date: 2010-01-29 13:00:44 +0000 (Fri, 29 Jan 2010) Log Message: ----------- refactor the 'generic' parsetab routines for form(), adjust(), make(), and get() renaming some from rt_parsetab prefix to all using rt_generic prefix and living in their own file. remove unnecessary declarations. Modified Paths: -------------- brlcad/trunk/src/librt/Makefile.am brlcad/trunk/src/librt/primitives/table.c brlcad/trunk/src/librt/tcl.c Added Paths: ----------- brlcad/trunk/src/librt/primitives/generic.c Modified: brlcad/trunk/src/librt/Makefile.am =================================================================== --- brlcad/trunk/src/librt/Makefile.am 2010-01-29 12:56:58 UTC (rev 37464) +++ brlcad/trunk/src/librt/Makefile.am 2010-01-29 13:00:44 UTC (rev 37465) @@ -134,6 +134,7 @@ primitives/eto/eto_mirror.c \ primitives/extrude/extrude.c \ primitives/extrude/extrude_brep.cpp \ + primitives/generic.c \ primitives/grip/grip.c \ primitives/grip/grip_mirror.c \ primitives/half/half.c \ Added: brlcad/trunk/src/librt/primitives/generic.c =================================================================== --- brlcad/trunk/src/librt/primitives/generic.c (rev 0) +++ brlcad/trunk/src/librt/primitives/generic.c 2010-01-29 13:00:44 UTC (rev 37465) @@ -0,0 +1,274 @@ +/* G E N E R I C . C + * BRL-CAD + * + * Copyright (c) 1989-2010 United States Government as represented by + * the U.S. Army Research Laboratory. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public License + * version 2.1 as published by the Free Software Foundation. + * + * This library is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this file; see the file named COPYING for more + * information. + */ +/** @addtogroup g_ */ +/** @{ */ +/** @file generic.c + * + * Generic routines applicable across most primitives + * + */ +/** @} */ + +#include "common.h" + +#include "bu.h" +#include "bn.h" +#include "raytrace.h" + + +/** + * R T _ G E N E R I C _ X F O R M + * + * Apply a 4x4 transformation matrix to the internal form of a solid. + * + * If "free" flag is non-zero, storage for the original solid is + * released. If "os" is same as "is", storage for the original solid + * is overwritten with the new, transformed solid. + * + * Returns - + * -1 FAIL + * 0 OK + */ +int +rt_generic_xform( + struct rt_db_internal *op, + const mat_t mat, + struct rt_db_internal *ip, + int release, + struct db_i *dbip, + struct resource *resp) +{ + struct bu_external ext; + int id; + struct bu_attribute_value_set avs; + + + RT_CK_DB_INTERNAL(ip); + RT_CK_DBI(dbip); + RT_CK_RESOURCE(resp); + + id = ip->idb_type; + BU_INIT_EXTERNAL(&ext); + /* Scale change on export is 1.0 -- no change */ + switch (dbip->dbi_version) { + case 4: + if (rt_functab[id].ft_export4(&ext, ip, 1.0, dbip, resp) < 0) { + bu_log("rt_generic_xform(): %s export failure\n", + rt_functab[id].ft_name); + return -1; /* FAIL */ + } + if ((release || op == ip)) rt_db_free_internal(ip); + + RT_INIT_DB_INTERNAL(op); + if (rt_functab[id].ft_import4(op, &ext, mat, dbip, resp) < 0) { + bu_log("rt_generic_xform(): solid import failure\n"); + return -1; /* FAIL */ + } + break; + case 5: + avs.magic = -1; + + if (rt_functab[id].ft_export5(&ext, ip, 1.0, dbip, resp) < 0) { + bu_log("rt_generic_xform(): %s export failure\n", + rt_functab[id].ft_name); + return -1; /* FAIL */ + } + + if ((release || op == ip)) { + if (ip->idb_avs.magic == BU_AVS_MAGIC) { + /* grab the attributes before they are lost + * by rt_db_free_internal or RT_INIT_DB_INTERNAL + */ + bu_avs_init(&avs, ip->idb_avs.count, "avs"); + bu_avs_merge(&avs, &ip->idb_avs); + } + rt_db_free_internal(ip); + } + + RT_INIT_DB_INTERNAL(op); + + if (!release && op != ip) { + /* just copy the attributes from ip to op */ + if (ip->idb_avs.magic == BU_AVS_MAGIC) { + bu_avs_init(&op->idb_avs, ip->idb_avs.count, "avs"); + bu_avs_merge(&op->idb_avs, &ip->idb_avs); + } + } else if (avs.magic == BU_AVS_MAGIC) { + /* put the saved attributes in the output */ + bu_avs_init(&op->idb_avs, avs.count, "avs"); + bu_avs_merge(&op->idb_avs, &avs); + bu_avs_free(&avs); + } + + if (rt_functab[id].ft_import5(op, &ext, mat, dbip, resp) < 0) { + bu_log("rt_generic_xform(): solid import failure\n"); + return -1; /* FAIL */ + } + break; + } + + bu_free_external(&ext); + + RT_CK_DB_INTERNAL(op); + return 0; /* OK */ +} + + +/** + * R T _ G E N E R I C _ G E T + * + * This is the generic routine to be listed in rt_functab[].ft_get + * for those solid types which are fully described by their + * ft_parsetab entry. + * + * 'attr' is specified to retrieve only one attribute, rather than + * all. Example: "db get ell.s B" to get only the B vector. + */ +int +rt_generic_get(struct bu_vls *logstr, const struct rt_db_internal *intern, const char *attr) +{ + register const struct bu_structparse *sp = NULL; + register const struct rt_functab *ftp; + + RT_CK_DB_INTERNAL(intern); + ftp = intern->idb_meth; + RT_CK_FUNCTAB(ftp); + + sp = ftp->ft_parsetab; + if (!sp) { + bu_vls_printf(logstr, + "%s {a Tcl output routine for this type of object has not yet been implemented}", + ftp->ft_label); + return BRLCAD_ERROR; + } + + if (attr == (char *)0) { + struct bu_vls str; + + bu_vls_init(&str); + + /* Print out solid type and all attributes */ + bu_vls_printf(logstr, "%s", ftp->ft_label); + while (sp->sp_name != NULL) { + bu_vls_printf(logstr, " %s", sp->sp_name); + + bu_vls_trunc(&str, 0); + bu_vls_struct_item(&str, sp, + (char *)intern->idb_ptr, ' '); + + if (sp->sp_count < 2) + bu_vls_printf(logstr, " %V", &str); + else { + bu_vls_printf(logstr, " {"); + bu_vls_printf(logstr, "%V", &str); + bu_vls_printf(logstr, "} "); + } + + ++sp; + } + + bu_vls_free(&str); + } else { + if (bu_vls_struct_item_named(logstr, sp, attr, (char *)intern->idb_ptr, ' ') < 0) { + bu_vls_printf(logstr, + "Objects of type %s do not have a %s attribute.", + ftp->ft_label, attr); + return BRLCAD_ERROR; + } + } + + return BRLCAD_OK; +} + + +/** + * R T _ G E N E R I C _ M A K E + * + * This one assumes that making all the parameters null is fine. + */ +void +rt_generic_make(const struct rt_functab *ftp, struct rt_db_internal *intern) +{ + intern->idb_type = ftp - rt_functab; + intern->idb_major_type = DB5_MAJORTYPE_BRLCAD; + BU_ASSERT(&rt_functab[intern->idb_type] == ftp); + + intern->idb_meth = ftp; + intern->idb_ptr = bu_calloc(ftp->ft_internal_size, 1, "rt_generic_make"); + *((long *)(intern->idb_ptr)) = ftp->ft_internal_magic; +} + + +/** + * R T _ G E N E R I C _ A D J U S T + * + * For those solids entirely defined by their parsetab. Invoked via + * rt_functab[].ft_adjust() + */ +int +rt_generic_adjust(struct bu_vls *logstr, struct rt_db_internal *intern, int argc, char **argv) +{ + const struct rt_functab *ftp; + + RT_CK_DB_INTERNAL(intern); + ftp = intern->idb_meth; + RT_CK_FUNCTAB(ftp); + + if (ftp->ft_parsetab == (struct bu_structparse *)NULL) { + bu_vls_printf(logstr, "%s type objects do not yet have a 'db put' (adjust) handler.", ftp->ft_label); + return BRLCAD_ERROR; + } + + return bu_structparse_argv(logstr, argc, argv, ftp->ft_parsetab, (char *)intern->idb_ptr); +} + + +/** + * R T _ G E N E R I C _ F O R M + * + * Invoked via rt_functab[].ft_form() on solid types which are + * fully described by their bu_structparse table in ft_parsetab. + */ +int +rt_generic_form(struct bu_vls *logstr, const struct rt_functab *ftp) +{ + RT_CK_FUNCTAB(ftp); + + if (ftp->ft_parsetab) { + bu_structparse_get_terse_form(logstr, ftp->ft_parsetab); + return BRLCAD_OK; + } + bu_vls_printf(logstr, + "%s is a valid object type, but a 'form' routine has not yet been implemented.", + ftp->ft_label); + + return BRLCAD_ERROR; +} + + +/* + * Local Variables: + * mode: C + * tab-width: 8 + * indent-tabs-mode: t + * c-file-style: "stroustrup" + * End: + * ex: shiftwidth=4 tabstop=8 + */ Property changes on: brlcad/trunk/src/librt/primitives/generic.c ___________________________________________________________________ Added: svn:mime-type + text/plain Added: svn:eol-style + native Modified: brlcad/trunk/src/librt/primitives/table.c =================================================================== --- brlcad/trunk/src/librt/primitives/table.c 2010-01-29 12:56:58 UTC (rev 37464) +++ brlcad/trunk/src/librt/primitives/table.c 2010-01-29 13:00:44 UTC (rev 37465) @@ -71,141 +71,61 @@ extern const struct bu_structparse rt_##name##_parse[] -#define rt_tor_xform rt_generic_xform RT_DECLARE_INTERFACE(tor); - -#define rt_tgc_xform rt_generic_xform RT_DECLARE_INTERFACE(tgc); - -#define rt_ell_xform rt_generic_xform RT_DECLARE_INTERFACE(ell); - -#define rt_arb_xform rt_generic_xform RT_DECLARE_INTERFACE(arb); - -#define rt_ars_xform rt_generic_xform RT_DECLARE_INTERFACE(ars); - RT_DECLARE_INTERFACE(hlf); - -#define rt_rec_xform rt_generic_xform RT_DECLARE_INTERFACE(rec); - -#define rt_pg_xform rt_generic_xform RT_DECLARE_INTERFACE(pg); - -#define rt_nurb_xform rt_generic_xform RT_DECLARE_INTERFACE(nurb); - -#define rt_sph_xform rt_generic_xform RT_DECLARE_INTERFACE(sph); - -#define rt_ebm_xform rt_generic_xform RT_DECLARE_INTERFACE(ebm); - -#define rt_vol_xform rt_generic_xform RT_DECLARE_INTERFACE(vol); - -#define rt_arbn_xform rt_generic_xform RT_DECLARE_INTERFACE(arbn); - -#define rt_pipe_xform rt_generic_xform RT_DECLARE_INTERFACE(pipe); - -#define rt_part_xform rt_generic_xform RT_DECLARE_INTERFACE(part); - -#define rt_nmg_xform rt_generic_xform RT_DECLARE_INTERFACE(nmg); - -#define rt_rpc_xform rt_generic_xform RT_DECLARE_INTERFACE(rpc); - -#define rt_rhc_xform rt_generic_xform RT_DECLARE_INTERFACE(rhc); - -#define rt_epa_xform rt_generic_xform RT_DECLARE_INTERFACE(epa); - -#define rt_ehy_xform rt_generic_xform RT_DECLARE_INTERFACE(ehy); - -#define rt_eto_xform rt_generic_xform RT_DECLARE_INTERFACE(eto); - -#define rt_grp_xform rt_generic_xform RT_DECLARE_INTERFACE(grp); - -#define rt_hf_xform rt_generic_xform RT_DECLARE_INTERFACE(hf); - -#define rt_dsp_xform rt_generic_xform RT_DECLARE_INTERFACE(dsp); - -#define rt_sketch_xform rt_generic_xform RT_DECLARE_INTERFACE(sketch); - RT_DECLARE_INTERFACE(extrude); - -#define rt_submodel_xform rt_generic_xform RT_DECLARE_INTERFACE(submodel); - -#define rt_cline_xform rt_generic_xform RT_DECLARE_INTERFACE(cline); - RT_DECLARE_INTERFACE(bot); - -#define rt_superell_xform rt_generic_xform RT_DECLARE_INTERFACE(superell); - -#define rt_metaball_xform rt_generic_xform RT_DECLARE_INTERFACE(metaball); - -#define rt_hyp_xform rt_generic_xform RT_DECLARE_INTERFACE(hyp); - -#define rt_revolve_xform rt_generic_xform RT_DECLARE_INTERFACE(revolve); - -#define rt_constraint_xform rt_generic_xform RT_DECLARE_INTERFACE(constraint); - -/* - #define rt_binunif_xform rt_generic_xform - RT_DECLARE_INTERFACE(binunif); -*/ - -#define rt_pnts_xform rt_generic_xform +/* RT_DECLARE_INTERFACE(binunif); */ RT_DECLARE_INTERFACE(pnts); #if OBJ_BREP -#define rt_brep_xform rt_generic_xform RT_DECLARE_INTERFACE(brep); #endif -/* from db5_bin.c */ -BU_EXTERN(int rt_binunif_import5, (struct rt_db_internal * ip, - const struct bu_external *ep, - const mat_t mat, - const struct db_i *dbip, - struct resource *resp)); -BU_EXTERN(int rt_binmime_import5, (struct rt_db_internal * ip, - const struct bu_external *ep, - const mat_t mat, - const struct db_i *dbip, - struct resource *resp)); +/* generics for object manipulation, in generic.c */ +extern int rt_generic_get(struct bu_vls *, const struct rt_db_internal *, const char *); +extern int rt_generic_adjust(struct bu_vls *, struct rt_db_internal *, int, char **); +extern int rt_generic_form(struct bu_vls *, const struct rt_functab *); +extern void rt_generic_make(const struct rt_functab *, struct rt_db_internal *); +extern int rt_generic_xform(struct rt_db_internal *, const mat_t, struct rt_db_internal *, int, struct db_i *, struct resource *); -BU_EXTERN(int rt_binunif_export5, (struct bu_external *ep, - const struct rt_db_internal *ip, - double local2mm, - const struct db_i *dbip, - struct resource *resp)); - +/* from db5_bin.c */ +BU_EXTERN(int rt_binunif_import5, (struct rt_db_internal * ip, const struct bu_external *ep, const mat_t mat, const struct db_i *dbip, struct resource *resp)); +BU_EXTERN(int rt_binmime_import5, (struct rt_db_internal * ip, const struct bu_external *ep, const mat_t mat, const struct db_i *dbip, struct resource *resp)); +BU_EXTERN(int rt_binunif_export5, (struct bu_external *ep, const struct rt_db_internal *ip, double local2mm, const struct db_i *dbip, struct resource *resp)); BU_EXTERN(void rt_binunif_ifree, (struct rt_db_internal *ip)); -BU_EXTERN(int rt_binunif_describe, (struct bu_vls *str, - const struct rt_db_internal *ip, int verbose, - double mm2local, struct resource *resp, struct db_i *db_i)); +BU_EXTERN(int rt_binunif_describe, (struct bu_vls *str, const struct rt_db_internal *ip, int verbose, double mm2local, struct resource *resp, struct db_i *db_i)); BU_EXTERN(void rt_binunif_make, (const struct rt_functab *ftp, struct rt_db_internal *intern)); BU_EXTERN(int rt_binunif_get, (struct bu_vls *logstr, const struct rt_db_internal *intern, const char *attr)); BU_EXTERN(int rt_binunif_adjust, (struct bu_vls *logstr, struct rt_db_internal *intern, int argc, char **argv)); @@ -219,40 +139,14 @@ BU_EXTERN(void rt_comb_make, (const struct rt_functab *ftp, struct rt_db_internal *intern)); BU_EXTERN(void rt_comb_ifree, (struct rt_db_internal *ip)); -/* generics for solid */ -BU_EXTERN(int rt_parsetab_get, (struct bu_vls *logstr, const struct rt_db_internal *intern, const char *attr)); -BU_EXTERN(int rt_parsetab_adjust, (struct bu_vls *logstr, struct rt_db_internal *intern, int argc, char **argv)); -BU_EXTERN(int rt_parsetab_form, (struct bu_vls *logstr, const struct rt_functab *ftp)); -BU_EXTERN(void rt_generic_make, (const struct rt_functab *ftp, struct rt_db_internal *intern)); - -/* EBM solid */ BU_EXTERN(int rt_ebm_form, (struct bu_vls *logstr, const struct rt_functab *ftp)); -BU_EXTERN(void rt_ebm_make, (const struct rt_functab *, struct rt_db_internal *)); - -/* DSP solid */ -BU_EXTERN(void rt_dsp_make, (const struct rt_functab *, struct rt_db_internal *)); - -/* NMG solid */ -BU_EXTERN(void rt_nmg_make, (const struct rt_functab *, struct rt_db_internal *)); - -/* BOT solid */ BU_EXTERN(int rt_bot_form, (struct bu_vls *logstr, const struct rt_functab *ftp)); - -/* SKETCH */ BU_EXTERN(int rt_sketch_form, (struct bu_vls *logstr, const struct rt_functab *ftp)); - -/* CLINE */ BU_EXTERN(int rt_cline_form, (struct bu_vls *logstr, const struct rt_functab *ftp)); - -/* EXTRUSION */ BU_EXTERN(int rt_extrude_form, (struct bu_vls *logstr, const struct rt_functab *ftp)); -/* PNTS */ -/* From here in table.c */ -BU_EXTERN(int rt_generic_xform, (struct rt_db_internal *op, const mat_t mat, struct rt_db_internal *ip, int release, struct db_i *dbip, struct resource *resp)); - const struct rt_functab rt_functab[] = { { /* 0: unused, for sanity checking. */ @@ -313,13 +207,13 @@ rt_tor_export4, rt_tor_ifree, rt_tor_describe, - rt_tor_xform, + rt_generic_xform, rt_tor_parse, sizeof(struct rt_tor_internal), RT_TOR_INTERNAL_MAGIC, - rt_parsetab_get, - rt_parsetab_adjust, - rt_parsetab_form, + rt_generic_get, + rt_generic_adjust, + rt_generic_form, NULL, rt_tor_params }, @@ -348,13 +242,13 @@ rt_tgc_export4, rt_tgc_ifree, rt_tgc_describe, - rt_tgc_xform, + rt_generic_xform, rt_tgc_parse, sizeof(struct rt_tgc_internal), RT_TGC_INTERNAL_MAGIC, - rt_parsetab_get, - rt_parsetab_adjust, - rt_parsetab_form, + rt_generic_get, + rt_generic_adjust, + rt_generic_form, NULL, rt_tgc_params }, @@ -383,13 +277,13 @@ rt_ell_export4, rt_ell_ifree, rt_ell_describe, - rt_ell_xform, + rt_generic_xform, rt_ell_parse, sizeof(struct rt_ell_internal), RT_ELL_INTERNAL_MAGIC, - rt_parsetab_get, - rt_parsetab_adjust, - rt_parsetab_form, + rt_generic_get, + rt_generic_adjust, + rt_generic_form, NULL, rt_ell_params }, @@ -418,13 +312,13 @@ rt_arb_export4, rt_arb_ifree, rt_arb_describe, - rt_arb_xform, + rt_generic_xform, rt_arb_parse, sizeof(struct rt_arb_internal), RT_ARB_INTERNAL_MAGIC, - rt_parsetab_get, - rt_parsetab_adjust, - rt_parsetab_form, + rt_generic_get, + rt_generic_adjust, + rt_generic_form, NULL, rt_arb_params }, @@ -453,13 +347,13 @@ rt_ars_export4, rt_ars_ifree, rt_ars_describe, - rt_ars_xform, + rt_generic_xform, NULL, sizeof(struct rt_ars_internal), RT_ARS_INTERNAL_MAGIC, rt_ars_get, rt_ars_adjust, - rt_parsetab_form, + rt_generic_form, NULL, rt_ars_params }, @@ -488,13 +382,13 @@ rt_hlf_export4, rt_hlf_ifree, rt_hlf_describe, - rt_generic_xform, + rt_hlf_xform, rt_hlf_parse, sizeof(struct rt_half_internal), RT_HALF_INTERNAL_MAGIC, - rt_parsetab_get, - rt_parsetab_adjust, - rt_parsetab_form, + rt_generic_get, + rt_generic_adjust, + rt_generic_form, NULL, rt_hlf_params }, @@ -523,13 +417,13 @@ rt_tgc_export4, rt_tgc_ifree, rt_tgc_describe, - rt_rec_xform, + rt_generic_xform, rt_tgc_parse, sizeof(struct rt_tgc_internal), RT_TGC_INTERNAL_MAGIC, - rt_parsetab_get, - rt_parsetab_adjust, - rt_parsetab_form, + rt_generic_get, + rt_generic_adjust, + rt_generic_form, NULL, rt_rec_params }, @@ -558,13 +452,13 @@ rt_pg_export4, rt_pg_ifree, rt_pg_describe, - rt_pg_xform, + rt_generic_xform, NULL, sizeof(struct rt_pg_internal), RT_PG_INTERNAL_MAGIC, - rt_parsetab_get, - rt_parsetab_adjust, - rt_parsetab_form, + rt_generic_get, + rt_generic_adjust, + rt_generic_form, NULL, rt_pg_params }, @@ -593,13 +487,13 @@ rt_nurb_export4, rt_nurb_ifree, rt_nurb_describe, - rt_nurb_xform, + rt_generic_xform, NULL, sizeof(struct rt_nurb_internal), RT_NURB_INTERNAL_MAGIC, rt_nurb_get, rt_nurb_adjust, - rt_parsetab_form, + rt_generic_form, NULL, rt_nurb_params }, @@ -628,13 +522,13 @@ rt_ell_export4, rt_ell_ifree, rt_ell_describe, - rt_sph_xform, + rt_generic_xform, rt_ell_parse, sizeof(struct rt_ell_internal), RT_ELL_INTERNAL_MAGIC, - rt_parsetab_get, - rt_parsetab_adjust, - rt_parsetab_form, + rt_generic_get, + rt_generic_adjust, + rt_generic_form, NULL, rt_sph_params }, @@ -663,13 +557,13 @@ rt_nmg_export4, rt_nmg_ifree, rt_nmg_describe, - rt_nmg_xform, + rt_generic_xform, NULL, sizeof(struct model), NMG_MODEL_MAGIC, rt_nmg_get, rt_nmg_adjust, - rt_parsetab_form, + rt_generic_form, rt_nmg_make, rt_nmg_params }, @@ -698,7 +592,7 @@ rt_ebm_export4, rt_ebm_ifree, rt_ebm_describe, - rt_ebm_xform, + rt_generic_xform, rt_ebm_parse, sizeof(struct rt_ebm_internal), RT_EBM_INTERNAL_MAGIC, @@ -733,13 +627,13 @@ rt_vol_export4, rt_vol_ifree, rt_vol_describe, - rt_vol_xform, + rt_generic_xform, rt_vol_parse, sizeof(struct rt_vol_internal), RT_VOL_INTERNAL_MAGIC, - rt_parsetab_get, - rt_parsetab_adjust, - rt_parsetab_form, + rt_generic_get, + rt_generic_adjust, + rt_generic_form, NULL, rt_vol_params }, @@ -768,13 +662,13 @@ rt_arbn_export4, rt_arbn_ifree, rt_arbn_describe, - rt_arbn_xform, + rt_generic_xform, NULL, sizeof(struct rt_arbn_internal), RT_ARBN_INTERNAL_MAGIC, rt_arbn_get, rt_arbn_adjust, - rt_parsetab_form, + rt_generic_form, NULL, rt_arbn_params }, @@ -803,13 +697,13 @@ rt_pipe_export4, rt_pipe_ifree, rt_pipe_describe, - rt_pipe_xform, + rt_generic_xform, NULL, sizeof(struct rt_pipe_internal), RT_PIPE_INTERNAL_MAGIC, rt_pipe_get, rt_pipe_adjust, - rt_parsetab_form, + rt_generic_form, NULL, rt_pipe_params }, @@ -838,13 +732,13 @@ rt_part_export4, rt_part_ifree, rt_part_describe, - rt_part_xform, + rt_generic_xform, rt_part_parse, sizeof(struct rt_part_internal), RT_PART_INTERNAL_MAGIC, - rt_parsetab_get, - rt_parsetab_adjust, - rt_parsetab_form, + rt_generic_get, + rt_generic_adjust, + rt_generic_form, NULL, rt_part_params }, @@ -873,13 +767,13 @@ rt_rpc_export4, rt_rpc_ifree, rt_rpc_describe, - rt_rpc_xform, + rt_generic_xform, rt_rpc_parse, sizeof(struct rt_rpc_internal), RT_RPC_INTERNAL_MAGIC, - rt_parsetab_get, - rt_parsetab_adjust, - rt_parsetab_form, + rt_generic_get, + rt_generic_adjust, + rt_generic_form, NULL, rt_rpc_params }, @@ -908,13 +802,13 @@ rt_rhc_export4, rt_rhc_ifree, rt_rhc_describe, - rt_rhc_xform, + rt_generic_xform, rt_rhc_parse, sizeof(struct rt_rhc_internal), RT_RHC_INTERNAL_MAGIC, - rt_parsetab_get, - rt_parsetab_adjust, - rt_parsetab_form, + rt_generic_get, + rt_generic_adjust, + rt_generic_form, NULL, rt_rhc_params }, @@ -943,13 +837,13 @@ rt_epa_export4, rt_epa_ifree, rt_epa_describe, - rt_epa_xform, + rt_generic_xform, rt_epa_parse, sizeof(struct rt_epa_internal), RT_EPA_INTERNAL_MAGIC, - rt_parsetab_get, - rt_parsetab_adjust, - rt_parsetab_form, + rt_generic_get, + rt_generic_adjust, + rt_generic_form, NULL, rt_epa_params }, @@ -978,13 +872,13 @@ rt_ehy_export4, rt_ehy_ifree, rt_ehy_describe, - rt_ehy_xform, + rt_generic_xform, rt_ehy_parse, sizeof(struct rt_ehy_internal), RT_EHY_INTERNAL_MAGIC, - rt_parsetab_get, - rt_parsetab_adjust, - rt_parsetab_form, + rt_generic_get, + rt_generic_adjust, + rt_generic_form, NULL, rt_ehy_params }, @@ -1013,13 +907,13 @@ rt_eto_export4, rt_eto_ifree, rt_eto_describe, - rt_eto_xform, + rt_generic_xform, rt_eto_parse, sizeof(struct rt_eto_internal), RT_ETO_INTERNAL_MAGIC, - rt_parsetab_get, - rt_parsetab_adjust, - rt_parsetab_form, + rt_generic_get, + rt_generic_adjust, + rt_generic_form, NULL, rt_eto_params }, @@ -1048,13 +942,13 @@ rt_grp_export4, rt_grp_ifree, rt_grp_describe, - rt_grp_xform, + rt_generic_xform, rt_grp_parse, sizeof(struct rt_grip_internal), RT_GRIP_INTERNAL_MAGIC, - rt_parsetab_get, - rt_parsetab_adjust, - rt_parsetab_form, + rt_generic_get, + rt_generic_adjust, + rt_generic_form, NULL, rt_grp_params }, @@ -1118,13 +1012,13 @@ rt_hf_export4, rt_hf_ifree, rt_hf_describe, - rt_hf_xform, + rt_generic_xform, rt_hf_parse, sizeof(struct rt_hf_internal), RT_HF_INTERNAL_MAGIC, - rt_parsetab_get, - rt_parsetab_adjust, - rt_parsetab_form, + rt_generic_get, + rt_generic_adjust, + rt_generic_form, NULL, rt_hf_params }, @@ -1153,7 +1047,7 @@ rt_dsp_export4, rt_dsp_ifree, rt_dsp_describe, - rt_dsp_xform, + rt_generic_xform, rt_dsp_parse, sizeof(struct rt_dsp_internal), RT_DSP_INTERNAL_MAGIC, @@ -1188,7 +1082,7 @@ rt_sketch_export4, rt_sketch_ifree, rt_sketch_describe, - rt_sketch_xform, + rt_generic_xform, NULL, sizeof(struct rt_sketch_internal), RT_SKETCH_INTERNAL_MAGIC, @@ -1258,13 +1152,13 @@ rt_submodel_export4, rt_submodel_ifree, rt_submodel_describe, - rt_submodel_xform, + rt_generic_xform, rt_submodel_parse, sizeof(struct rt_submodel_internal), RT_SUBMODEL_INTERNAL_MAGIC, - rt_parsetab_get, - rt_parsetab_adjust, - rt_parsetab_form, + rt_generic_get, + rt_generic_adjust, + rt_generic_form, NULL, rt_submodel_params }, @@ -1293,7 +1187,7 @@ rt_cline_export4, rt_cline_ifree, rt_cline_describe, - rt_cline_xform, + rt_generic_xform, rt_cline_parse, sizeof(struct rt_cline_internal), RT_CLINE_INTERNAL_MAGIC, @@ -1505,13 +1399,13 @@ rt_superell_export4, rt_superell_ifree, rt_superell_describe, - rt_superell_xform, + rt_generic_xform, rt_superell_parse, sizeof(struct rt_superell_internal), RT_SUPERELL_INTERNAL_MAGIC, - rt_parsetab_get, - rt_parsetab_adjust, - rt_parsetab_form, + rt_generic_get, + rt_generic_adjust, + rt_generic_form, NULL, rt_superell_params }, @@ -1540,13 +1434,13 @@ NULL, rt_metaball_ifree, rt_metaball_describe, - rt_metaball_xform, + rt_generic_xform, NULL, sizeof(struct rt_metaball_internal), RT_METABALL_INTERNAL_MAGIC, rt_metaball_get, rt_metaball_adjust, - rt_parsetab_form, + rt_generic_form, NULL, rt_metaball_params }, @@ -1576,13 +1470,13 @@ NULL, rt_brep_ifree, rt_brep_describe, - rt_brep_xform, + rt_generic_xform, NULL, sizeof(struct rt_brep_internal), RT_BREP_INTERNAL_MAGIC, - rt_parsetab_get, - rt_parsetab_adjust, - rt_parsetab_form, + rt_generic_get, + rt_generic_adjust, + rt_generic_form, NULL, rt_brep_params }, @@ -1651,9 +1545,9 @@ rt_hyp_parse, sizeof(struct rt_hyp_internal), RT_HYP_INTERNAL_MAGIC, - rt_parsetab_get, - rt_parsetab_adjust, - rt_parsetab_form, + rt_generic_get, + rt_generic_adjust, + rt_generic_form, NULL, rt_hyp_params }, @@ -1721,9 +1615,9 @@ rt_revolve_parse, sizeof(struct rt_revolve_internal), RT_REVOLVE_INTERNAL_MAGIC, - rt_parsetab_get, - rt_parsetab_adjust, - rt_parsetab_form, + rt_generic_get, + rt_generic_adjust, + rt_generic_form, NULL, NULL }, @@ -1752,7 +1646,7 @@ NULL, rt_pnts_ifree, rt_pnts_describe, - rt_pnts_xform, + rt_generic_xform, NULL, sizeof(struct rt_pnts_internal), RT_PNTS_INTERNAL_MAGIC, @@ -1946,104 +1840,6 @@ } -/** - * R T _ G E N E R I C _ X F O R M - * - * Apply a 4x4 transformation matrix to the internal form of a solid. - * - * If "free" flag is non-zero, storage for the original solid is - * released. If "os" is same as "is", storage for the original solid - * is overwritten with the new, transformed solid. - * - * Returns - - * -1 FAIL - * 0 OK - */ -int -rt_generic_xform( - struct rt_db_internal *op, - const mat_t mat, - struct rt_db_internal *ip, - int release, - struct db_i *dbip, - struct resource *resp) -{ - struct bu_external ext; - int id; - struct bu_attribute_value_set avs; - - - RT_CK_DB_INTERNAL(ip); - RT_CK_DBI(dbip); - RT_CK_RESOURCE(resp); - - id = ip->idb_type; - BU_INIT_EXTERNAL(&ext); - /* Scale change on export is 1.0 -- no change */ - switch (dbip->dbi_version) { - case 4: - if (rt_functab[id].ft_export4(&ext, ip, 1.0, dbip, resp) < 0) { - bu_log("rt_generic_xform(): %s export failure\n", - rt_functab[id].ft_name); - return -1; /* FAIL */ - } - if ((release || op == ip)) rt_db_free_internal(ip); - - RT_INIT_DB_INTERNAL(op); - if (rt_functab[id].ft_import4(op, &ext, mat, dbip, resp) < 0) { - bu_log("rt_generic_xform(): solid import failure\n"); - return -1; /* FAIL */ - } - break; - case 5: - avs.magic = -1; - - if (rt_functab[id].ft_export5(&ext, ip, 1.0, dbip, resp) < 0) { - bu_log("rt_generic_xform(): %s export failure\n", - rt_functab[id].ft_name); - return -1; /* FAIL */ - } - - if ((release || op == ip)) { - if (ip->idb_avs.magic == BU_AVS_MAGIC) { - /* grab the attributes before they are lost - * by rt_db_free_internal or RT_INIT_DB_INTERNAL - */ - bu_avs_init(&avs, ip->idb_avs.count, "avs"); - bu_avs_merge(&avs, &ip->idb_avs); - } - rt_db_free_internal(ip); - } - - RT_INIT_DB_INTERNAL(op); - - if (!release && op != ip) { - /* just copy the attributes from ip to op */ - if (ip->idb_avs.magic == BU_AVS_MAGIC) { - bu_avs_init(&op->idb_avs, ip->idb_avs.count, "avs"); - bu_avs_merge(&op->idb_avs, &ip->idb_avs); - } - } else if (avs.magic == BU_AVS_MAGIC) { - /* put the saved attributes in the output */ - bu_avs_init(&op->idb_avs, avs.count, "avs"); - bu_avs_merge(&op->idb_avs, &avs); - bu_avs_free(&avs); - } - - if (rt_functab[id].ft_import5(op, &ext, mat, dbip, resp) < 0) { - bu_log("rt_generic_xform(): solid import failure\n"); - return -1; /* FAIL */ - } - break; - } - - bu_free_external(&ext); - - RT_CK_DB_INTERNAL(op); - return 0; /* OK */ -} - - /* * Local Variables: * mode: C Modified: brlcad/trunk/src/librt/tcl.c =================================================================== --- brlcad/trunk/src/librt/tcl.c 2010-01-29 12:56:58 UTC (rev 37464) +++ brlcad/trunk/src/librt/tcl.c 2010-01-29 13:00:44 UTC (rev 37465) @@ -1298,73 +1298,6 @@ /** - * R T _ P A R S E T A B _ G E T - * - * This is the generic routine to be listed in rt_functab[].ft_get - * for those solid types which are fully described by their - * ft_parsetab entry. - * - * 'attr' is specified to retrieve only one attribute, rather than - * all. Example: "db get ell.s B" to get only the B vector. - */ -int -rt_parsetab_get(struct bu_vls *logstr, const struct rt_db_internal *intern, const char *attr) -{ - register const struct bu_structparse *sp = NULL; - register const struct rt_functab *ftp; - - RT_CK_DB_INTERNAL(intern); - ftp = intern->idb_meth; - RT_CK_FUNCTAB(ftp); - - sp = ftp->ft_parsetab; - if (!sp) { - bu_vls_printf(logstr, - "%s {a Tcl output routine for this type of object has not yet been implemented}", - ftp->ft_label); - return BRLCAD_ERROR; - } - - if (attr == (char *)0) { - struct bu_vls str; - - bu_vls_init(&str); - - /* Print out solid type and all attributes */ - bu_vls_printf(logstr, "%s", ftp->ft_label); - while (sp->sp_name != NULL) { - bu_vls_printf(logstr, " %s", sp->sp_name); - - bu_vls_trunc(&str, 0); - bu_vls_struct_item(&str, sp, - (char *)intern->idb_ptr, ' '); - - if (sp->sp_count < 2) - bu_vls_printf(logstr, " %V", &str); - else { - bu_vls_printf(logstr, " {"); - bu_vls_printf(logstr, "%V", &str); - bu_vls_printf(logstr, "} "); - } - - ++sp; - } - - bu_vls_free(&str); - } else { - if (bu_vls_struct_item_named(logstr, sp, attr, (char *)intern->idb_ptr, ' ') < 0) { - bu_vls_printf(logstr, - "Objects of type %s do not have a %s attribute.", - ftp->ft_label, attr); - return BRLCAD_ERROR; - } - } - - return BRLCAD_OK; -} - - -/** * R T _ C O M B _ F O R M */ int @@ -1415,71 +1348,6 @@ /** - * R T _ G E N E R I C _ M A K E - * - * This one assumes that making all the parameters null is fine. - */ -void -rt_generic_make(const struct rt_functab *ftp, struct rt_db_internal *intern) -{ - intern->idb_type = ftp - rt_functab; - intern->idb_major_type = DB5_MAJORTYPE_BRLCAD; - BU_ASSERT(&rt_functab[intern->idb_type] == ftp); - - intern->idb_meth = ftp; - intern->idb_ptr = bu_calloc(ftp->ft_internal_size, 1, "rt_generic_make"); - *((long *)(intern->idb_ptr)) = ftp->ft_internal_magic; -} - - -/** - * R T _ P A R S E T A B _ A D J U S T - * - * For those solids entirely defined by their parsetab. Invoked via - * rt_functab[].ft_adjust() - */ -int -rt_parsetab_adjust(struct bu_vls *logstr, struct rt_db_internal *intern, int argc, char **argv) -{ - const struct rt_functab *ftp; - - RT_CK_DB_INTERNAL(intern); - ftp = intern->idb_meth; - RT_CK_FUNCTAB(ftp); - - if (ftp->ft_parsetab == (struct bu_structparse *)NULL) { - bu_vls_printf(logstr, "%s type objects do not yet have a 'db put' (adjust) handler.", ftp->ft_label); - return BRLCAD_ERROR; - } - - return bu_structparse_argv(logstr, argc, argv, ftp->ft_parsetab, (char *)intern->idb_ptr); -} - - -/** - * R T _ P A R S E T A B _ T C L F O R M - * - * Invoked via rt_functab[].ft_tclform() on solid types which are - * fully described by their bu_structparse table in ft_parsetab. - */ -int -rt_parsetab_form(struct bu_vls *logstr, const struct rt_functab *ftp) -{ - RT_CK_FUNCTAB(ftp); - - if (ftp->ft_parsetab) { - bu_structparse_get_terse_form(logstr, ftp->ft_parsetab); - return BRLCAD_OK; - } - bu_vls_printf(logstr, - "%s is a valid object type, but a 'form' routine has not yet been implemented.", - ftp->ft_label); - - return BRLCAD_ERROR; -} - - -/** * R T _ T C L _ S E T U P * * Add all the supported Tcl interfaces to LIBRT routines to the list This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <bo...@us...> - 2010-02-02 17:47:23
|
Revision: 37524 http://brlcad.svn.sourceforge.net/brlcad/?rev=37524&view=rev Author: bob1961 Date: 2010-02-02 17:47:15 +0000 (Tue, 02 Feb 2010) Log Message: ----------- Quell some warnings when compiling 64-bit Windows. Modified Paths: -------------- brlcad/trunk/src/librt/binary_obj.c brlcad/trunk/src/librt/db5_comb.c brlcad/trunk/src/librt/db5_io.c brlcad/trunk/src/librt/db_io.c brlcad/trunk/src/librt/db_path.c brlcad/trunk/src/librt/db_tree.c brlcad/trunk/src/librt/fortray.c brlcad/trunk/src/librt/opennurbs_ext.cpp brlcad/trunk/src/librt/pr.c brlcad/trunk/src/librt/prep.c brlcad/trunk/src/librt/primitives/arb8/arb8.c brlcad/trunk/src/librt/primitives/brep/brep.cpp brlcad/trunk/src/librt/primitives/brep/brep_debug.cpp brlcad/trunk/src/librt/primitives/bspline/bspline.cpp brlcad/trunk/src/librt/primitives/dsp/dsp.c brlcad/trunk/src/librt/primitives/ebm/ebm.c brlcad/trunk/src/librt/primitives/ehy/ehy.c brlcad/trunk/src/librt/primitives/ell/ell.c brlcad/trunk/src/librt/primitives/epa/epa.c brlcad/trunk/src/librt/primitives/eto/eto.c brlcad/trunk/src/librt/primitives/extrude/extrude.c brlcad/trunk/src/librt/primitives/generic.c brlcad/trunk/src/librt/primitives/grip/grip.c brlcad/trunk/src/librt/primitives/half/half.c brlcad/trunk/src/librt/primitives/hf/hf.c brlcad/trunk/src/librt/primitives/hyp/hyp.c brlcad/trunk/src/librt/primitives/nmg/nmg_bool.c brlcad/trunk/src/librt/primitives/nmg/nmg_ck.c brlcad/trunk/src/librt/primitives/part/part.c brlcad/trunk/src/librt/primitives/revolve/revolve.h brlcad/trunk/src/librt/primitives/rhc/rhc.c brlcad/trunk/src/librt/primitives/rpc/rpc.c brlcad/trunk/src/librt/primitives/superell/superell.c brlcad/trunk/src/librt/primitives/tgc/tgc.c brlcad/trunk/src/librt/primitives/tor/tor.c brlcad/trunk/src/librt/primitives/vol/vol.c brlcad/trunk/src/librt/tree.c brlcad/trunk/src/librt/vlist.c Modified: brlcad/trunk/src/librt/binary_obj.c =================================================================== --- brlcad/trunk/src/librt/binary_obj.c 2010-02-02 17:46:13 UTC (rev 37523) +++ brlcad/trunk/src/librt/binary_obj.c 2010-02-02 17:47:15 UTC (rev 37524) @@ -106,7 +106,7 @@ } /* just copy the bytes */ - bip->count = num_items; + bip->count = (long)num_items; bip->u.int8 = (char *)bu_malloc( obj_length, "binary uniform object" ); memcpy(bip->u.int8, bu_fd->buf, obj_length); Modified: brlcad/trunk/src/librt/db5_comb.c =================================================================== --- brlcad/trunk/src/librt/db5_comb.c 2010-02-02 17:46:13 UTC (rev 37523) +++ brlcad/trunk/src/librt/db5_comb.c 2010-02-02 17:47:15 UTC (rev 37524) @@ -92,7 +92,7 @@ tcsp->n_leaf++; if ( tp->tr_l.tl_mat && !bn_mat_is_identity(tp->tr_l.tl_mat) ) tcsp->n_mat++; /* Over-estimate storage requirement for matrix # */ - tcsp->leafbytes += strlen(tp->tr_l.tl_name) + 1 + 8; + tcsp->leafbytes += (long)strlen(tp->tr_l.tl_name) + 1 + 8; return 1; case OP_NOT: @@ -160,7 +160,7 @@ const union tree *tp, struct rt_comb_v5_serialize_state *ssp) { - int n; + size_t n; int mi; RT_CK_TREE(tp); Modified: brlcad/trunk/src/librt/db5_io.c =================================================================== --- brlcad/trunk/src/librt/db5_io.c 2010-02-02 17:46:13 UTC (rev 37523) +++ brlcad/trunk/src/librt/db5_io.c 2010-02-02 17:47:15 UTC (rev 37524) @@ -347,11 +347,11 @@ db5_get_raw_internal_fp(struct db5_raw_internal *rip, FILE *fp) { struct db5_ondisk_header header; - unsigned char lenbuf[8]; + unsigned char lenbuf[8]; int count = 0; int used; - long want, got; - unsigned char *cp; + size_t want, got; + unsigned char *cp; if ( fread( (unsigned char *)&header, sizeof header, 1, fp ) != 1 ) { if ( feof(fp) ) return -1; @@ -476,7 +476,7 @@ need = sizeof(struct db5_ondisk_header); need += 8; /* for object_length */ if ( name ) { - namelen = strlen(name) + 1; /* includes null */ + namelen = (long)strlen(name) + 1; /* includes null */ if ( namelen > 1 ) { n_width = db5_select_length_encoding(namelen); need += namelen + db5_enc_len[n_width]; @@ -811,12 +811,12 @@ avpp = avs->avp; for ( i = 0; i < (size_t)avs->count; i++, avpp++ ) { if (avpp->name) { - need += strlen(avpp->name) + 1; /* include room for NULL */ + need += (int)strlen(avpp->name) + 1; /* include room for NULL */ } else { need += 1; } if (avpp->value) { - need += strlen(avpp->value) + 1; /* include room for NULL */ + need += (int)strlen(avpp->value) + 1; /* include room for NULL */ } else { need += 1; } @@ -839,14 +839,14 @@ int len; if (avpp->name) { - len = strlen(avpp->name); + len = (int)strlen(avpp->name); memcpy(cp, avpp->name, len); cp += len + 1; } *cp = '\0'; /* pad null */ if (avpp->value) { - len = strlen(avpp->value); + len = (int)strlen(avpp->value); memcpy(cp, avpp->value, strlen(avpp->value)); cp += len + 1; } Modified: brlcad/trunk/src/librt/db_io.c =================================================================== --- brlcad/trunk/src/librt/db_io.c 2010-02-02 17:46:13 UTC (rev 37523) +++ brlcad/trunk/src/librt/db_io.c 2010-02-02 17:47:15 UTC (rev 37524) @@ -54,7 +54,7 @@ /* byte count */ /* byte offset from start of file */ { - int got; + long int got; RT_CK_DBI(dbip); if (RT_G_DEBUG&DEBUG_DB) { @@ -79,7 +79,7 @@ if (fseek(dbip->dbi_fp, offset, 0)) bu_bomb("db_read: fseek error\n"); - got = fread(addr, 1, count, dbip->dbi_fp); + got = (long int)fread(addr, 1, count, dbip->dbi_fp); bu_semaphore_release(BU_SEM_SYSCALL); @@ -208,7 +208,7 @@ int db_write(struct db_i *dbip, const genptr_t addr, long int count, long int offset) { - register int got; + register long int got; RT_CK_DBI(dbip); if (RT_G_DEBUG&DEBUG_DB) { @@ -231,7 +231,7 @@ bu_suspend_interrupts(); (void)fseek(dbip->dbi_fp, offset, 0); - got = fwrite(addr, 1, count, dbip->dbi_fp); + got = (long int)fwrite(addr, 1, count, dbip->dbi_fp); fflush(dbip->dbi_fp); bu_restore_interrupts(); Modified: brlcad/trunk/src/librt/db_path.c =================================================================== --- brlcad/trunk/src/librt/db_path.c 2010-02-02 17:46:13 UTC (rev 37523) +++ brlcad/trunk/src/librt/db_path.c 2010-02-02 17:47:15 UTC (rev 37524) @@ -191,7 +191,7 @@ len = 3; /* leading slash, trailing null, spare */ for ( i=pp->fp_len-1; i >= 0; i-- ) { if ( pp->fp_names[i] ) - len += strlen( pp->fp_names[i]->d_namep ) + 1; + len += (int)strlen( pp->fp_names[i]->d_namep ) + 1; else len += 16; } @@ -205,7 +205,7 @@ rem--; if ( pp->fp_names[i] ) { bu_strlcpy( cp, pp->fp_names[i]->d_namep, rem ); - rem -= strlen(pp->fp_names[i]->d_namep); + rem -= (int)strlen(pp->fp_names[i]->d_namep); } else { bu_strlcpy( cp, "**NULL**", rem ); rem -= 8; @@ -275,7 +275,7 @@ char *copy; int nslash = 0; int ret = 0; - int len; + size_t len; RT_CK_DBI(dbip); Modified: brlcad/trunk/src/librt/db_tree.c =================================================================== --- brlcad/trunk/src/librt/db_tree.c 2010-02-02 17:46:13 UTC (rev 37523) +++ brlcad/trunk/src/librt/db_tree.c 2010-02-02 17:47:15 UTC (rev 37524) @@ -49,7 +49,7 @@ void db_dup_db_tree_state(struct db_tree_state *otsp, const struct db_tree_state *itsp) { - int shader_len=0; + size_t shader_len=0; size_t i; RT_CK_DBTS(itsp); Modified: brlcad/trunk/src/librt/fortray.c =================================================================== --- brlcad/trunk/src/librt/fortray.c 2010-02-02 17:46:13 UTC (rev 37523) +++ brlcad/trunk/src/librt/fortray.c 2010-02-02 17:47:15 UTC (rev 37524) @@ -108,7 +108,7 @@ bu_strlcpy( buf, str, len ); /* Remove any trailing blanks */ - for ( i=strlen(buf)-1; i >= 0; i-- ) { + for ( i=(int)strlen(buf)-1; i >= 0; i-- ) { if ( buf[i] != ' ' && buf[i] != '\n' ) break; buf[i] = '\0'; } @@ -352,7 +352,7 @@ } for ( BU_LIST_FOR( rp, region, &((*rtip)->HeadRegion) ) ) { if ( rp->reg_bit != rnum ) continue; - len = strlen( rp->reg_name ); + len = (int)strlen( rp->reg_name ); offset = 0; if ( len >= fbuflen ) { offset = len-(fbuflen+1); Modified: brlcad/trunk/src/librt/opennurbs_ext.cpp =================================================================== --- brlcad/trunk/src/librt/opennurbs_ext.cpp 2010-02-02 17:46:13 UTC (rev 37523) +++ brlcad/trunk/src/librt/opennurbs_ext.cpp 2010-02-02 17:47:15 UTC (rev 37524) @@ -1384,7 +1384,7 @@ // truly - i don't know WTF openNURBS is doing here // when it prints out the knots, they only have multiplicity 3, // but yet the order of the curve is 4!!! - int num_knots = spline.knots.size() - 2; + int num_knots = (int)spline.knots.size() - 2; for (int i = 0; i < num_knots; i++) { double knot = spline.knots[i+1]; TRACE("knot: " << knot); Modified: brlcad/trunk/src/librt/pr.c =================================================================== --- brlcad/trunk/src/librt/pr.c 2010-02-02 17:46:13 UTC (rev 37523) +++ brlcad/trunk/src/librt/pr.c 2010-02-02 17:47:15 UTC (rev 37524) @@ -492,7 +492,7 @@ char *left, *right; char *return_str; char op = OP_GUARD; - int return_length; + size_t return_length; if ( tree == NULL ) return bu_strdup("NULL_ptr"); Modified: brlcad/trunk/src/librt/prep.c =================================================================== --- brlcad/trunk/src/librt/prep.c 2010-02-02 17:46:13 UTC (rev 37523) +++ brlcad/trunk/src/librt/prep.c 2010-02-02 17:47:15 UTC (rev 37524) @@ -883,7 +883,7 @@ } if (BU_LIST_IS_EMPTY(&resp->re_solid_bitv)) { - solidbits = bu_bitv_new(nbits); + solidbits = bu_bitv_new((unsigned int)nbits); } else { for (BU_LIST_FOR(solidbits, bu_bitv, &resp->re_solid_bitv)) { if (solidbits->nbits >= nbits) { @@ -894,7 +894,7 @@ counter++; } if (solidbits == (struct bu_bitv *)&resp->re_solid_bitv) { - solidbits = bu_bitv_new(nbits); + solidbits = bu_bitv_new((unsigned int)nbits); } } @@ -1426,7 +1426,7 @@ int obj_in_path(const char *path, const char *obj) { - int obj_len=strlen(obj); + size_t obj_len=strlen(obj); char *ptr; ptr = strstr(path, obj); Modified: brlcad/trunk/src/librt/primitives/arb8/arb8.c =================================================================== --- brlcad/trunk/src/librt/primitives/arb8/arb8.c 2010-02-02 17:46:13 UTC (rev 37523) +++ brlcad/trunk/src/librt/primitives/arb8/arb8.c 2010-02-02 17:47:15 UTC (rev 37524) @@ -128,14 +128,14 @@ const struct bu_structparse rt_arb_parse[] = { - { "%f", 3, "V1", bu_offsetof(struct rt_arb_internal, pt[0][X]), BU_STRUCTPARSE_FUNC_NULL, NULL, NULL }, - { "%f", 3, "V2", bu_offsetof(struct rt_arb_internal, pt[1][X]), BU_STRUCTPARSE_FUNC_NULL, NULL, NULL }, - { "%f", 3, "V3", bu_offsetof(struct rt_arb_internal, pt[2][X]), BU_STRUCTPARSE_FUNC_NULL, NULL, NULL }, - { "%f", 3, "V4", bu_offsetof(struct rt_arb_internal, pt[3][X]), BU_STRUCTPARSE_FUNC_NULL, NULL, NULL }, - { "%f", 3, "V5", bu_offsetof(struct rt_arb_internal, pt[4][X]), BU_STRUCTPARSE_FUNC_NULL, NULL, NULL }, - { "%f", 3, "V6", bu_offsetof(struct rt_arb_internal, pt[5][X]), BU_STRUCTPARSE_FUNC_NULL, NULL, NULL }, - { "%f", 3, "V7", bu_offsetof(struct rt_arb_internal, pt[6][X]), BU_STRUCTPARSE_FUNC_NULL, NULL, NULL }, - { "%f", 3, "V8", bu_offsetof(struct rt_arb_internal, pt[7][X]), BU_STRUCTPARSE_FUNC_NULL, NULL, NULL }, + { "%f", 3, "V1", (long)bu_offsetof(struct rt_arb_internal, pt[0][X]), BU_STRUCTPARSE_FUNC_NULL, NULL, NULL }, + { "%f", 3, "V2", (long)bu_offsetof(struct rt_arb_internal, pt[1][X]), BU_STRUCTPARSE_FUNC_NULL, NULL, NULL }, + { "%f", 3, "V3", (long)bu_offsetof(struct rt_arb_internal, pt[2][X]), BU_STRUCTPARSE_FUNC_NULL, NULL, NULL }, + { "%f", 3, "V4", (long)bu_offsetof(struct rt_arb_internal, pt[3][X]), BU_STRUCTPARSE_FUNC_NULL, NULL, NULL }, + { "%f", 3, "V5", (long)bu_offsetof(struct rt_arb_internal, pt[4][X]), BU_STRUCTPARSE_FUNC_NULL, NULL, NULL }, + { "%f", 3, "V6", (long)bu_offsetof(struct rt_arb_internal, pt[5][X]), BU_STRUCTPARSE_FUNC_NULL, NULL, NULL }, + { "%f", 3, "V7", (long)bu_offsetof(struct rt_arb_internal, pt[6][X]), BU_STRUCTPARSE_FUNC_NULL, NULL, NULL }, + { "%f", 3, "V8", (long)bu_offsetof(struct rt_arb_internal, pt[7][X]), BU_STRUCTPARSE_FUNC_NULL, NULL, NULL }, { {'\0', '\0', '\0', '\0'}, 0, (char *)NULL, 0, BU_STRUCTPARSE_FUNC_NULL, NULL, NULL } }; Modified: brlcad/trunk/src/librt/primitives/brep/brep.cpp =================================================================== --- brlcad/trunk/src/librt/primitives/brep/brep.cpp 2010-02-02 17:46:13 UTC (rev 37523) +++ brlcad/trunk/src/librt/primitives/brep/brep.cpp 2010-02-02 17:47:15 UTC (rev 37524) @@ -2121,7 +2121,7 @@ } } - return (hit) ? hits.size() : 0; // MISS + return (hit) ? (int)hits.size() : 0; // MISS } @@ -2641,8 +2641,8 @@ RT_MemoryArchive::CreateCopy() const { genptr_t memory = (genptr_t)bu_malloc(m_buffer.size()*sizeof(char), "rt_memoryarchive createcopy"); - const int size = m_buffer.size(); - for (int i = 0; i < size; i++) { + const size_t size = m_buffer.size(); + for (size_t i = 0; i < size; i++) { ((char*)memory)[i] = m_buffer[i]; } return memory; @@ -2652,7 +2652,7 @@ size_t RT_MemoryArchive::Read(size_t amount, void* buf) { - const int read_amount = (pos + amount > m_buffer.size()) ? m_buffer.size()-pos : amount; + const size_t read_amount = (pos + amount > m_buffer.size()) ? m_buffer.size()-pos : amount; const size_t start = pos; for (; pos < (start+read_amount); pos++) { ((char*)buf)[pos-start] = m_buffer[pos]; @@ -2665,7 +2665,7 @@ RT_MemoryArchive::Write(const size_t amount, const void* buf) { // the write can come in at any position! - const int start = pos; + const size_t start = pos; // resize if needed to support new data if (m_buffer.size() < (start+amount)) { m_buffer.resize(start+amount); @@ -2726,7 +2726,7 @@ ON_TextLog err(stderr); bool ok = model.Write(archive, 4, "export5", &err); if (ok) { - ep->ext_nbytes = archive.Size(); + ep->ext_nbytes = (long)archive.Size(); ep->ext_buf = archive.CreateCopy(); return 0; } else { Modified: brlcad/trunk/src/librt/primitives/brep/brep_debug.cpp =================================================================== --- brlcad/trunk/src/librt/primitives/brep/brep_debug.cpp 2010-02-02 17:46:13 UTC (rev 37523) +++ brlcad/trunk/src/librt/primitives/brep/brep_debug.cpp 2010-02-02 17:47:15 UTC (rev 37524) @@ -155,6 +155,8 @@ list<BBNode*> leaves; surf->getLeaves(leaves); + VSETALL(min, 0.0); + ON_TextLog tl(stderr); vhead = rt_vlblock_find(vbp, RED); RT_ADD_VLIST(vhead, min, BN_VLIST_LINE_MOVE); @@ -192,6 +194,8 @@ list<BRNode*> leaves; st->ctree->getLeaves(leaves); + VSETALL(min, 0.0); + ON_TextLog tl(stderr); vhead = rt_vlblock_find(vbp, RED); RT_ADD_VLIST(vhead, min, BN_VLIST_LINE_MOVE); Modified: brlcad/trunk/src/librt/primitives/bspline/bspline.cpp =================================================================== --- brlcad/trunk/src/librt/primitives/bspline/bspline.cpp 2010-02-02 17:46:13 UTC (rev 37523) +++ brlcad/trunk/src/librt/primitives/bspline/bspline.cpp 2010-02-02 17:47:15 UTC (rev 37524) @@ -944,9 +944,9 @@ grans = rt_nurb_grans(srf); rec[rec_ptr].d.d_id = ID_BSURF; - rec[rec_ptr].d.d_nknots = (((srf->u.k_size + srf->v.k_size) + rec[rec_ptr].d.d_nknots = (short)(((srf->u.k_size + srf->v.k_size) * sizeof(dbfloat_t)) + sizeof(union record)-1)/ sizeof(union record); - rec[rec_ptr].d.d_nctls = (( + rec[rec_ptr].d.d_nctls = (short)(( RT_NURB_EXTRACT_COORDS(srf->pt_type) * (srf->s_size[0] * srf->s_size[1]) * sizeof(dbfloat_t)) + sizeof(union record)-1) Modified: brlcad/trunk/src/librt/primitives/dsp/dsp.c =================================================================== --- brlcad/trunk/src/librt/primitives/dsp/dsp.c 2010-02-02 17:46:13 UTC (rev 37523) +++ brlcad/trunk/src/librt/primitives/dsp/dsp.c 2010-02-02 17:47:15 UTC (rev 37524) @@ -271,7 +271,7 @@ {"%i", 1, "sm", DSP_O(dsp_smooth), BU_STRUCTPARSE_FUNC_NULL, NULL, NULL }, {"%d", 1, "w", DSP_O(dsp_xcnt), BU_STRUCTPARSE_FUNC_NULL, NULL, NULL }, {"%d", 1, "n", DSP_O(dsp_ycnt), BU_STRUCTPARSE_FUNC_NULL, NULL, NULL }, - {"%f", 16, "stom", DSP_AO(dsp_stom), hook_mtos_from_stom, NULL, NULL }, + {"%f", 16, "stom", (long)DSP_AO(dsp_stom), hook_mtos_from_stom, NULL, NULL }, {"", 0, (char *)0, 0, BU_STRUCTPARSE_FUNC_NULL, NULL, NULL } }; @@ -282,7 +282,7 @@ {"%i", 1, "sm", DSP_O(dsp_smooth), BU_STRUCTPARSE_FUNC_NULL, NULL, NULL }, {"%d", 1, "w", DSP_O(dsp_xcnt), BU_STRUCTPARSE_FUNC_NULL, NULL, NULL }, {"%d", 1, "n", DSP_O(dsp_ycnt), BU_STRUCTPARSE_FUNC_NULL, NULL, NULL }, - {"%f", 16, "stom", DSP_AO(dsp_stom), BU_STRUCTPARSE_FUNC_NULL, NULL, NULL }, + {"%f", 16, "stom", (long)DSP_AO(dsp_stom), BU_STRUCTPARSE_FUNC_NULL, NULL, NULL }, {"", 0, (char *)0, 0, BU_STRUCTPARSE_FUNC_NULL, NULL, NULL } }; @@ -4638,7 +4638,7 @@ {"%d", 1, "n", DSP_O(dsp_ycnt), hook_verify, NULL, NULL }, {"%i", 1, "sm", DSP_O(dsp_smooth), BU_STRUCTPARSE_FUNC_NULL, NULL, NULL }, {"%c", 1, "cut", DSP_O(dsp_cuttype), hook_verify, NULL, NULL }, - {"%f", 16, "stom", DSP_AO(dsp_stom), hook_verify, NULL, NULL }, + {"%f", 16, "stom", (long)DSP_AO(dsp_stom), hook_verify, NULL, NULL }, {"", 0, (char *)0, 0, BU_STRUCTPARSE_FUNC_NULL, NULL, NULL } }; Modified: brlcad/trunk/src/librt/primitives/ebm/ebm.c =================================================================== --- brlcad/trunk/src/librt/primitives/ebm/ebm.c 2010-02-02 17:46:13 UTC (rev 37523) +++ brlcad/trunk/src/librt/primitives/ebm/ebm.c 2010-02-02 17:47:15 UTC (rev 37524) @@ -63,11 +63,11 @@ #define RT_EBM_O(m) bu_offsetof(struct rt_ebm_internal, m) const struct bu_structparse rt_ebm_parse[] = { - {"%s", RT_EBM_NAME_LEN, "file", bu_offsetofarray(struct rt_ebm_internal, file), BU_STRUCTPARSE_FUNC_NULL, NULL, NULL }, + {"%s", RT_EBM_NAME_LEN, "file", (long)bu_offsetofarray(struct rt_ebm_internal, file), BU_STRUCTPARSE_FUNC_NULL, NULL, NULL }, {"%d", 1, "w", RT_EBM_O(xdim), BU_STRUCTPARSE_FUNC_NULL, NULL, NULL }, {"%d", 1, "n", RT_EBM_O(ydim), BU_STRUCTPARSE_FUNC_NULL, NULL, NULL }, {"%f", 1, "d", RT_EBM_O(tallness), BU_STRUCTPARSE_FUNC_NULL, NULL, NULL }, - {"%f", 16, "mat", bu_offsetofarray(struct rt_ebm_internal, mat), BU_STRUCTPARSE_FUNC_NULL, NULL, NULL }, + {"%f", 16, "mat", (long)bu_offsetofarray(struct rt_ebm_internal, mat), BU_STRUCTPARSE_FUNC_NULL, NULL, NULL }, {"", 0, (char *)0, 0, BU_STRUCTPARSE_FUNC_NULL, NULL, NULL } }; Modified: brlcad/trunk/src/librt/primitives/ehy/ehy.c =================================================================== --- brlcad/trunk/src/librt/primitives/ehy/ehy.c 2010-02-02 17:46:13 UTC (rev 37523) +++ brlcad/trunk/src/librt/primitives/ehy/ehy.c 2010-02-02 17:47:15 UTC (rev 37524) @@ -174,9 +174,9 @@ const struct bu_structparse rt_ehy_parse[] = { - { "%f", 3, "V", bu_offsetof(struct rt_ehy_internal, ehy_V[X]), BU_STRUCTPARSE_FUNC_NULL, NULL, NULL }, - { "%f", 3, "H", bu_offsetof(struct rt_ehy_internal, ehy_H[X]), BU_STRUCTPARSE_FUNC_NULL, NULL, NULL }, - { "%f", 3, "A", bu_offsetof(struct rt_ehy_internal, ehy_Au[X]), BU_STRUCTPARSE_FUNC_NULL, NULL, NULL }, + { "%f", 3, "V", (long)bu_offsetof(struct rt_ehy_internal, ehy_V[X]), BU_STRUCTPARSE_FUNC_NULL, NULL, NULL }, + { "%f", 3, "H", (long)bu_offsetof(struct rt_ehy_internal, ehy_H[X]), BU_STRUCTPARSE_FUNC_NULL, NULL, NULL }, + { "%f", 3, "A", (long)bu_offsetof(struct rt_ehy_internal, ehy_Au[X]), BU_STRUCTPARSE_FUNC_NULL, NULL, NULL }, { "%f", 1, "r_1", bu_offsetof(struct rt_ehy_internal, ehy_r1), BU_STRUCTPARSE_FUNC_NULL, NULL, NULL }, { "%f", 1, "r_2", bu_offsetof(struct rt_ehy_internal, ehy_r2), BU_STRUCTPARSE_FUNC_NULL, NULL, NULL }, { "%f", 1, "c", bu_offsetof(struct rt_ehy_internal, ehy_c), BU_STRUCTPARSE_FUNC_NULL, NULL, NULL }, Modified: brlcad/trunk/src/librt/primitives/ell/ell.c =================================================================== --- brlcad/trunk/src/librt/primitives/ell/ell.c 2010-02-02 17:46:13 UTC (rev 37523) +++ brlcad/trunk/src/librt/primitives/ell/ell.c 2010-02-02 17:47:15 UTC (rev 37524) @@ -45,10 +45,10 @@ struct rt_i *rtip)); const struct bu_structparse rt_ell_parse[] = { - { "%f", 3, "V", bu_offsetof(struct rt_ell_internal, v[X]), BU_STRUCTPARSE_FUNC_NULL, NULL, NULL }, - { "%f", 3, "A", bu_offsetof(struct rt_ell_internal, a[X]), BU_STRUCTPARSE_FUNC_NULL, NULL, NULL }, - { "%f", 3, "B", bu_offsetof(struct rt_ell_internal, b[X]), BU_STRUCTPARSE_FUNC_NULL, NULL, NULL }, - { "%f", 3, "C", bu_offsetof(struct rt_ell_internal, c[X]), BU_STRUCTPARSE_FUNC_NULL, NULL, NULL }, + { "%f", 3, "V", (long)bu_offsetof(struct rt_ell_internal, v[X]), BU_STRUCTPARSE_FUNC_NULL, NULL, NULL }, + { "%f", 3, "A", (long)bu_offsetof(struct rt_ell_internal, a[X]), BU_STRUCTPARSE_FUNC_NULL, NULL, NULL }, + { "%f", 3, "B", (long)bu_offsetof(struct rt_ell_internal, b[X]), BU_STRUCTPARSE_FUNC_NULL, NULL, NULL }, + { "%f", 3, "C", (long)bu_offsetof(struct rt_ell_internal, c[X]), BU_STRUCTPARSE_FUNC_NULL, NULL, NULL }, { {'\0', '\0', '\0', '\0'}, 0, (char *)NULL, 0, BU_STRUCTPARSE_FUNC_NULL, NULL, NULL } }; Modified: brlcad/trunk/src/librt/primitives/epa/epa.c =================================================================== --- brlcad/trunk/src/librt/primitives/epa/epa.c 2010-02-02 17:46:13 UTC (rev 37523) +++ brlcad/trunk/src/librt/primitives/epa/epa.c 2010-02-02 17:47:15 UTC (rev 37524) @@ -173,9 +173,9 @@ const struct bu_structparse rt_epa_parse[] = { - { "%f", 3, "V", bu_offsetof(struct rt_epa_internal, epa_V[X]), BU_STRUCTPARSE_FUNC_NULL, NULL, NULL }, - { "%f", 3, "H", bu_offsetof(struct rt_epa_internal, epa_H[X]), BU_STRUCTPARSE_FUNC_NULL, NULL, NULL }, - { "%f", 3, "A", bu_offsetof(struct rt_epa_internal, epa_Au[X]), BU_STRUCTPARSE_FUNC_NULL, NULL, NULL }, + { "%f", 3, "V", (long)bu_offsetof(struct rt_epa_internal, epa_V[X]), BU_STRUCTPARSE_FUNC_NULL, NULL, NULL }, + { "%f", 3, "H", (long)bu_offsetof(struct rt_epa_internal, epa_H[X]), BU_STRUCTPARSE_FUNC_NULL, NULL, NULL }, + { "%f", 3, "A", (long)bu_offsetof(struct rt_epa_internal, epa_Au[X]), BU_STRUCTPARSE_FUNC_NULL, NULL, NULL }, { "%f", 1, "r_1", bu_offsetof(struct rt_epa_internal, epa_r1), BU_STRUCTPARSE_FUNC_NULL, NULL, NULL }, { "%f", 1, "r_2", bu_offsetof(struct rt_epa_internal, epa_r2), BU_STRUCTPARSE_FUNC_NULL, NULL, NULL }, { {'\0', '\0', '\0', '\0'}, 0, (char *)NULL, 0, BU_STRUCTPARSE_FUNC_NULL, NULL, NULL } Modified: brlcad/trunk/src/librt/primitives/eto/eto.c =================================================================== --- brlcad/trunk/src/librt/primitives/eto/eto.c 2010-02-02 17:46:13 UTC (rev 37523) +++ brlcad/trunk/src/librt/primitives/eto/eto.c 2010-02-02 17:47:15 UTC (rev 37524) @@ -139,9 +139,9 @@ const struct bu_structparse rt_eto_parse[] = { - { "%f", 3, "V", bu_offsetof(struct rt_eto_internal, eto_V[X]), BU_STRUCTPARSE_FUNC_NULL, NULL, NULL }, - { "%f", 3, "N", bu_offsetof(struct rt_eto_internal, eto_N[X]), BU_STRUCTPARSE_FUNC_NULL, NULL, NULL }, - { "%f", 3, "C", bu_offsetof(struct rt_eto_internal, eto_C[X]), BU_STRUCTPARSE_FUNC_NULL, NULL, NULL }, + { "%f", 3, "V", (long)bu_offsetof(struct rt_eto_internal, eto_V[X]), BU_STRUCTPARSE_FUNC_NULL, NULL, NULL }, + { "%f", 3, "N", (long)bu_offsetof(struct rt_eto_internal, eto_N[X]), BU_STRUCTPARSE_FUNC_NULL, NULL, NULL }, + { "%f", 3, "C", (long)bu_offsetof(struct rt_eto_internal, eto_C[X]), BU_STRUCTPARSE_FUNC_NULL, NULL, NULL }, { "%f", 1, "r", bu_offsetof(struct rt_eto_internal, eto_r), BU_STRUCTPARSE_FUNC_NULL, NULL, NULL }, { "%f", 1, "r_d", bu_offsetof(struct rt_eto_internal, eto_rd), BU_STRUCTPARSE_FUNC_NULL, NULL, NULL }, { {'\0', '\0', '\0', '\0'}, 0, (char *)NULL, 0, BU_STRUCTPARSE_FUNC_NULL, NULL, NULL } Modified: brlcad/trunk/src/librt/primitives/extrude/extrude.c =================================================================== --- brlcad/trunk/src/librt/primitives/extrude/extrude.c 2010-02-02 17:46:13 UTC (rev 37523) +++ brlcad/trunk/src/librt/primitives/extrude/extrude.c 2010-02-02 17:47:15 UTC (rev 37524) @@ -2179,7 +2179,7 @@ RT_EXTRUDE_CK_MAGIC(extrude_ip); BU_CK_EXTERNAL(ep); - ep->ext_nbytes = 4 * ELEMENTS_PER_VECT * SIZEOF_NETWORK_DOUBLE + SIZEOF_NETWORK_LONG + strlen(extrude_ip->sketch_name) + 1; + ep->ext_nbytes = (long)(4 * ELEMENTS_PER_VECT * SIZEOF_NETWORK_DOUBLE + SIZEOF_NETWORK_LONG + strlen(extrude_ip->sketch_name) + 1); ep->ext_buf = (genptr_t)bu_calloc(1, ep->ext_nbytes, "extrusion external"); ptr = (unsigned char *)ep->ext_buf; Modified: brlcad/trunk/src/librt/primitives/generic.c =================================================================== --- brlcad/trunk/src/librt/primitives/generic.c 2010-02-02 17:46:13 UTC (rev 37523) +++ brlcad/trunk/src/librt/primitives/generic.c 2010-02-02 17:47:15 UTC (rev 37524) @@ -211,7 +211,7 @@ BU_ASSERT(&rt_functab[intern->idb_type] == ftp); intern->idb_meth = ftp; - intern->idb_ptr = bu_calloc(ftp->ft_internal_size, 1, "rt_generic_make"); + intern->idb_ptr = bu_calloc((unsigned int)ftp->ft_internal_size, 1, "rt_generic_make"); *((long *)(intern->idb_ptr)) = ftp->ft_internal_magic; } Modified: brlcad/trunk/src/librt/primitives/grip/grip.c =================================================================== --- brlcad/trunk/src/librt/primitives/grip/grip.c 2010-02-02 17:46:13 UTC (rev 37523) +++ brlcad/trunk/src/librt/primitives/grip/grip.c 2010-02-02 17:47:15 UTC (rev 37524) @@ -56,8 +56,8 @@ #define GRIP_NULL ((struct grip_specific *)0) const struct bu_structparse rt_grp_parse[] = { - { "%f", 3, "V", bu_offsetof(struct rt_grip_internal, center[X]), BU_STRUCTPARSE_FUNC_NULL, NULL, NULL }, - { "%f", 3, "N", bu_offsetof(struct rt_grip_internal, normal[X]), BU_STRUCTPARSE_FUNC_NULL, NULL, NULL }, + { "%f", 3, "V", (long)bu_offsetof(struct rt_grip_internal, center[X]), BU_STRUCTPARSE_FUNC_NULL, NULL, NULL }, + { "%f", 3, "N", (long)bu_offsetof(struct rt_grip_internal, normal[X]), BU_STRUCTPARSE_FUNC_NULL, NULL, NULL }, { "%f", 1, "L", bu_offsetof(struct rt_grip_internal, mag), BU_STRUCTPARSE_FUNC_NULL, NULL, NULL }, { {'\0', '\0', '\0', '\0'}, 0, (char *)NULL, 0, BU_STRUCTPARSE_FUNC_NULL, NULL, NULL } }; Modified: brlcad/trunk/src/librt/primitives/half/half.c =================================================================== --- brlcad/trunk/src/librt/primitives/half/half.c 2010-02-02 17:46:13 UTC (rev 37523) +++ brlcad/trunk/src/librt/primitives/half/half.c 2010-02-02 17:47:15 UTC (rev 37524) @@ -59,8 +59,8 @@ #define HALF_NULL ((struct half_specific *)0) const struct bu_structparse rt_hlf_parse[] = { - { "%f", 3, "N", bu_offsetof(struct rt_half_internal, eqn[X]), BU_STRUCTPARSE_FUNC_NULL, NULL, NULL }, - { "%f", 1, "d", bu_offsetof(struct rt_half_internal, eqn[W]), BU_STRUCTPARSE_FUNC_NULL, NULL, NULL }, + { "%f", 3, "N", (long)bu_offsetof(struct rt_half_internal, eqn[X]), BU_STRUCTPARSE_FUNC_NULL, NULL, NULL }, + { "%f", 1, "d", (long)bu_offsetof(struct rt_half_internal, eqn[W]), BU_STRUCTPARSE_FUNC_NULL, NULL, NULL }, { {'\0', '\0', '\0', '\0'}, 0, (char *)NULL, 0, BU_STRUCTPARSE_FUNC_NULL, NULL, NULL } }; Modified: brlcad/trunk/src/librt/primitives/hf/hf.c =================================================================== --- brlcad/trunk/src/librt/primitives/hf/hf.c 2010-02-02 17:46:13 UTC (rev 37523) +++ brlcad/trunk/src/librt/primitives/hf/hf.c 2010-02-02 17:47:15 UTC (rev 37524) @@ -64,16 +64,16 @@ /* All fields valid in string solid */ const struct bu_structparse rt_hf_parse[] = { - {"%s", 128, "cfile", bu_offsetofarray(struct rt_hf_internal, cfile), BU_STRUCTPARSE_FUNC_NULL, NULL, NULL}, - {"%s", 128, "dfile", bu_offsetofarray(struct rt_hf_internal, dfile), BU_STRUCTPARSE_FUNC_NULL, NULL, NULL}, - {"%s", 8, "fmt", bu_offsetofarray(struct rt_hf_internal, fmt), BU_STRUCTPARSE_FUNC_NULL, NULL, NULL}, + {"%s", 128, "cfile", (long)bu_offsetofarray(struct rt_hf_internal, cfile), BU_STRUCTPARSE_FUNC_NULL, NULL, NULL}, + {"%s", 128, "dfile", (long)bu_offsetofarray(struct rt_hf_internal, dfile), BU_STRUCTPARSE_FUNC_NULL, NULL, NULL}, + {"%s", 8, "fmt", (long)bu_offsetofarray(struct rt_hf_internal, fmt), BU_STRUCTPARSE_FUNC_NULL, NULL, NULL}, {"%d", 1, "w", HF_O(w), BU_STRUCTPARSE_FUNC_NULL, NULL, NULL }, {"%d", 1, "n", HF_O(n), BU_STRUCTPARSE_FUNC_NULL, NULL, NULL }, {"%d", 1, "shorts", HF_O(shorts), BU_STRUCTPARSE_FUNC_NULL, NULL, NULL }, {"%f", 1, "file2mm", HF_O(file2mm), BU_STRUCTPARSE_FUNC_NULL, NULL, NULL }, - {"%f", 3, "v", HF_O(v[0]), BU_STRUCTPARSE_FUNC_NULL, NULL, NULL }, - {"%f", 3, "x", HF_O(x[0]), BU_STRUCTPARSE_FUNC_NULL, NULL, NULL }, - {"%f", 3, "y", HF_O(y[0]), BU_STRUCTPARSE_FUNC_NULL, NULL, NULL }, + {"%f", 3, "v", (long)HF_O(v[0]), BU_STRUCTPARSE_FUNC_NULL, NULL, NULL }, + {"%f", 3, "x", (long)HF_O(x[0]), BU_STRUCTPARSE_FUNC_NULL, NULL, NULL }, + {"%f", 3, "y", (long)HF_O(y[0]), BU_STRUCTPARSE_FUNC_NULL, NULL, NULL }, {"%f", 1, "xlen", HF_O(xlen), BU_STRUCTPARSE_FUNC_NULL, NULL, NULL }, {"%f", 1, "ylen", HF_O(ylen), BU_STRUCTPARSE_FUNC_NULL, NULL, NULL }, {"%f", 1, "zscale", HF_O(zscale), BU_STRUCTPARSE_FUNC_NULL, NULL, NULL }, @@ -81,8 +81,8 @@ }; /* Subset of fields found in cfile */ const struct bu_structparse rt_hf_cparse[] = { - {"%s", 128, "dfile", bu_offsetofarray(struct rt_hf_internal, dfile), BU_STRUCTPARSE_FUNC_NULL, NULL, NULL}, - {"%s", 8, "fmt", bu_offsetofarray(struct rt_hf_internal, fmt), BU_STRUCTPARSE_FUNC_NULL, NULL, NULL}, + {"%s", 128, "dfile", (long)bu_offsetofarray(struct rt_hf_internal, dfile), BU_STRUCTPARSE_FUNC_NULL, NULL, NULL}, + {"%s", 8, "fmt", (long)bu_offsetofarray(struct rt_hf_internal, fmt), BU_STRUCTPARSE_FUNC_NULL, NULL, NULL}, {"%d", 1, "w", HF_O(w), BU_STRUCTPARSE_FUNC_NULL, NULL, NULL }, {"%d", 1, "n", HF_O(n), BU_STRUCTPARSE_FUNC_NULL, NULL, NULL }, {"%d", 1, "shorts", HF_O(shorts), BU_STRUCTPARSE_FUNC_NULL, NULL, NULL }, Modified: brlcad/trunk/src/librt/primitives/hyp/hyp.c =================================================================== --- brlcad/trunk/src/librt/primitives/hyp/hyp.c 2010-02-02 17:46:13 UTC (rev 37523) +++ brlcad/trunk/src/librt/primitives/hyp/hyp.c 2010-02-02 17:47:15 UTC (rev 37524) @@ -103,9 +103,9 @@ const struct bu_structparse rt_hyp_parse[] = { - { "%f", 3, "V", bu_offsetof(struct rt_hyp_internal, hyp_Vi[X]), BU_STRUCTPARSE_FUNC_NULL, NULL, NULL }, - { "%f", 3, "H", bu_offsetof(struct rt_hyp_internal, hyp_Hi[X]), BU_STRUCTPARSE_FUNC_NULL, NULL, NULL }, - { "%f", 3, "A", bu_offsetof(struct rt_hyp_internal, hyp_A[X]), BU_STRUCTPARSE_FUNC_NULL, NULL, NULL }, + { "%f", 3, "V", (long)bu_offsetof(struct rt_hyp_internal, hyp_Vi[X]), BU_STRUCTPARSE_FUNC_NULL, NULL, NULL }, + { "%f", 3, "H", (long)bu_offsetof(struct rt_hyp_internal, hyp_Hi[X]), BU_STRUCTPARSE_FUNC_NULL, NULL, NULL }, + { "%f", 3, "A", (long)bu_offsetof(struct rt_hyp_internal, hyp_A[X]), BU_STRUCTPARSE_FUNC_NULL, NULL, NULL }, { "%f", 1, "b", bu_offsetof(struct rt_hyp_internal, hyp_b), BU_STRUCTPARSE_FUNC_NULL, NULL, NULL }, { "%f", 1, "bnr", bu_offsetof(struct rt_hyp_internal, hyp_bnr), BU_STRUCTPARSE_FUNC_NULL, NULL, NULL }, { {'\0', '\0', '\0', '\0'}, 0, (char *)NULL, 0, BU_STRUCTPARSE_FUNC_NULL, NULL, NULL } Modified: brlcad/trunk/src/librt/primitives/nmg/nmg_bool.c =================================================================== --- brlcad/trunk/src/librt/primitives/nmg/nmg_bool.c 2010-02-02 17:46:13 UTC (rev 37523) +++ brlcad/trunk/src/librt/primitives/nmg/nmg_bool.c 2010-02-02 17:47:15 UTC (rev 37524) @@ -1139,7 +1139,7 @@ int op; const char *op_str; char *name; - int rem; + size_t rem; RT_CK_TREE(tp); BN_CK_TOL(tol); Modified: brlcad/trunk/src/librt/primitives/nmg/nmg_ck.c =================================================================== --- brlcad/trunk/src/librt/primitives/nmg/nmg_ck.c 2010-02-02 17:46:13 UTC (rev 37523) +++ brlcad/trunk/src/librt/primitives/nmg/nmg_ck.c 2010-02-02 17:47:15 UTC (rev 37524) @@ -683,7 +683,7 @@ { char *errstr; struct edgeuse *eparent; - int len = strlen(str)+128; + int len = (int)strlen(str)+128; errstr = bu_calloc(len, 1, "nmg_ck_e error str"); snprintf(errstr, len, "%sedge %8lx\n", str, (unsigned long)e); @@ -717,7 +717,7 @@ nmg_ck_vu(const unsigned long *parent, const struct vertexuse *vu, const char *str) { char *errstr; - int len = strlen(str)+128; + int len = (int)strlen(str)+128; errstr = bu_calloc(len, 1, "nmg_ck_vu error str"); snprintf(errstr, len, "%svertexuse %8lx\n", str, (unsigned long)vu); @@ -739,7 +739,7 @@ { char *errstr; struct edgeuse *eur, *eu_next, *eu_last; - int len = strlen(str)+128; + int len = (int)strlen(str)+128; errstr = bu_calloc(len, 1, "nmg_ck_eu error str"); snprintf(errstr, len, "%sedgeuse %8lx\n", str, (unsigned long)eu); @@ -819,7 +819,7 @@ nmg_ck_lg(const struct loop *l, const struct loop_g *lg, const char *str) { char *errstr; - int len = strlen(str)+128; + int len = (int)strlen(str)+128; errstr = bu_calloc(len, 1, "nmg_ck_lg error str"); snprintf(errstr, len, "%sloop_g %8lx\n", str, (unsigned long)lg); @@ -838,7 +838,7 @@ nmg_ck_l(const struct loopuse *lu, const struct loop *l, const char *str) { char *errstr; - int len = strlen(str)+128; + int len = (int)strlen(str)+128; errstr = bu_calloc(len, 1, "nmg_ck_l error str"); snprintf(errstr, len, "%sloop %8lx\n", str, (unsigned long)l); @@ -869,7 +869,7 @@ int l; int edgeuse_num=0; unsigned long magic1; - int len = strlen(str)+128; + int len = (int)strlen(str)+128; errstr = bu_calloc(len, 1, "nmg_ck_lu error str"); snprintf(errstr, len, "%sloopuse %8lx\n", str, (unsigned long)lu); @@ -913,7 +913,7 @@ NMG_CK_VERTEXUSE(vu); nmg_ck_vu(&lu->l.magic, vu, errstr); } else if (magic1 == NMG_EDGEUSE_MAGIC) { - l = strlen(errstr); + l = (int)strlen(errstr); for (BU_LIST_FOR(eu, edgeuse, &lu->down_hd)) { NMG_CK_EDGEUSE(eu); snprintf(&errstr[l], len-l, "%sedgeuse #%d (%8lx)\n", @@ -935,7 +935,7 @@ nmg_ck_fg(const struct face *f, const struct face_g_plane *fg, const char *str) { char *errstr; - int len = strlen(str)+128; + int len = (int)strlen(str)+128; errstr = bu_calloc(len, 1, "nmg_ck_fg error str"); snprintf(errstr, len, "%sFace_g %8lx\n", str, (unsigned long)f); @@ -959,7 +959,7 @@ nmg_ck_f(const struct faceuse *fu, const struct face *f, const char *str) { char *errstr; - int len = strlen(str)+128; + int len = (int)strlen(str)+128; errstr = bu_calloc(len, 1, "nmg_ck_f error str"); snprintf(errstr, len, "%sFace %8lx\n", str, (unsigned long)f); @@ -988,7 +988,7 @@ int l; int loop_number = 0; struct loopuse *lu; - int len = strlen(str)+128; + int len = (int)strlen(str)+128; NMG_CK_FACEUSE(fu); NMG_CK_SHELL(s); @@ -1024,7 +1024,7 @@ nmg_ck_f(fu, fu->f_p, errstr); - l = strlen(errstr); + l = (int)strlen(errstr); for (BU_LIST_FOR(lu, loopuse, &fu->lu_hd)) { NMG_CK_LOOPUSE(lu); snprintf(&errstr[l], len-l, "%sloopuse #%d (%8lx)\n", Modified: brlcad/trunk/src/librt/primitives/part/part.c =================================================================== --- brlcad/trunk/src/librt/primitives/part/part.c 2010-02-02 17:46:13 UTC (rev 37523) +++ brlcad/trunk/src/librt/primitives/part/part.c 2010-02-02 17:47:15 UTC (rev 37524) @@ -212,8 +212,8 @@ #define RT_PARTICLE_SURF_HSPHERE 3 const struct bu_structparse rt_part_parse[] = { - { "%f", 3, "V", bu_offsetof(struct rt_part_internal, part_V[X]), BU_STRUCTPARSE_FUNC_NULL, NULL, NULL }, - { "%f", 3, "H", bu_offsetof(struct rt_part_internal, part_H[X]), BU_STRUCTPARSE_FUNC_NULL, NULL, NULL }, + { "%f", 3, "V", (long)bu_offsetof(struct rt_part_internal, part_V[X]), BU_STRUCTPARSE_FUNC_NULL, NULL, NULL }, + { "%f", 3, "H", (long)bu_offsetof(struct rt_part_internal, part_H[X]), BU_STRUCTPARSE_FUNC_NULL, NULL, NULL }, { "%f", 1, "r_v", bu_offsetof(struct rt_part_internal, part_vrad), BU_STRUCTPARSE_FUNC_NULL, NULL, NULL }, { "%f", 1, "r_h", bu_offsetof(struct rt_part_internal, part_hrad), BU_STRUCTPARSE_FUNC_NULL, NULL, NULL }, { {'\0', '\0', '\0', '\0'}, 0, (char *)NULL, 0, BU_STRUCTPARSE_FUNC_NULL, NULL, NULL } Modified: brlcad/trunk/src/librt/primitives/revolve/revolve.h =================================================================== --- brlcad/trunk/src/librt/primitives/revolve/revolve.h 2010-02-02 17:46:13 UTC (rev 37523) +++ brlcad/trunk/src/librt/primitives/revolve/revolve.h 2010-02-02 17:47:15 UTC (rev 37524) @@ -25,9 +25,9 @@ const struct bu_structparse rt_revolve_parse[] = { - { "%f", 3, "V", bu_offsetof(struct rt_revolve_internal, v3d[X]), BU_STRUCTPARSE_FUNC_NULL, NULL, NULL }, - { "%f", 3, "axis", bu_offsetof(struct rt_revolve_internal, axis3d[X]), BU_STRUCTPARSE_FUNC_NULL, NULL, NULL }, - { "%f", 3, "R", bu_offsetof(struct rt_revolve_internal, r[X]), BU_STRUCTPARSE_FUNC_NULL, NULL, NULL }, + { "%f", 3, "V", (long)bu_offsetof(struct rt_revolve_internal, v3d[X]), BU_STRUCTPARSE_FUNC_NULL, NULL, NULL }, + { "%f", 3, "axis", (long)bu_offsetof(struct rt_revolve_internal, axis3d[X]), BU_STRUCTPARSE_FUNC_NULL, NULL, NULL }, + { "%f", 3, "R", (long)bu_offsetof(struct rt_revolve_internal, r[X]), BU_STRUCTPARSE_FUNC_NULL, NULL, NULL }, { "%f", 1, "ang", bu_offsetof(struct rt_revolve_internal, ang), BU_STRUCTPARSE_FUNC_NULL, NULL, NULL }, { "%V", 1, "sk_name", bu_offsetof(struct rt_revolve_internal, sketch_name), BU_STRUCTPARSE_FUNC_NULL, NULL, NULL }, { {'\0', '\0', '\0', '\0'}, 0, (char *)NULL, 0, BU_STRUCTPARSE_FUNC_NULL, NULL, NULL } Modified: brlcad/trunk/src/librt/primitives/rhc/rhc.c =================================================================== --- brlcad/trunk/src/librt/primitives/rhc/rhc.c 2010-02-02 17:46:13 UTC (rev 37523) +++ brlcad/trunk/src/librt/primitives/rhc/rhc.c 2010-02-02 17:47:15 UTC (rev 37524) @@ -189,9 +189,9 @@ const struct bu_structparse rt_rhc_parse[] = { - { "%f", 3, "V", bu_offsetof(struct rt_rhc_internal, rhc_V[X]), BU_STRUCTPARSE_FUNC_NULL, NULL, NULL }, - { "%f", 3, "H", bu_offsetof(struct rt_rhc_internal, rhc_H[X]), BU_STRUCTPARSE_FUNC_NULL, NULL, NULL }, - { "%f", 3, "B", bu_offsetof(struct rt_rhc_internal, rhc_B[X]), BU_STRUCTPARSE_FUNC_NULL, NULL, NULL }, + { "%f", 3, "V", (long)bu_offsetof(struct rt_rhc_internal, rhc_V[X]), BU_STRUCTPARSE_FUNC_NULL, NULL, NULL }, + { "%f", 3, "H", (long)bu_offsetof(struct rt_rhc_internal, rhc_H[X]), BU_STRUCTPARSE_FUNC_NULL, NULL, NULL }, + { "%f", 3, "B", (long)bu_offsetof(struct rt_rhc_internal, rhc_B[X]), BU_STRUCTPARSE_FUNC_NULL, NULL, NULL }, { "%f", 1, "r", bu_offsetof(struct rt_rhc_internal, rhc_r), BU_STRUCTPARSE_FUNC_NULL, NULL, NULL }, { "%f", 1, "c", bu_offsetof(struct rt_rhc_internal, rhc_c), BU_STRUCTPARSE_FUNC_NULL, NULL, NULL }, { {'\0', '\0', '\0', '\0'}, 0, (char *)NULL, 0, BU_STRUCTPARSE_FUNC_NULL, NULL, NULL } Modified: brlcad/trunk/src/librt/primitives/rpc/rpc.c =================================================================== --- brlcad/trunk/src/librt/primitives/rpc/rpc.c 2010-02-02 17:46:13 UTC (rev 37523) +++ brlcad/trunk/src/librt/primitives/rpc/rpc.c 2010-02-02 17:47:15 UTC (rev 37524) @@ -185,9 +185,9 @@ const struct bu_structparse rt_rpc_parse[] = { - { "%f", 3, "V", bu_offsetof(struct rt_rpc_internal, rpc_V[X]), BU_STRUCTPARSE_FUNC_NULL, NULL, NULL }, - { "%f", 3, "H", bu_offsetof(struct rt_rpc_internal, rpc_H[X]), BU_STRUCTPARSE_FUNC_NULL, NULL, NULL }, - { "%f", 3, "B", bu_offsetof(struct rt_rpc_internal, rpc_B[X]), BU_STRUCTPARSE_FUNC_NULL, NULL, NULL }, + { "%f", 3, "V", (long)bu_offsetof(struct rt_rpc_internal, rpc_V[X]), BU_STRUCTPARSE_FUNC_NULL, NULL, NULL }, + { "%f", 3, "H", (long)bu_offsetof(struct rt_rpc_internal, rpc_H[X]), BU_STRUCTPARSE_FUNC_NULL, NULL, NULL }, + { "%f", 3, "B", (long)bu_offsetof(struct rt_rpc_internal, rpc_B[X]), BU_STRUCTPARSE_FUNC_NULL, NULL, NULL }, { "%f", 1, "r", bu_offsetof(struct rt_rpc_internal, rpc_r), BU_STRUCTPARSE_FUNC_NULL, NULL, NULL }, { {'\0', '\0', '\0', '\0'}, 0, (char *)NULL, 0, BU_STRUCTPARSE_FUNC_NULL, NULL, NULL } }; Modified: brlcad/trunk/src/librt/primitives/superell/superell.c =================================================================== --- brlcad/trunk/src/librt/primitives/superell/superell.c 2010-02-02 17:46:13 UTC (rev 37523) +++ brlcad/trunk/src/librt/primitives/superell/superell.c 2010-02-02 17:47:15 UTC (rev 37524) @@ -47,10 +47,10 @@ const struct bu_structparse rt_superell_parse[] = { - { "%f", 3, "V", bu_offsetof(struct rt_superell_internal, v[X]), BU_STRUCTPARSE_FUNC_NULL, NULL, NULL }, - { "%f", 3, "A", bu_offsetof(struct rt_superell_internal, a[X]), BU_STRUCTPARSE_FUNC_NULL, NULL, NULL }, - { "%f", 3, "B", bu_offsetof(struct rt_superell_internal, b[X]), BU_STRUCTPARSE_FUNC_NULL, NULL, NULL }, - { "%f", 3, "C", bu_offsetof(struct rt_superell_internal, c[X]), BU_STRUCTPARSE_FUNC_NULL, NULL, NULL }, + { "%f", 3, "V", (long)bu_offsetof(struct rt_superell_internal, v[X]), BU_STRUCTPARSE_FUNC_NULL, NULL, NULL }, + { "%f", 3, "A", (long)bu_offsetof(struct rt_superell_internal, a[X]), BU_STRUCTPARSE_FUNC_NULL, NULL, NULL }, + { "%f", 3, "B", (long)bu_offsetof(struct rt_superell_internal, b[X]), BU_STRUCTPARSE_FUNC_NULL, NULL, NULL }, + { "%f", 3, "C", (long)bu_offsetof(struct rt_superell_internal, c[X]), BU_STRUCTPARSE_FUNC_NULL, NULL, NULL }, { "%f", 1, "n", bu_offsetof(struct rt_superell_internal, n), BU_STRUCTPARSE_FUNC_NULL, NULL, NULL }, { "%f", 1, "e", bu_offsetof(struct rt_superell_internal, e), BU_STRUCTPARSE_FUNC_NULL, NULL, NULL }, { {'\0', '\0', '\0', '\0'}, 0, (char *)NULL, 0, BU_STRUCTPARSE_FUNC_NULL, NULL, NULL } Modified: brlcad/trunk/src/librt/primitives/tgc/tgc.c =================================================================== --- brlcad/trunk/src/librt/primitives/tgc/tgc.c 2010-02-02 17:46:13 UTC (rev 37523) +++ brlcad/trunk/src/librt/primitives/tgc/tgc.c 2010-02-02 17:47:15 UTC (rev 37524) @@ -76,12 +76,12 @@ #define ALPHA(x, y, c, d) ((x)*(x)*(c) + (y)*(y)*(d)) const struct bu_structparse rt_tgc_parse[] = { - { "%f", 3, "V", bu_offsetof(struct rt_tgc_internal, v[X]), BU_STRUCTPARSE_FUNC_NULL, NULL, NULL }, - { "%f", 3, "H", bu_offsetof(struct rt_tgc_internal, h[X]), BU_STRUCTPARSE_FUNC_NULL, NULL, NULL }, - { "%f", 3, "A", bu_offsetof(struct rt_tgc_internal, a[X]), BU_STRUCTPARSE_FUNC_NULL, NULL, NULL }, - { "%f", 3, "B", bu_offsetof(struct rt_tgc_internal, b[X]), BU_STRUCTPARSE_FUNC_NULL, NULL, NULL }, - { "%f", 3, "C", bu_offsetof(struct rt_tgc_internal, c[X]), BU_STRUCTPARSE_FUNC_NULL, NULL, NULL }, - { "%f", 3, "D", bu_offsetof(struct rt_tgc_internal, d[X]), BU_STRUCTPARSE_FUNC_NULL, NULL, NULL }, + { "%f", 3, "V", (long)bu_offsetof(struct rt_tgc_internal, v[X]), BU_STRUCTPARSE_FUNC_NULL, NULL, NULL }, + { "%f", 3, "H", (long)bu_offsetof(struct rt_tgc_internal, h[X]), BU_STRUCTPARSE_FUNC_NULL, NULL, NULL }, + { "%f", 3, "A", (long)bu_offsetof(struct rt_tgc_internal, a[X]), BU_STRUCTPARSE_FUNC_NULL, NULL, NULL }, + { "%f", 3, "B", (long)bu_offsetof(struct rt_tgc_internal, b[X]), BU_STRUCTPARSE_FUNC_NULL, NULL, NULL }, + { "%f", 3, "C", (long)bu_offsetof(struct rt_tgc_internal, c[X]), BU_STRUCTPARSE_FUNC_NULL, NULL, NULL }, + { "%f", 3, "D", (long)bu_offsetof(struct rt_tgc_internal, d[X]), BU_STRUCTPARSE_FUNC_NULL, NULL, NULL }, { {'\0', '\0', '\0', '\0'}, 0, (char *)NULL, 0, BU_STRUCTPARSE_FUNC_NULL, NULL, NULL } }; Modified: brlcad/trunk/src/librt/primitives/tor/tor.c =================================================================== --- brlcad/trunk/src/librt/primitives/tor/tor.c 2010-02-02 17:46:13 UTC (rev 37523) +++ brlcad/trunk/src/librt/primitives/tor/tor.c 2010-02-02 17:47:15 UTC (rev 37524) @@ -134,8 +134,8 @@ */ const struct bu_structparse rt_tor_parse[] = { - {"%f", 3, "V", bu_offsetof(struct rt_tor_internal, v[X]), BU_STRUCTPARSE_FUNC_NULL, NULL, NULL}, - {"%f", 3, "H", bu_offsetof(struct rt_tor_internal, h[X]), BU_STRUCTPARSE_FUNC_NULL, NULL, NULL}, + {"%f", 3, "V", (long)bu_offsetof(struct rt_tor_internal, v[X]), BU_STRUCTPARSE_FUNC_NULL, NULL, NULL}, + {"%f", 3, "H", (long)bu_offsetof(struct rt_tor_internal, h[X]), BU_STRUCTPARSE_FUNC_NULL, NULL, NULL}, {"%f", 1, "r_a", bu_offsetof(struct rt_tor_internal, r_a), BU_STRUCTPARSE_FUNC_NULL, NULL, NULL}, {"%f", 1, "r_h", bu_offsetof(struct rt_tor_internal, r_h), BU_STRUCTPARSE_FUNC_NULL, NULL, NULL}, {{'\0', '\0', '\0', '\0'}, 0, (char *)NULL, 0, BU_STRUCTPARSE_FUNC_NULL, NULL, NULL} Modified: brlcad/trunk/src/librt/primitives/vol/vol.c =================================================================== --- brlcad/trunk/src/librt/primitives/vol/vol.c 2010-02-02 17:46:13 UTC (rev 37523) +++ brlcad/trunk/src/librt/primitives/vol/vol.c 2010-02-02 17:47:15 UTC (rev 37524) @@ -65,14 +65,14 @@ #define VOL_O(m) bu_offsetof(struct rt_vol_internal, m) const struct bu_structparse rt_vol_parse[] = { - {"%s", RT_VOL_NAME_LEN, "file", bu_offsetofarray(struct rt_vol_internal, file), BU_STRUCTPARSE_FUNC_NULL, NULL, NULL }, + {"%s", RT_VOL_NAME_LEN, "file", (long)bu_offsetofarray(struct rt_vol_internal, file), BU_STRUCTPARSE_FUNC_NULL, NULL, NULL }, {"%d", 1, "w", VOL_O(xdim), BU_STRUCTPARSE_FUNC_NULL, NULL, NULL }, {"%d", 1, "n", VOL_O(ydim), BU_STRUCTPARSE_FUNC_NULL, NULL, NULL }, {"%d", 1, "d", VOL_O(zdim), BU_STRUCTPARSE_FUNC_NULL, NULL, NULL }, {"%d", 1, "lo", VOL_O(lo), BU_STRUCTPARSE_FUNC_NULL, NULL, NULL }, {"%d", 1, "hi", VOL_O(hi), BU_STRUCTPARSE_FUNC_NULL, NULL, NULL }, - {"%f", ELEMENTS_PER_VECT, "size", bu_offsetofarray(struct rt_vol_internal, cellsize), BU_STRUCTPARSE_FUNC_NULL, NULL, NULL }, - {"%f", 16, "mat", bu_offsetofarray(struct rt_vol_internal, mat), BU_STRUCTPARSE_FUNC_NULL, NULL, NULL }, + {"%f", ELEMENTS_PER_VECT, "size", (long)bu_offsetofarray(struct rt_vol_internal, cellsize), BU_STRUCTPARSE_FUNC_NULL, NULL, NULL }, + {"%f", 16, "mat", (long)bu_offsetofarray(struct rt_vol_internal, mat), BU_STRUCTPARSE_FUNC_NULL, NULL, NULL }, {"", 0, (char *)0, 0, BU_STRUCTPARSE_FUNC_NULL, NULL, NULL } }; @@ -414,7 +414,7 @@ register int y; register int z; mat_t tmat; - int ret; + size_t ret; if (dbip) RT_CK_DBI(dbip); @@ -558,7 +558,7 @@ register int y; register int z; mat_t tmat; - int ret; + size_t ret; if (dbip) RT_CK_DBI(dbip); Modified: brlcad/trunk/src/librt/tree.c =================================================================== --- brlcad/trunk/src/librt/tree.c 2010-02-02 17:46:13 UTC (rev 37523) +++ brlcad/trunk/src/librt/tree.c 2010-02-02 17:47:15 UTC (rev 37524) @@ -152,7 +152,7 @@ { struct region *rp; struct directory *dp; - int shader_len=0; + size_t shader_len=0; struct rt_i *rtip; size_t i; Tcl_HashTable *tbl = (Tcl_HashTable *)client_data; Modified: brlcad/trunk/src/librt/vlist.c =================================================================== --- brlcad/trunk/src/librt/vlist.c 2010-02-02 17:46:13 UTC (rev 37523) +++ brlcad/trunk/src/librt/vlist.c 2010-02-02 17:47:15 UTC (rev 37524) @@ -376,9 +376,9 @@ rt_vlist_export(struct bu_vls *vls, struct bu_list *hp, const char *name) { register struct bn_vlist *vp; - int nelem; - int namelen; - int nbytes; + size_t nelem; + size_t namelen; + size_t nbytes; unsigned char *buf; unsigned char *bp; @@ -396,9 +396,9 @@ namelen = strlen(name)+1; nbytes = namelen + 4 + nelem * (1+3*8) + 2; - bu_vls_setlen(vls, nbytes); + bu_vls_setlen(vls, (int)nbytes); buf = (unsigned char *)bu_vls_addr(vls); - bp = bu_plong(buf, nelem); + bp = bu_plong(buf, (int)nelem); bu_strlcpy((char *)bp, name, namelen); bp += namelen; @@ -436,9 +436,9 @@ { register const unsigned char *bp; const unsigned char *pp; /* point pointer */ - int nelem; - int namelen; - int i; + size_t nelem; + size_t namelen; + size_t i; point_t point; BU_CK_VLS(namevls); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <br...@us...> - 2010-02-18 06:15:29
|
Revision: 37650 http://brlcad.svn.sourceforge.net/brlcad/?rev=37650&view=rev Author: brlcad Date: 2010-02-18 06:15:22 +0000 (Thu, 18 Feb 2010) Log Message: ----------- quell verbose compilation warnings Modified Paths: -------------- brlcad/trunk/src/librt/db_comb.c brlcad/trunk/src/librt/primitives/arb8/arb8.c brlcad/trunk/src/librt/primitives/nmg/nmg_misc.c brlcad/trunk/src/librt/primitives/tgc/tgc.c brlcad/trunk/src/librt/transform.c Modified: brlcad/trunk/src/librt/db_comb.c =================================================================== --- brlcad/trunk/src/librt/db_comb.c 2010-02-17 22:29:55 UTC (rev 37649) +++ brlcad/trunk/src/librt/db_comb.c 2010-02-18 06:15:22 UTC (rev 37650) @@ -159,7 +159,7 @@ struct rt_tree_array *rt_tree_array, union tree *tp, int op, - int free, + int freeflag, struct resource *resp) { @@ -176,9 +176,9 @@ case OP_INTERSECT: case OP_SUBTRACT: /* This node is known to be a binary op */ - rt_tree_array = db_flatten_tree(rt_tree_array, tp->tr_b.tb_left, op, free, resp); - rt_tree_array = db_flatten_tree(rt_tree_array, tp->tr_b.tb_right, tp->tr_op, free, resp); - if (free) { + rt_tree_array = db_flatten_tree(rt_tree_array, tp->tr_b.tb_left, op, freeflag, resp); + rt_tree_array = db_flatten_tree(rt_tree_array, tp->tr_b.tb_right, tp->tr_op, freeflag, resp); + if (freeflag) { /* The leaves have been stolen, free the binary op */ tp->tr_b.tb_left = TREE_NULL; tp->tr_b.tb_right = TREE_NULL; Modified: brlcad/trunk/src/librt/primitives/arb8/arb8.c =================================================================== --- brlcad/trunk/src/librt/primitives/arb8/arb8.c 2010-02-17 22:29:55 UTC (rev 37649) +++ brlcad/trunk/src/librt/primitives/arb8/arb8.c 2010-02-18 06:15:22 UTC (rev 37650) @@ -330,7 +330,7 @@ rt_arb_centroid(point_t center_pt, const struct rt_arb_internal *arb, int npoints) { register int j; - fastf_t div; + fastf_t divisor; point_t sum; RT_ARB_CK_MAGIC(arb); @@ -340,8 +340,8 @@ for (j=0; j < npoints; j++) { VADD2(sum, sum, arb->pt[j]); } - div = 1.0 / npoints; - VSCALE(center_pt, sum, div); + divisor = 1.0 / npoints; + VSCALE(center_pt, sum, divisor); } Modified: brlcad/trunk/src/librt/primitives/nmg/nmg_misc.c =================================================================== --- brlcad/trunk/src/librt/primitives/nmg/nmg_misc.c 2010-02-17 22:29:55 UTC (rev 37649) +++ brlcad/trunk/src/librt/primitives/nmg/nmg_misc.c 2010-02-18 06:15:22 UTC (rev 37650) @@ -3700,7 +3700,7 @@ for (BU_LIST_FOR (s1, shell, &tmp_r->s_hd)) { struct shell *s2; int inner_count=0; - int abort = 0; + int stop = 0; for (BU_LIST_FOR (s2, shell, &tmp_r->s_hd)) { int class; @@ -3714,7 +3714,7 @@ else if (class == NMG_CLASS_Unknown) { bu_log("nmg_fix_normals: nmg_classify_s_vs_s() failed for shells x%x and x%x\n", s1, s2); bu_log(" Continuing anyway (shell is likely to have incorrectly oriented normals)\n"); - abort = 1; + stop = 1; break; } } @@ -3723,7 +3723,7 @@ /* shell s1 is inside an odd number of shells, so it must be a void */ bu_ptbl_ins(&reverse, (long *)s1); } - if (abort) { + if (stop) { break; } } Modified: brlcad/trunk/src/librt/primitives/tgc/tgc.c =================================================================== --- brlcad/trunk/src/librt/primitives/tgc/tgc.c 2010-02-17 22:29:55 UTC (rev 37649) +++ brlcad/trunk/src/librt/primitives/tgc/tgc.c 2010-02-18 06:15:22 UTC (rev 37650) @@ -1939,7 +1939,7 @@ fastf_t h, a, b, c, d; /* lengths of TGC vectors */ fastf_t inv_length; /* 1.0/length of a vector */ vect_t unit_a, unit_b, unit_c, unit_d; /* units vectors in a, b, c, d directions */ - fastf_t rel, abs, norm; /* interpreted tolerances */ + fastf_t rel, absolute, norm; /* interpreted tolerances */ fastf_t alpha_tol; /* final tolerance for ellipse parameter */ fastf_t abs_tol; /* handle invalid ttol->abs */ int nells; /* total number of ellipses */ @@ -2047,9 +2047,9 @@ alpha_tol = bn_halfpi; } else { if (abs_tol > 0.0) - abs = 2.0 * acos(1.0 - abs_tol/max_radius); + absolute = 2.0 * acos(1.0 - abs_tol/max_radius); else - abs = bn_halfpi; + absolute = bn_halfpi; if (ttol->rel > 0.0) { if (ttol->rel * 2.0 * radius < max_radius) @@ -2079,8 +2079,8 @@ } else norm = bn_halfpi; - if (abs < rel) - alpha_tol = abs; + if (absolute < rel) + alpha_tol = absolute; else alpha_tol = rel; if (norm < alpha_tol) Modified: brlcad/trunk/src/librt/transform.c =================================================================== --- brlcad/trunk/src/librt/transform.c 2010-02-17 22:29:55 UTC (rev 37649) +++ brlcad/trunk/src/librt/transform.c 2010-02-18 06:15:22 UTC (rev 37650) @@ -33,13 +33,13 @@ * r t _ m a t r i x _ t r a n s f o r m * * apply a matrix transformation to a given input object, setting the - * resultant transformed object as the output solid. if free is set, - * the input object will be released. + * resultant transformed object as the output solid. if freeflag is + * set, the input object will be released. * * returns zero if matrix transform was applied, non-zero on failure. */ int -rt_matrix_transform(struct rt_db_internal *output, const mat_t matrix, struct rt_db_internal *input, int free, struct db_i *dbip, struct resource *resource) +rt_matrix_transform(struct rt_db_internal *output, const mat_t matrix, struct rt_db_internal *input, int freeflag, struct db_i *dbip, struct resource *resource) { int ret; @@ -50,7 +50,7 @@ ret = -1; if (rt_functab[input->idb_type].ft_xform) { - ret = rt_functab[input->idb_type].ft_xform(output, matrix, input, free, dbip, resource); + ret = rt_functab[input->idb_type].ft_xform(output, matrix, input, freeflag, dbip, resource); } return ret; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <br...@us...> - 2010-02-18 23:09:21
|
Revision: 37670 http://brlcad.svn.sourceforge.net/brlcad/?rev=37670&view=rev Author: brlcad Date: 2010-02-18 23:09:14 +0000 (Thu, 18 Feb 2010) Log Message: ----------- remove all of the rt_comb_*() functions out of tcl and back over with other comb routines in db5_comb.c and db_tree.c; begin rewriting db_tcl_tree_describe() as db_tree_list() with the implementation NOT using a Tcl_DString. basic mirrored support for beginnging and ending a list scope are implemented along with a matching routine to determine if a space needs to be added. one piece remaining, to add a new element. Modified Paths: -------------- brlcad/trunk/src/librt/db5_comb.c brlcad/trunk/src/librt/db_tree.c brlcad/trunk/src/librt/tcl.c Modified: brlcad/trunk/src/librt/db5_comb.c =================================================================== --- brlcad/trunk/src/librt/db5_comb.c 2010-02-18 23:02:50 UTC (rev 37669) +++ brlcad/trunk/src/librt/db5_comb.c 2010-02-18 23:09:14 UTC (rev 37670) @@ -21,7 +21,7 @@ /** @{ */ /** @file db5_comb.c * - * Handle import/export of combinations (union tree) in v5 format. + * Implement support for combinations in v5 format. * * The on-disk record looks like this: * width byte @@ -44,6 +44,7 @@ #include <stdlib.h> #include <stdio.h> #include <string.h> +#include <ctype.h> #include "bio.h" #include "bu.h" @@ -64,6 +65,7 @@ #define DB_TREE_COUNTER_STATE_MAGIC 0x64546373 /* dTcs */ #define DB_CK_TREE_COUNTER_STATE(_p) BU_CKMAG(_p, DB_TREE_COUNTER_STATE_MAGIC, "db_tree_counter_state"); + /** * D B _ T R E E _ C O U N T E R * @@ -238,6 +240,7 @@ } } + /** * R T _ C O M B _ E X P O R T 5 */ @@ -391,7 +394,7 @@ } else bu_avs_remove( avsp, "rgb" ); - /* optical shader string goes out in Tcl format */ + /* optical shader string goes in an attribute */ if ( bu_vls_strlen( &comb->shader ) > 0 ) bu_avs_add_vls( avsp, "oshader", &comb->shader ); else @@ -430,6 +433,7 @@ return 0; /* OK */ } + /** * R T _ C O M B _ I M P O R T 5 * @@ -772,6 +776,334 @@ return 0; /* OK */ } + +/** + * R T _ C O M B _ G E T + * + * Sets the result string to a description of the given combination. + * Entered via rt_functab[].ft_get(). + */ +int +rt_comb_get(struct bu_vls *logstr, const struct rt_db_internal *intern, const char *item) +{ + const struct rt_comb_internal *comb; + char buf[128]; + + RT_CK_DB_INTERNAL(intern); + comb = (struct rt_comb_internal *)intern->idb_ptr; + RT_CK_COMB(comb); + + if (item==0) { + /* Print out the whole combination. */ + + bu_vls_printf(logstr, "comb region "); + if (comb->region_flag) { + bu_vls_printf(logstr, "yes id %d ", comb->region_id); + + if (comb->aircode) { + bu_vls_printf(logstr, "air %d ", comb->aircode); + } + if (comb->los) { + bu_vls_printf(logstr, "los %d ", comb->los); + } + + if (comb->GIFTmater) { + bu_vls_printf(logstr, "GIFTmater %d ", comb->GIFTmater); + } + } else { + bu_vls_printf(logstr, "no "); + } + + if (comb->rgb_valid) { + bu_vls_printf(logstr, "rgb {%d %d %d} ", V3ARGS(comb->rgb)); + } + + if (bu_vls_strlen(&comb->shader) > 0) { + bu_vls_printf(logstr, "shader {%s} ", bu_vls_addr(&comb->shader)); + } + + if (bu_vls_strlen(&comb->material) > 0) { + bu_vls_printf(logstr, "material %s ", bu_vls_addr(&comb->material)); + } + + if (comb->inherit) { + bu_vls_printf(logstr, "inherit yes "); + } + + db_tree_list(logstr, comb->tree); + return BRLCAD_OK; + } else { + /* Print out only the requested item. */ + register int i; + char itemlwr[128]; + + for (i = 0; i < 128 && item[i]; i++) { + itemlwr[i] = (isupper(item[i]) ? tolower(item[i]) : + item[i]); + } + itemlwr[i] = 0; + + if (strcmp(itemlwr, "region")==0) { + snprintf(buf, 128, "%s", comb->region_flag ? "yes" : "no"); + } else if (strcmp(itemlwr, "id")==0) { + if (!comb->region_flag) goto not_region; + snprintf(buf, 128, "%ld", comb->region_id); + } else if (strcmp(itemlwr, "air")==0) { + if (!comb->region_flag) goto not_region; + snprintf(buf, 128, "%ld", comb->aircode); + } else if (strcmp(itemlwr, "los")==0) { + if (!comb->region_flag) goto not_region; + snprintf(buf, 128, "%ld", comb->los); + } else if (strcmp(itemlwr, "giftmater")==0) { + if (!comb->region_flag) goto not_region; + snprintf(buf, 128, "%ld", comb->GIFTmater); + } else if (strcmp(itemlwr, "rgb")==0) { + if (comb->rgb_valid) + snprintf(buf, 128, "%d %d %d", V3ARGS(comb->rgb)); + else + snprintf(buf, 128, "invalid"); + } else if (strcmp(itemlwr, "shader")==0) { + bu_vls_printf(logstr, "%s", bu_vls_addr(&comb->shader)); + return BRLCAD_OK; + } else if (strcmp(itemlwr, "material")==0) { + bu_vls_printf(logstr, "%s", bu_vls_addr(&comb->material)); + return BRLCAD_OK; + } else if (strcmp(itemlwr, "inherit")==0) { + snprintf(buf, 128, "%s", comb->inherit ? "yes" : "no"); + } else if (strcmp(itemlwr, "tree")==0) { + db_tree_list(logstr, comb->tree); + return BRLCAD_OK; + } else { + bu_vls_printf(logstr, "no such attribute"); + return BRLCAD_ERROR; + } + + bu_vls_printf(logstr, "%s", buf); + return BRLCAD_OK; + + not_region: + bu_vls_printf(logstr, "item not valid for non-region"); + return BRLCAD_ERROR; + } +} + + +/** + * R T _ C O M B _ A D J U S T + * + * Example - + * rgb "1 2 3" ... + * + * Invoked via rt_functab[ID_COMBINATION].ft_adjust() + */ +int +rt_comb_adjust(struct bu_vls *logstr, struct rt_db_internal *intern, int argc, char **argv) +{ + struct rt_comb_internal *comb; + char buf[128]; + int i; + double d; + + RT_CK_DB_INTERNAL(intern); + comb = (struct rt_comb_internal *)intern->idb_ptr; + RT_CK_COMB(comb); + + while (argc >= 2) { + /* Force to lower case */ + for (i=0; i<128 && argv[0][i]!='\0'; i++) + buf[i] = isupper(argv[0][i])?tolower(argv[0][i]):argv[0][i]; + buf[i] = 0; + + if (strcmp(buf, "region")==0) { + if (strcmp(argv[1], "none") == 0) { + comb->region_flag = 0; + } else if (strcmp(argv[1], "no") == 0) { + comb->region_flag = 0; + } else if (strcmp(argv[1], "yes") == 0) { + comb->region_flag = 1; + } else { + if (sscanf(argv[1], "%d", &i) != 1) + return BRLCAD_ERROR; + + if (i != 0) + i = 1; + + comb->region_flag = (char)i; + } + } else if (strcmp(buf, "temp")==0) { + if (!comb->region_flag) goto not_region; + if (strcmp(argv[1], "none") == 0) { + comb->temperature = 0.0; + } else { + if (sscanf(argv[1], "%lf", &d) != 1) + return BRLCAD_ERROR; + comb->temperature = (float)d; + } + } else if (strcmp(buf, "id")==0) { + if (!comb->region_flag) goto not_region; + if (strcmp(argv[1], "none") == 0) { + comb->region_id = 0; + } else { + if (sscanf(argv[1], "%d", &i) != 1) + return BRLCAD_ERROR; + comb->region_id = i; + } + } else if (strcmp(buf, "air")==0) { + if (!comb->region_flag) goto not_region; + if (strcmp(argv[1], "none") == 0) { + comb->aircode = 0; + } else { + if (sscanf(argv[1], "%d", &i) != 1) + return BRLCAD_ERROR; + comb->aircode = i; + } + } else if (strcmp(buf, "los")==0) { + if (!comb->region_flag) goto not_region; + if (strcmp(argv[1], "none") == 0) { + comb->los = 0; + } else { + if (sscanf(argv[1], "%d", &i) != 1) + return BRLCAD_ERROR; + comb->los = i; + } + } else if (strcmp(buf, "giftmater")==0) { + if (!comb->region_flag) goto not_region; + if (strcmp(argv[1], "none") == 0) { + comb->GIFTmater = 0; + } else { + if (sscanf(argv[1], "%d", &i) != 1) + return BRLCAD_ERROR; + comb->GIFTmater = i; + } + } else if (strcmp(buf, "rgb")==0) { + if (strcmp(argv[1], "invalid")==0 || strcmp(argv[1], "none") == 0) { + comb->rgb[0] = comb->rgb[1] = + comb->rgb[2] = 0; + comb->rgb_valid = 0; + } else { + unsigned int r, g, b; + i = sscanf(argv[1], "%u %u %u", + &r, &g, &b); + if (i != 3) { + bu_vls_printf(logstr, "adjust rgb %s: not valid rgb 3-tuple\n", argv[1]); + return BRLCAD_ERROR; + } + comb->rgb[0] = (unsigned char)r; + comb->rgb[1] = (unsigned char)g; + comb->rgb[2] = (unsigned char)b; + comb->rgb_valid = 1; + } + } else if (strcmp(buf, "shader")==0) { + bu_vls_trunc(&comb->shader, 0); + if (strcmp(argv[1], "none")) { + bu_vls_strcat(&comb->shader, argv[1]); + /* Leading spaces boggle the combination exporter */ + bu_vls_trimspace(&comb->shader); + } + } else if (strcmp(buf, "material")==0) { + bu_vls_trunc(&comb->material, 0); + if (strcmp(argv[1], "none")) { + bu_vls_strcat(&comb->material, argv[1]); + bu_vls_trimspace(&comb->material); + } + } else if (strcmp(buf, "inherit")==0) { + if (strcmp(argv[1], "none") == 0) { + comb->inherit = 0; + } else if (strcmp(argv[1], "no") == 0) { + comb->inherit = 0; + } else if (strcmp(argv[1], "yes") == 0) { + comb->inherit = 1; + } else { + if (sscanf(argv[1], "%d", &i) != 1) + return BRLCAD_ERROR; + + if (i != 0) + i = 1; + + comb->inherit = (char)i; + } + } else if (strcmp(buf, "tree")==0) { + union tree *new; + + if (*argv[1] == '\0' || strcmp(argv[1], "none") == 0) { + if (comb->tree) { + db_free_tree(comb->tree, &rt_uniresource); + } + comb->tree = TREE_NULL; + } else { + new = db_tree_parse(logstr, argv[1], &rt_uniresource); + if (new == TREE_NULL) { + bu_vls_printf(logstr, "db adjust tree: bad tree '%s'\n", argv[1]); + return BRLCAD_ERROR; + } + if (comb->tree) + db_free_tree(comb->tree, &rt_uniresource); + comb->tree = new; + } + } else { + bu_vls_printf(logstr, "db adjust %s : no such attribute", buf); + return BRLCAD_ERROR; + } + argc -= 2; + argv += 2; + } + + return BRLCAD_OK; + +not_region: + bu_vls_printf(logstr, "adjusting attribute %s is not valid for a non-region combination.", buf); + return BRLCAD_ERROR; +} + + +/** + * R T _ C O M B _ F O R M + */ +int +rt_comb_form(struct bu_vls *logstr, const struct rt_functab *ftp) +{ + RT_CK_FUNCTAB(ftp); + + bu_vls_printf(logstr, "region {%%s} id {%%d} air {%%d} los {%%d} GIFTmater {%%d} rgb {%%d %%d %%d} shader {%%s} material {%%s} inherit {%%s} tree {%%s}"); + + return BRLCAD_OK; +} + + +/** + * R T _ C O M B _ M A K E + * + * Create a blank combination with appropriate values. Called via + * rt_functab[ID_COMBINATION].ft_make(). + */ +void +rt_comb_make(const struct rt_functab *ftp __attribute__((unused)), struct rt_db_internal *intern) +{ + struct rt_comb_internal *comb; + + intern->idb_major_type = DB5_MAJORTYPE_BRLCAD; + intern->idb_type = ID_COMBINATION; + intern->idb_meth = &rt_functab[ID_COMBINATION]; + intern->idb_ptr = bu_calloc(sizeof(struct rt_comb_internal), 1, + "rt_comb_internal"); + + comb = (struct rt_comb_internal *)intern->idb_ptr; + comb->magic = (long)RT_COMB_MAGIC; + comb->temperature = -1; + comb->tree = (union tree *)0; + comb->region_flag = 1; + comb->region_id = 0; + comb->aircode = 0; + comb->GIFTmater = 0; + comb->los = 0; + comb->rgb_valid = 0; + comb->rgb[0] = comb->rgb[1] = comb->rgb[2] = 0; + bu_vls_init(&comb->shader); + bu_vls_init(&comb->material); + comb->inherit = 0; +} + + /* * Local Variables: * mode: C Modified: brlcad/trunk/src/librt/db_tree.c =================================================================== --- brlcad/trunk/src/librt/db_tree.c 2010-02-18 23:02:50 UTC (rev 37669) +++ brlcad/trunk/src/librt/db_tree.c 2010-02-18 23:09:14 UTC (rev 37670) @@ -31,6 +31,7 @@ #include <stdio.h> #include <math.h> #include <string.h> +#include <ctype.h> #include "bio.h" #include "bu.h" @@ -2749,7 +2750,6 @@ MAT_DELTAS_VEC(m_xlate, v_tmp); bn_mat_mul(m_tmp, m_xlate, model_to_region); - /* * Scale the bounding box to unit cube */ @@ -2762,6 +2762,369 @@ } +HIDDEN int +tree_list_needspace(struct bu_vls *vls) +{ + int len = 0; + const char *str = NULL; + const char *end = NULL; + + if (!vls) return 0; + + /* don't need a space if the string is empty */ + len = bu_vls_strlen(vls); + if (len == 0) + return 0; + + /* don't need a space at the start of a (potentially nested) new + * list. backtrack until we're out. + */ + str = bu_vls_addr(vls); + end = str + len - 1; + while (end && *end == '{') { + if (end == str) { + return 0; + } + end--; + } + + /* sanity, shouldn't happen */ + if (!end || end == str) { + return 0; + } + + /* don't need a space if there is already whitespace separation, + * unless it has been escaped. + */ + if (isspace(*end) && *(end-1) != '\\') { + return 0; + } + + /* yep, we need space */ + return 1; +} + +HIDDEN void +tree_list_append(struct bu_vls *vls, const char *str) +{ + if (!vls || !str) return; + + +} + + +HIDDEN void +tree_list_sublist_begin(struct bu_vls *vls) +{ + if (!vls) return; + + if (tree_list_needspace(vls)) { + bu_vls_strcat(vls, " {"); + } else { + bu_vls_putc(vls, '{'); + } +} + + +HIDDEN void +tree_list_sublist_end(struct bu_vls *vls) +{ + if (!vls) return; + bu_vls_putc(vls, '}'); +} + + +/** + * D B _ T R E E _ L I S T + * + * Fills a Tcl_DString with a representation of the given tree + * appropriate for processing by Tcl scripts. The reason we use + * Tcl_DStrings instead of bu_vlses is that Tcl_DStrings provide + * "start/end sublist" commands and automatic escaping of Tcl-special + * characters. + * + * A tree 't' is represented in the following manner: + * + * t := { l dbobjname { mat } } + * | { l dbobjname } + * | { u t1 t2 } + * | { n t1 t2 } + * | { - t1 t2 } + * | { ^ t1 t2 } + * | { ! t1 } + * | { G t1 } + * | { X t1 } + * | { N } + * | {} + * + * where 'dbobjname' is a string containing the name of a database object, + * 'mat' is the matrix preceeding a leaf, + * 't1', 't2' are trees (recursively defined). + * + * Notice that in most cases, this tree will be grossly unbalanced. + */ +int +db_tree_list(struct bu_vls *vls, const union tree *tp) +{ + int count; + Tcl_DString ds; + + if (!tp || !vls) + return 0; + + Tcl_DStringInit(&ds); + + RT_CK_TREE(tp); + switch (tp->tr_op) { + case OP_DB_LEAF: + Tcl_DStringAppendElement(&ds, "l"); + Tcl_DStringAppendElement(&ds, tp->tr_l.tl_name); + if (tp->tr_l.tl_mat) { + struct bu_vls v; + bu_vls_init(&v); + bn_encode_mat(&v, tp->tr_l.tl_mat); + Tcl_DStringAppendElement(&ds, bu_vls_addr(&v)); + bu_vls_free(&v); + } + count++; + break; + + /* This node is known to be a binary op */ + case OP_UNION: + Tcl_DStringAppendElement(&ds, "u"); + goto bin; + case OP_INTERSECT: + Tcl_DStringAppendElement(&ds, "n"); + goto bin; + case OP_SUBTRACT: + Tcl_DStringAppendElement(&ds, "-"); + goto bin; + case OP_XOR: + Tcl_DStringAppendElement(&ds, "^"); + bin: + Tcl_DStringStartSublist(&ds); + { + struct bu_vls v; + bu_vls_init(&v); + count += db_tree_list(&v, tp->tr_b.tb_left); + Tcl_DStringAppendElement(&ds, bu_vls_addr(&v)); + bu_vls_free(&v); + } + Tcl_DStringEndSublist(&ds); + + Tcl_DStringStartSublist(&ds); + { + struct bu_vls v; + bu_vls_init(&v); + count += db_tree_list(&v, tp->tr_b.tb_right); + Tcl_DStringAppendElement(&ds, bu_vls_addr(&v)); + bu_vls_free(&v); + } + Tcl_DStringEndSublist(&ds); + + break; + + /* This node is known to be a unary op */ + case OP_NOT: + Tcl_DStringAppendElement(&ds, "!"); + goto unary; + case OP_GUARD: + Tcl_DStringAppendElement(&ds, "G"); + goto unary; + case OP_XNOP: + Tcl_DStringAppendElement(&ds, "X"); + unary: + Tcl_DStringStartSublist(&ds); + { + struct bu_vls v; + bu_vls_init(&v); + count += db_tree_list(&v, tp->tr_b.tb_left); + Tcl_DStringAppendElement(&ds, bu_vls_addr(&v)); + bu_vls_free(&v); + } + Tcl_DStringEndSublist(&ds); + break; + + case OP_NOP: + Tcl_DStringAppendElement(&ds, "N"); + break; + + default: + bu_log("db_tree_list: bad op %d\n", tp->tr_op); + bu_bomb("db_tree_list\n"); + } + + bu_vls_printf(vls, "%s", Tcl_DStringValue(&ds)); + Tcl_DStringFree(&ds); + + return count; +} + + +/** + * D B _ T R E E _ P A R S E + * + * Take a TCL-style string description of a binary tree, as produced + * by db_tree_list(), and reconstruct the in-memory form of + * that tree. + */ +union tree * +db_tree_parse(struct bu_vls *vls, const char *str, struct resource *resp) +{ + int argc; + char **argv; + union tree *tp = TREE_NULL; + + if (!resp) { + resp = &rt_uniresource; + } + RT_CK_RESOURCE(resp); + + /* Skip over leading spaces in input */ + while (*str && isspace(*str)) str++; + + /*XXX Temporarily use brlcad_interp until a replacement for Tcl_SplitList is created */ + if (Tcl_SplitList(brlcad_interp, str, &argc, (const char ***)&argv) != TCL_OK) + return TREE_NULL; + + if (argc <= 0 || argc > 3) { + bu_vls_printf(vls, + "db_tree_parse: tree node does not have 1, 2 or 2 elements: %s\n", + str); + goto out; + } + + if (argv[0][1] != '\0') { + bu_vls_printf(vls, "db_tree_parse() operator is not single character: %s", argv[0]); + goto out; + } + + switch (argv[0][0]) { + case 'l': + /* Leaf node: {l name {mat}} */ + RT_GET_TREE(tp, resp); + tp->tr_l.magic = RT_TREE_MAGIC; + tp->tr_op = OP_DB_LEAF; + tp->tr_l.tl_name = bu_strdup(argv[1]); + /* If matrix not specified, NULL pointer ==> identity matrix */ + tp->tr_l.tl_mat = NULL; + if (argc == 3) { + mat_t m; + /* decode also recognizes "I" notation for identity */ + if (bn_decode_mat(m, argv[2]) != 16) { + bu_vls_printf(vls, + "db_tree_parse: unable to parse matrix '%s' using identity", + argv[2]); + break; + } + if (bn_mat_is_identity(m)) + break; + if (bn_mat_ck("db_tree_parse", m)) { + bu_vls_printf(vls, + "db_tree_parse: matrix '%s', does not preserve axis perpendicularity, using identity", argv[2]); + break; + } + /* Finally, a good non-identity matrix, dup & save it */ + tp->tr_l.tl_mat = bn_mat_dup(m); + } + break; + + case 'u': + /* Binary: Union: {u {lhs} {rhs}} */ + RT_GET_TREE(tp, resp); + tp->tr_b.tb_op = OP_UNION; + goto binary; + case 'n': + /* Binary: Intersection */ + RT_GET_TREE(tp, resp); + tp->tr_b.tb_op = OP_INTERSECT; + goto binary; + case '-': + /* Binary: Union */ + RT_GET_TREE(tp, resp); + tp->tr_b.tb_op = OP_SUBTRACT; + goto binary; + case '^': + /* Binary: Xor */ + RT_GET_TREE(tp, resp); + tp->tr_b.tb_op = OP_XOR; + goto binary; + binary: + tp->tr_b.magic = RT_TREE_MAGIC; + if (argv[1] == (char *)NULL || argv[2] == (char *)NULL) { + bu_vls_printf(vls, + "db_tree_parse: binary operator %s has insufficient operands in %s", + argv[0], str); + RT_FREE_TREE(tp, resp); + tp = TREE_NULL; + goto out; + } + tp->tr_b.tb_left = db_tree_parse(vls, argv[1], resp); + if (tp->tr_b.tb_left == TREE_NULL) { + RT_FREE_TREE(tp, resp); + tp = TREE_NULL; + goto out; + } + tp->tr_b.tb_right = db_tree_parse(vls, argv[2], resp); + if (tp->tr_b.tb_left == TREE_NULL) { + db_free_tree(tp->tr_b.tb_left, resp); + RT_FREE_TREE(tp, resp); + tp = TREE_NULL; + goto out; + } + break; + + case '!': + /* Unary: not {! {lhs}} */ + RT_GET_TREE(tp, resp); + tp->tr_b.tb_op = OP_NOT; + goto unary; + case 'G': + /* Unary: GUARD {G {lhs}} */ + RT_GET_TREE(tp, resp); + tp->tr_b.tb_op = OP_GUARD; + goto unary; + case 'X': + /* Unary: XNOP {X {lhs}} */ + RT_GET_TREE(tp, resp); + tp->tr_b.tb_op = OP_XNOP; + goto unary; + unary: + tp->tr_b.magic = RT_TREE_MAGIC; + if (argv[1] == (char *)NULL) { + bu_vls_printf(vls, + "db_tree_parse: unary operator %s has insufficient operands in %s\n", + argv[0], str); + bu_free((char *)tp, "union tree"); + tp = TREE_NULL; + goto out; + } + tp->tr_b.tb_left = db_tree_parse(vls, argv[1], resp); + if (tp->tr_b.tb_left == TREE_NULL) { + bu_free((char *)tp, "union tree"); + tp = TREE_NULL; + goto out; + } + break; + + case 'N': + /* NOP: no args. {N} */ + RT_GET_TREE(tp, resp); + tp->tr_b.tb_op = OP_XNOP; + tp->tr_b.magic = RT_TREE_MAGIC; + break; + + default: + bu_vls_printf(vls, "db_tree_parse: unable to interpret operator '%s'\n", argv[1]); + } + +out: + /*XXX Temporarily using tcl for its Tcl_SplitList */ + Tcl_Free((char *)argv); /* not bu_free(), not free() */ + return tp; +} + + /** @} */ /* * Local Variables: Modified: brlcad/trunk/src/librt/tcl.c =================================================================== --- brlcad/trunk/src/librt/tcl.c 2010-02-18 23:02:50 UTC (rev 37669) +++ brlcad/trunk/src/librt/tcl.c 2010-02-18 23:09:14 UTC (rev 37670) @@ -624,276 +624,15 @@ /************************************************************************ * * - * Tcl interface to Combination import/export * + * Tcl interface to Combination management * * * ************************************************************************/ /** - * D B _ T C L _ T R E E _ D E S C R I B E - * - * Fills a Tcl_DString with a representation of the given tree - * appropriate for processing by Tcl scripts. The reason we use - * Tcl_DStrings instead of bu_vlses is that Tcl_DStrings provide - * "start/end sublist" commands and automatic escaping of Tcl-special - * characters. - * - * A tree 't' is represented in the following manner: - * - * t := { l dbobjname { mat } } - * | { l dbobjname } - * | { u t1 t2 } - * | { n t1 t2 } - * | { - t1 t2 } - * | { ^ t1 t2 } - * | { ! t1 } - * | { G t1 } - * | { X t1 } - * | { N } - * | {} - * - * where 'dbobjname' is a string containing the name of a database object, - * 'mat' is the matrix preceeding a leaf, - * 't1', 't2' are trees (recursively defined). - * - * Notice that in most cases, this tree will be grossly unbalanced. - */ -void -db_tcl_tree_describe(Tcl_DString *dsp, const union tree *tp) -{ - if (!tp) return; - - RT_CK_TREE(tp); - switch (tp->tr_op) { - case OP_DB_LEAF: - Tcl_DStringAppendElement(dsp, "l"); - Tcl_DStringAppendElement(dsp, tp->tr_l.tl_name); - if (tp->tr_l.tl_mat) { - struct bu_vls vls; - bu_vls_init(&vls); - bn_encode_mat(&vls, tp->tr_l.tl_mat); - Tcl_DStringAppendElement(dsp, bu_vls_addr(&vls)); - bu_vls_free(&vls); - } - break; - - /* This node is known to be a binary op */ - case OP_UNION: - Tcl_DStringAppendElement(dsp, "u"); - goto bin; - case OP_INTERSECT: - Tcl_DStringAppendElement(dsp, "n"); - goto bin; - case OP_SUBTRACT: - Tcl_DStringAppendElement(dsp, "-"); - goto bin; - case OP_XOR: - Tcl_DStringAppendElement(dsp, "^"); - bin: - Tcl_DStringStartSublist(dsp); - db_tcl_tree_describe(dsp, tp->tr_b.tb_left); - Tcl_DStringEndSublist(dsp); - - Tcl_DStringStartSublist(dsp); - db_tcl_tree_describe(dsp, tp->tr_b.tb_right); - Tcl_DStringEndSublist(dsp); - - break; - - /* This node is known to be a unary op */ - case OP_NOT: - Tcl_DStringAppendElement(dsp, "!"); - goto unary; - case OP_GUARD: - Tcl_DStringAppendElement(dsp, "G"); - goto unary; - case OP_XNOP: - Tcl_DStringAppendElement(dsp, "X"); - unary: - Tcl_DStringStartSublist(dsp); - db_tcl_tree_describe(dsp, tp->tr_b.tb_left); - Tcl_DStringEndSublist(dsp); - break; - - case OP_NOP: - Tcl_DStringAppendElement(dsp, "N"); - break; - - default: - bu_log("db_tcl_tree_describe: bad op %d\n", tp->tr_op); - bu_bomb("db_tcl_tree_describe\n"); - } -} - - -/** - * D B _ T R E E _ P A R S E - * - * Take a TCL-style string description of a binary tree, as produced - * by db_tcl_tree_describe(), and reconstruct the in-memory form of - * that tree. - */ -union tree * -db_tree_parse(struct bu_vls *logstr, const char *str, struct resource *resp) -{ - int argc; - char **argv; - union tree *tp = TREE_NULL; - - if (!resp) { - resp = &rt_uniresource; - } - RT_CK_RESOURCE(resp); - - /* Skip over leading spaces in input */ - while (*str && isspace(*str)) str++; - - /*XXX Temporarily use brlcad_interp until a replacement for Tcl_SplitList is created */ - if (Tcl_SplitList(brlcad_interp, str, &argc, (const char ***)&argv) != TCL_OK) - return TREE_NULL; - - if (argc <= 0 || argc > 3) { - bu_vls_printf(logstr, - "db_tree_parse: tree node does not have 1, 2 or 2 elements: %s\n", - str); - goto out; - } - - if (argv[0][1] != '\0') { - bu_vls_printf(logstr, "db_tree_parse() operator is not single character: %s", argv[0]); - goto out; - } - - switch (argv[0][0]) { - case 'l': - /* Leaf node: {l name {mat}} */ - RT_GET_TREE(tp, resp); - tp->tr_l.magic = RT_TREE_MAGIC; - tp->tr_op = OP_DB_LEAF; - tp->tr_l.tl_name = bu_strdup(argv[1]); - /* If matrix not specified, NULL pointer ==> identity matrix */ - tp->tr_l.tl_mat = NULL; - if (argc == 3) { - mat_t m; - /* decode also recognizes "I" notation for identity */ - if (bn_decode_mat(m, argv[2]) != 16) { - bu_vls_printf(logstr, - "db_tree_parse: unable to parse matrix '%s' using identity", - argv[2]); - break; - } - if (bn_mat_is_identity(m)) - break; - if (bn_mat_ck("db_tree_parse", m)) { - bu_vls_printf(logstr, - "db_tree_parse: matrix '%s', does not preserve axis perpendicularity, using identity", argv[2]); - break; - } - /* Finally, a good non-identity matrix, dup & save it */ - tp->tr_l.tl_mat = bn_mat_dup(m); - } - break; - - case 'u': - /* Binary: Union: {u {lhs} {rhs}} */ - RT_GET_TREE(tp, resp); - tp->tr_b.tb_op = OP_UNION; - goto binary; - case 'n': - /* Binary: Intersection */ - RT_GET_TREE(tp, resp); - tp->tr_b.tb_op = OP_INTERSECT; - goto binary; - case '-': - /* Binary: Union */ - RT_GET_TREE(tp, resp); - tp->tr_b.tb_op = OP_SUBTRACT; - goto binary; - case '^': - /* Binary: Xor */ - RT_GET_TREE(tp, resp); - tp->tr_b.tb_op = OP_XOR; - goto binary; - binary: - tp->tr_b.magic = RT_TREE_MAGIC; - if (argv[1] == (char *)NULL || argv[2] == (char *)NULL) { - bu_vls_printf(logstr, - "db_tree_parse: binary operator %s has insufficient operands in %s", - argv[0], str); - RT_FREE_TREE(tp, resp); - tp = TREE_NULL; - goto out; - } - tp->tr_b.tb_left = db_tree_parse(logstr, argv[1], resp); - if (tp->tr_b.tb_left == TREE_NULL) { - RT_FREE_TREE(tp, resp); - tp = TREE_NULL; - goto out; - } - tp->tr_b.tb_right = db_tree_parse(logstr, argv[2], resp); - if (tp->tr_b.tb_left == TREE_NULL) { - db_free_tree(tp->tr_b.tb_left, resp); - RT_FREE_TREE(tp, resp); - tp = TREE_NULL; - goto out; - } - break; - - case '!': - /* Unary: not {! {lhs}} */ - RT_GET_TREE(tp, resp); - tp->tr_b.tb_op = OP_NOT; - goto unary; - case 'G': - /* Unary: GUARD {G {lhs}} */ - RT_GET_TREE(tp, resp); - tp->tr_b.tb_op = OP_GUARD; - goto unary; - case 'X': - /* Unary: XNOP {X {lhs}} */ - RT_GET_TREE(tp, resp); - tp->tr_b.tb_op = OP_XNOP; - goto unary; - unary: - tp->tr_b.magic = RT_TREE_MAGIC; - if (argv[1] == (char *)NULL) { - bu_vls_printf(logstr, - "db_tree_parse: unary operator %s has insufficient operands in %s\n", - argv[0], str); - bu_free((char *)tp, "union tree"); - tp = TREE_NULL; - goto out; - } - tp->tr_b.tb_left = db_tree_parse(logstr, argv[1], resp); - if (tp->tr_b.tb_left == TREE_NULL) { - bu_free((char *)tp, "union tree"); - tp = TREE_NULL; - goto out; - } - break; - - case 'N': - /* NOP: no args. {N} */ - RT_GET_TREE(tp, resp); - tp->tr_b.tb_op = OP_XNOP; - tp->tr_b.magic = RT_TREE_MAGIC; - break; - - default: - bu_vls_printf(logstr, "db_tree_parse: unable to interpret operator '%s'\n", argv[1]); - } - -out: - /*XXX Temporarily using tcl for its Tcl_SplitList */ - Tcl_Free((char *)argv); /* not bu_free(), not free() */ - return tp; -} - - -/** * D B _ T C L _ T R E E _ P A R S E * * Take a TCL-style string description of a binary tree, as produced - * by db_tcl_tree_describe(), and reconstruct the in-memory form of + * by db_tree_list(), and reconstruct the in-memory form of * that tree. */ union tree * @@ -916,301 +655,6 @@ } -/** - * R T _ C O M B _ G E T - * - * Sets the result string to a description of the given combination. - * Entered via rt_functab[].ft_get(). - */ -int -rt_comb_get(struct bu_vls *logstr, const struct rt_db_internal *intern, const char *item) -{ - const struct rt_comb_internal *comb; - char buf[128]; - - RT_CK_DB_INTERNAL(intern); - comb = (struct rt_comb_internal *)intern->idb_ptr; - RT_CK_COMB(comb); - - if (item==0) { - /* Print out the whole combination. */ - - bu_vls_printf(logstr, "comb region "); - if (comb->region_flag) { - bu_vls_printf(logstr, "yes id %d ", comb->region_id); - - if (comb->aircode) { - bu_vls_printf(logstr, "air %d ", comb->aircode); - } - if (comb->los) { - bu_vls_printf(logstr, "los %d ", comb->los); - } - - if (comb->GIFTmater) { - bu_vls_printf(logstr, "GIFTmater %d ", comb->GIFTmater); - } - } else { - bu_vls_printf(logstr, "no "); - } - - if (comb->rgb_valid) { - bu_vls_printf(logstr, "rgb {%d %d %d} ", V3ARGS(comb->rgb)); - } - - if (bu_vls_strlen(&comb->shader) > 0) { - bu_vls_printf(logstr, "shader {%s} ", bu_vls_addr(&comb->shader)); - } - - if (bu_vls_strlen(&comb->material) > 0) { - bu_vls_printf(logstr, "material %s ", bu_vls_addr(&comb->material)); - } - - if (comb->inherit) { - bu_vls_printf(logstr, "inherit yes "); - } - - { - Tcl_DString ds; - - /*XXX Temporarily using Tcl until a replacement for db_tcl_tree_describe is written */ - Tcl_DStringInit(&ds); - bu_vls_printf(logstr, "tree {"); - db_tcl_tree_describe(&ds, comb->tree); - bu_vls_printf(logstr, "%s}", Tcl_DStringValue(&ds)); - Tcl_DStringFree(&ds); - } - - return BRLCAD_OK; - } else { - /* Print out only the requested item. */ - register int i; - char itemlwr[128]; - - for (i = 0; i < 128 && item[i]; i++) { - itemlwr[i] = (isupper(item[i]) ? tolower(item[i]) : - item[i]); - } - itemlwr[i] = 0; - - if (strcmp(itemlwr, "region")==0) { - snprintf(buf, 128, "%s", comb->region_flag ? "yes" : "no"); - } else if (strcmp(itemlwr, "id")==0) { - if (!comb->region_flag) goto not_region; - snprintf(buf, 128, "%ld", comb->region_id); - } else if (strcmp(itemlwr, "air")==0) { - if (!comb->region_flag) goto not_region; - snprintf(buf, 128, "%ld", comb->aircode); - } else if (strcmp(itemlwr, "los")==0) { - if (!comb->region_flag) goto not_region; - snprintf(buf, 128, "%ld", comb->los); - } else if (strcmp(itemlwr, "giftmater")==0) { - if (!comb->region_flag) goto not_region; - snprintf(buf, 128, "%ld", comb->GIFTmater); - } else if (strcmp(itemlwr, "rgb")==0) { - if (comb->rgb_valid) - snprintf(buf, 128, "%d %d %d", V3ARGS(comb->rgb)); - else - snprintf(buf, 128, "invalid"); - } else if (strcmp(itemlwr, "shader")==0) { - bu_vls_printf(logstr, "%s", bu_vls_addr(&comb->shader)); - return BRLCAD_OK; - } else if (strcmp(itemlwr, "material")==0) { - bu_vls_printf(logstr, "%s", bu_vls_addr(&comb->material)); - return BRLCAD_OK; - } else if (strcmp(itemlwr, "inherit")==0) { - snprintf(buf, 128, "%s", comb->inherit ? "yes" : "no"); - } else if (strcmp(itemlwr, "tree")==0) { - Tcl_DString ds; - - Tcl_DStringInit(&ds); - db_tcl_tree_describe(&ds, comb->tree); - bu_vls_printf(logstr, "%s", Tcl_DStringValue(&ds)); - Tcl_DStringFree(&ds); - - return BRLCAD_OK; - } else { - bu_vls_printf(logstr, "no such attribute"); - return BRLCAD_ERROR; - } - - bu_vls_printf(logstr, "%s", buf); - return BRLCAD_OK; - - not_region: - bu_vls_printf(logstr, "item not valid for non-region"); - return BRLCAD_ERROR; - } -} - - -/** - * R T _ C O M B _ A D J U S T - * - * Example - - * rgb "1 2 3" ... - * - * Invoked via rt_functab[ID_COMBINATION].ft_tcladjust() - */ -int -rt_comb_adjust(struct bu_vls *logstr, struct rt_db_internal *intern, int argc, char **argv) -{ - struct rt_comb_internal *comb; - char buf[128]; - int i; - double d; - - RT_CK_DB_INTERNAL(intern); - comb = (struct rt_comb_internal *)intern->idb_ptr; - RT_CK_COMB(comb); - - while (argc >= 2) { - /* Force to lower case */ - for (i=0; i<128 && argv[0][i]!='\0'; i++) - buf[i] = isupper(argv[0][i])?tolower(argv[0][i]):argv[0][i]; - buf[i] = 0; - - if (strcmp(buf, "region")==0) { - if (strcmp(argv[1], "none") == 0) { - comb->region_flag = 0; - } else if (strcmp(argv[1], "no") == 0) { - comb->region_flag = 0; - } else if (strcmp(argv[1], "yes") == 0) { - comb->region_flag = 1; - } else { - if (sscanf(argv[1], "%d", &i) != 1) - return BRLCAD_ERROR; - - if (i != 0) - i = 1; - - comb->region_flag = (char)i; - } - } else if (strcmp(buf, "temp")==0) { - if (!comb->region_flag) goto not_region; - if (strcmp(argv[1], "none") == 0) { - comb->temperature = 0.0; - } else { - if (sscanf(argv[1], "%lf", &d) != 1) - return BRLCAD_ERROR; - comb->temperature = (float)d; - } - } else if (strcmp(buf, "id")==0) { - if (!comb->region_flag) goto not_region; - if (strcmp(argv[1], "none") == 0) { - comb->region_id = 0; - } else { - if (sscanf(argv[1], "%d", &i) != 1) - return BRLCAD_ERROR; - comb->region_id = i; - } - } else if (strcmp(buf, "air")==0) { - if (!comb->region_flag) goto not_region; - if (strcmp(argv[1], "none") == 0) { - comb->aircode = 0; - } else { - if (sscanf(argv[1], "%d", &i) != 1) - return BRLCAD_ERROR; - comb->aircode = i; - } - } else if (strcmp(buf, "los")==0) { - if (!comb->region_flag) goto not_region; - if (strcmp(argv[1], "none") == 0) { - comb->los = 0; - } else { - if (sscanf(argv[1], "%d", &i) != 1) - return BRLCAD_ERROR; - comb->los = i; - } - } else if (strcmp(buf, "giftmater")==0) { - if (!comb->region_flag) goto not_region; - if (strcmp(argv[1], "none") == 0) { - comb->GIFTmater = 0; - } else { - if (sscanf(argv[1], "%d", &i) != 1) - return BRLCAD_ERROR; - comb->GIFTmater = i; - } - } else if (strcmp(buf, "rgb")==0) { - if (strcmp(argv[1], "invalid")==0 || strcmp(argv[1], "none") == 0) { - comb->rgb[0] = comb->rgb[1] = - comb->rgb[2] = 0; - comb->rgb_valid = 0; - } else { - unsigned int r, g, b; - i = sscanf(argv[1], "%u %u %u", - &r, &g, &b); - if (i != 3) { - bu_vls_printf(logstr, "adjust rgb %s: not valid rgb 3-tuple\n", argv[1]); - return BRLCAD_ERROR; - } - comb->rgb[0] = (unsigned char)r; - comb->rgb[1] = (unsigned char)g; - comb->rgb[2] = (unsigned char)b; - comb->rgb_valid = 1; - } - } else if (strcmp(buf, "shader")==0) { - bu_vls_trunc(&comb->shader, 0); - if (strcmp(argv[1], "none")) { - bu_vls_strcat(&comb->shader, argv[1]); - /* Leading spaces boggle the combination exporter */ - bu_vls_trimspace(&comb->shader); - } - } else if (strcmp(buf, "material")==0) { - bu_vls_trunc(&comb->material, 0); - if (strcmp(argv[1], "none")) { - bu_vls_strcat(&comb->material, argv[1]); - bu_vls_trimspace(&comb->material); - } - } else if (strcmp(buf, "inherit")==0) { - if (strcmp(argv[1], "none") == 0) { - comb->inherit = 0; - } else if (strcmp(argv[1], "no") == 0) { - comb->inherit = 0; - } else if (strcmp(argv[1], "yes") == 0) { - comb->inherit = 1; - } else { - if (sscanf(argv[1], "%d", &i) != 1) - return BRLCAD_ERROR; - - if (i != 0) - i = 1; - - comb->inherit = (char)i; - } - } else if (strcmp(buf, "tree")==0) { - union tree *new; - - if (*argv[1] == '\0' || strcmp(argv[1], "none") == 0) { - if (comb->tree) { - db_free_tree(comb->tree, &rt_uniresource); - } - comb->tree = TREE_NULL; - } else { - new = db_tree_parse(logstr, argv[1], &rt_uniresource); - if (new == TREE_NULL) { - bu_vls_printf(logstr, "db adjust tree: bad tree '%s'\n", argv[1]); - return BRLCAD_ERROR; - } - if (comb->tree) - db_free_tree(comb->tree, &rt_uniresource); - comb->tree = new; - } - } else { - bu_vls_printf(logstr, "db adjust %s : no such attribute", buf); - return BRLCAD_ERROR; - } - argc -= 2; - argv += 2; - } - - return BRLCAD_OK; - -not_region: - bu_vls_printf(logstr, "adjusting attribute %s is not valid for a non-region combination.", buf); - return BRLCAD_ERROR; -} - - /************************************************************************************************ * * * Tcl interface to the Database * @@ -1298,56 +742,6 @@ /** - * R T _ C O M B _ F O R M - */ -int -rt_comb_form(struct bu_vls *logstr, const struct rt_functab *ftp) -{ - RT_CK_FUNCTAB(ftp); - - bu_vls_printf(logstr, - "region {%%s} id {%%d} air {%%d} los {%%d} GIFTmater {%%d} rgb {%%d %%d %%d} \ -shader {%%s} material {%%s} inherit {%%s} tree {%%s}"); - - return BRLCAD_OK; -} - - -/** - * R T _ C O M B _ M A K E - * - * Create a blank combination with appropriate values. Called via - * rt_functab[ID_COMBINATION].ft_make(). - */ -void -rt_comb_make(const struct rt_functab *ftp __attribute__((unused)), struct rt_db_internal *intern) -{ - struct rt_comb_internal *comb; - - intern->idb_major_type = DB5_MAJORTYPE_BRLCAD; - intern->idb_type = ID_COMBINATION; - intern->idb_meth = &rt_functab[ID_COMBINATION]; - intern->idb_ptr = bu_calloc(sizeof(struct rt_comb_internal), 1, - "rt_comb_internal"); - - comb = (struct rt_comb_internal *)intern->idb_ptr; - comb->magic = (long)RT_COMB_MAGIC; - comb->temperature = -1; - comb->tree = (union tree *)0; - comb->region_flag = 1; - comb->region_id = 0; - comb->aircode = 0; - comb->GIFTmater = 0; - comb->los = 0; - comb->rgb_valid = 0; - comb->rgb[0] = comb->rgb[1] = comb->rgb[2] = 0; - bu_vls_init(&comb->shader); - bu_vls_init(&comb->material); - comb->inherit = 0; -} - - -/** * R T _ T C L _ S E T U P * * Add all the supported Tcl interfaces to LIBRT routines to the list This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <br...@us...> - 2010-02-25 22:42:52
|
Revision: 37783 http://brlcad.svn.sourceforge.net/brlcad/?rev=37783&view=rev Author: brlcad Date: 2010-02-25 22:42:40 +0000 (Thu, 25 Feb 2010) Log Message: ----------- quell more verbose warnings about paying attention to read/write return values. Modified Paths: -------------- brlcad/trunk/src/librt/db_scan.c brlcad/trunk/src/librt/vlist.c Modified: brlcad/trunk/src/librt/db_scan.c =================================================================== --- brlcad/trunk/src/librt/db_scan.c 2010-02-25 22:18:46 UTC (rev 37782) +++ brlcad/trunk/src/librt/db_scan.c 2010-02-25 22:42:40 UTC (rev 37783) @@ -146,25 +146,21 @@ nrec++; } next = ftell(dbip->dbi_fp); - handler( dbip, record.a.a_name, addr, nrec, - DIR_SOLID, client_data ); + handler( dbip, record.a.a_name, addr, nrec, DIR_SOLID, client_data ); break; case ID_ARS_B: bu_log("db_scan ERROR: Unattached ARS 'B' record\n"); break; case ID_SOLID: - handler( dbip, record.s.s_name, addr, nrec, - DIR_SOLID, client_data ); + handler( dbip, record.s.s_name, addr, nrec, DIR_SOLID, client_data ); break; case DBID_STRSOL: for (; nrec < DB_SS_NGRAN; nrec++ ) { - if ( fread( (char *)&rec2, sizeof(rec2), - 1, dbip->dbi_fp ) != 1 ) + if ( fread( (char *)&rec2, sizeof(rec2), 1, dbip->dbi_fp ) != 1 ) break; } next = ftell(dbip->dbi_fp); - handler( dbip, record.ss.ss_name, addr, nrec, - DIR_SOLID, client_data ); + handler( dbip, record.ss.ss_name, addr, nrec, DIR_SOLID, client_data ); break; case ID_MATERIAL: if ( do_old_matter ) { @@ -181,8 +177,7 @@ case ID_P_HEAD: while (1) { here = ftell( dbip->dbi_fp ); - if ( fread( (char *)&rec2, sizeof(rec2), - 1, dbip->dbi_fp ) != 1 ) + if ( fread( (char *)&rec2, sizeof(rec2), 1, dbip->dbi_fp ) != 1 ) break; DEBUG_PR( here, rec2 ); if ( rec2.u_id != ID_P_DATA ) { @@ -192,8 +187,7 @@ nrec++; } next = ftell(dbip->dbi_fp); - handler( dbip, record.p.p_name, addr, nrec, - DIR_SOLID, client_data ); + handler( dbip, record.p.p_name, addr, nrec, DIR_SOLID, client_data ); break; case ID_P_DATA: bu_log("db_scan ERROR: Unattached P_DATA record\n"); @@ -202,8 +196,7 @@ while (1) { /* Find and skip subsequent BSURFs */ here = ftell( dbip->dbi_fp ); - if ( fread( (char *)&rec2, sizeof(rec2), - 1, dbip->dbi_fp ) != 1 ) + if ( fread( (char *)&rec2, sizeof(rec2), 1, dbip->dbi_fp ) != 1 ) break; DEBUG_PR( here, rec2 ); if ( rec2.u_id != ID_BSURF ) { @@ -214,12 +207,13 @@ /* Just skip over knots and control mesh */ j = (rec2.d.d_nknots + rec2.d.d_nctls); nrec += j+1; - while ( j-- > 0 ) - fread( (char *)&rec2, sizeof(rec2), 1, dbip->dbi_fp ); + while ( j-- > 0 ) { + if (fread( (char *)&rec2, sizeof(rec2), 1, dbip->dbi_fp ) != 1) + break; + } next = ftell(dbip->dbi_fp); } - handler( dbip, record.B.B_name, addr, nrec, - DIR_SOLID, client_data ); + handler( dbip, record.B.B_name, addr, nrec, DIR_SOLID, client_data ); break; case ID_BSURF: bu_log("db_scan ERROR: Unattached B-spline surface record\n"); @@ -227,17 +221,20 @@ /* Just skip over knots and control mesh */ j = (record.d.d_nknots + record.d.d_nctls); nrec += j; - while ( j-- > 0 ) - fread( (char *)&rec2, sizeof(rec2), 1, dbip->dbi_fp ); + while ( j-- > 0 ) { + if (fread( (char *)&rec2, sizeof(rec2), 1, dbip->dbi_fp ) != 1) + break; + } break; case DBID_ARBN: j = bu_glong(record.n.n_grans); nrec += j; - while ( j-- > 0 ) - fread( (char *)&rec2, sizeof(rec2), 1, dbip->dbi_fp ); + while ( j-- > 0 ) { + if (fread( (char *)&rec2, sizeof(rec2), 1, dbip->dbi_fp ) != 1) + break; + } next = ftell(dbip->dbi_fp); - handler( dbip, record.n.n_name, addr, nrec, - DIR_SOLID, client_data ); + handler( dbip, record.n.n_name, addr, nrec, DIR_SOLID, client_data ); break; case DBID_PARTICLE: handler( dbip, record.part.p_name, addr, nrec, @@ -246,51 +243,55 @@ case DBID_PIPE: j = bu_glong(record.pwr.pwr_count); nrec += j; - while ( j-- > 0 ) - fread( (char *)&rec2, sizeof(rec2), 1, dbip->dbi_fp ); + while ( j-- > 0 ) { + if (fread( (char *)&rec2, sizeof(rec2), 1, dbip->dbi_fp ) != 1) + break; + } next = ftell(dbip->dbi_fp); - handler( dbip, record.pwr.pwr_name, addr, nrec, - DIR_SOLID, client_data ); + handler( dbip, record.pwr.pwr_name, addr, nrec, DIR_SOLID, client_data ); break; case DBID_NMG: j = bu_glong(record.nmg.N_count); nrec += j; - while ( j-- > 0 ) - (void)fread( (char *)&rec2, sizeof(rec2), 1, dbip->dbi_fp ); + while ( j-- > 0 ) { + if (fread( (char *)&rec2, sizeof(rec2), 1, dbip->dbi_fp ) != 1) + break; + } next = ftell(dbip->dbi_fp); - handler( dbip, record.nmg.N_name, addr, nrec, - DIR_SOLID, client_data ); + handler( dbip, record.nmg.N_name, addr, nrec, DIR_SOLID, client_data ); break; case DBID_SKETCH: j = bu_glong(record.skt.skt_count); nrec += j; - while ( j-- > 0 ) - (void)fread( (char *)&rec2, sizeof(rec2), 1, dbip->dbi_fp ); + while ( j-- > 0 ) { + if (fread( (char *)&rec2, sizeof(rec2), 1, dbip->dbi_fp ) != 1) + break; + } next = ftell(dbip->dbi_fp); - handler( dbip, record.skt.skt_name, addr, nrec, - DIR_SOLID, client_data ); + handler( dbip, record.skt.skt_name, addr, nrec, DIR_SOLID, client_data ); break; case DBID_EXTR: j = bu_glong(record.extr.ex_count); nrec += j; - while ( j-- > 0 ) - (void)fread( (char *)&rec2, sizeof(rec2), 1, dbip->dbi_fp ); + while ( j-- > 0 ) { + if (fread( (char *)&rec2, sizeof(rec2), 1, dbip->dbi_fp ) != 1) + break; + } next = ftell(dbip->dbi_fp); - handler( dbip, record.extr.ex_name, addr, nrec, - DIR_SOLID, client_data ); + handler( dbip, record.extr.ex_name, addr, nrec, DIR_SOLID, client_data ); break; case DBID_CLINE: - handler( dbip, record.s.s_name, addr, nrec, - DIR_SOLID, client_data ); + handler( dbip, record.s.s_name, addr, nrec, DIR_SOLID, client_data ); break; case DBID_BOT: j = bu_glong( record.bot.bot_nrec ); nrec += j; - while ( j-- > 0 ) - (void)fread( (char *)&rec2, sizeof(rec2), 1, dbip->dbi_fp ); + while ( j-- > 0 ) { + if (fread( (char *)&rec2, sizeof(rec2), 1, dbip->dbi_fp ) != 1) + break; + } next = ftell(dbip->dbi_fp); - handler( dbip, record.s.s_name, addr, nrec, - DIR_SOLID, client_data ); + handler( dbip, record.s.s_name, addr, nrec, DIR_SOLID, client_data ); break; case ID_MEMB: bu_log("db_scan ERROR: Unattached combination MEMBER record\n"); @@ -298,8 +299,7 @@ case ID_COMB: while (1) { here = ftell( dbip->dbi_fp ); - if ( fread( (char *)&rec2, sizeof(rec2), - 1, dbip->dbi_fp ) != 1 ) + if ( fread( (char *)&rec2, sizeof(rec2), 1, dbip->dbi_fp ) != 1 ) break; DEBUG_PR( here, rec2 ); if ( rec2.u_id != ID_MEMB ) { @@ -320,8 +320,7 @@ j = DIR_COMB|DIR_REGION; break; } - handler( dbip, record.c.c_name, addr, nrec, j, - client_data ); + handler( dbip, record.c.c_name, addr, nrec, j, client_data ); break; default: bu_log("db_scan ERROR: bad record %c (0%o), addr=x%x\n", Modified: brlcad/trunk/src/librt/vlist.c =================================================================== --- brlcad/trunk/src/librt/vlist.c 2010-02-25 22:18:46 UTC (rev 37782) +++ brlcad/trunk/src/librt/vlist.c 2010-02-25 22:42:40 UTC (rev 37783) @@ -633,9 +633,10 @@ static void rt_uplot_get_args(FILE *fp, const struct uplot *up, char *carg, fastf_t *arg) { + int ret; int i, j; - int cc; - char inbuf[8]; + int cc = 0; + char inbuf[8] = {'\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0'}; for (i = 0; i < up->narg; i++) { switch (up->targ) { @@ -643,7 +644,9 @@ arg[i] = getshort(fp); break; case TIEEE: - fread(inbuf, 8, 1, fp); + ret = fread(inbuf, 8, 1, fp); + if (ret != 1) + bu_log("WARNING: uplot read failure\n"); ntohd((unsigned char *)&arg[i], (unsigned char *)inbuf, 1); break; @@ -670,22 +673,31 @@ static void rt_uplot_get_text_args(FILE *fp, const struct uplot *up, char *carg, fastf_t *arg) { - int i; - unsigned int tchar; + int ret; + int i = 0; + unsigned int tchar = 0; for (i = 0; i < up->narg; i++) { switch (up->targ) { case TSHORT: - fscanf(fp, "%lf", &arg[i]); + ret = fscanf(fp, "%lf", &arg[i]); + if (ret != 1) + bu_log("WARNING: uplot short input failure\n"); break; case TIEEE: - fscanf(fp, "%lf", &arg[i]); + ret = fscanf(fp, "%lf", &arg[i]); + if (ret != 1) + bu_log("WARNING: uplot floating point input failure\n"); break; case TSTRING: - fscanf(fp, "%256s\n", &carg[0]); + ret = fscanf(fp, "%256s\n", &carg[0]); + if (ret != 1) + bu_log("WARNING: uplot string input failure\n"); break; case TCHAR: - fscanf(fp, "%u", &tchar); + ret = fscanf(fp, "%u", &tchar); + if (ret != 1) + bu_log("WARNING: uplot character input failure\n"); if (tchar > 255) tchar = 255; carg[i] = tchar; arg[i] = 0; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <br...@us...> - 2010-03-02 06:26:06
|
Revision: 37824 http://brlcad.svn.sourceforge.net/brlcad/?rev=37824&view=rev Author: brlcad Date: 2010-03-02 06:26:00 +0000 (Tue, 02 Mar 2010) Log Message: ----------- rename comb.c to prcomb.c along with the binary respectively. alas, the name is way too generic, but the app is still an interesting (noinst) comparison binary tree printer. Modified Paths: -------------- brlcad/trunk/src/librt/Makefile.am Added Paths: ----------- brlcad/trunk/src/librt/prcomb.c Removed Paths: ------------- brlcad/trunk/src/librt/comb.c Modified: brlcad/trunk/src/librt/Makefile.am =================================================================== --- brlcad/trunk/src/librt/Makefile.am 2010-03-02 00:07:06 UTC (rev 37823) +++ brlcad/trunk/src/librt/Makefile.am 2010-03-02 06:26:00 UTC (rev 37824) @@ -230,8 +230,8 @@ librt_nil.la \ ${RT_LIBS} -comb_SOURCES = comb.c -comb_LDADD = \ +prcomb_SOURCES = prcomb.c +prcomb_LDADD = \ librt.la \ ${RT_LIBS} Deleted: brlcad/trunk/src/librt/comb.c =================================================================== --- brlcad/trunk/src/librt/comb.c 2010-03-02 00:07:06 UTC (rev 37823) +++ brlcad/trunk/src/librt/comb.c 2010-03-02 06:26:00 UTC (rev 37824) @@ -1,164 +0,0 @@ -/* C O M B . C - * BRL-CAD - * - * Copyright (c) 1996-2010 United States Government as represented by - * the U.S. Army Research Laboratory. - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public License - * version 2.1 as published by the Free Software Foundation. - * - * This library is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this file; see the file named COPYING for more - * information. - */ -/** @addtogroup dbio */ -/** @{ */ -/** @file comb.c - * - * XXX Move to db_tree.c when complete. - * - */ -/** @} */ - -#include "common.h" - -#include <stdlib.h> -#include <stdio.h> -#include <math.h> -#include <string.h> - -#include "bu.h" -#include "vmath.h" -#include "bn.h" -#include "rtgeom.h" -#include "raytrace.h" - - -/* --- Begin John's pretty-printer --- */ - -void -Print_tree(union tree *tree) -{ - char *str; - - str = (char *)rt_pr_tree_str(tree); - if (str != NULL) { - printf("%s\n", str); - bu_free(str, "Print_tree"); - } else - printf("NULL Tree\n"); -} - - -int -main(int argc, char *argv[]) -{ - struct db_i *dbip; - struct directory *dp; - struct rt_db_internal ip; - struct rt_comb_internal *comb; - mat_t identity_mat; - int i; - struct bu_vls file; - - bu_debug = BU_DEBUG_MEM_CHECK | BU_DEBUG_COREDUMP; - - if (argc < 3) { - fprintf(stderr, "Usage:\n\t%s db_file object1 object2 ...\n", argv[0]); - return 1; - } - - MAT_IDN(identity_mat); - bu_vls_init(&file); - - if ((dbip = db_open(argv[1], "r")) == NULL) { - fprintf(stderr, "Cannot open %s\n", argv[1]); - perror("test"); - return 1; - } - - rt_init_resource(&rt_uniresource, 0, NULL); - - /* Scan the database */ - db_dirbuild(dbip); - - for (i=2; i<argc; i++) { - printf("%s\n", argv[i]); - - dp = db_lookup(dbip, argv[i], 1); - if (!dp) { - bu_log("WARNING: Unable to locate %s in %s, skipping\n", argv[i], argv[1]); - continue; - } - - if (rt_db_get_internal(&ip, dp, dbip, NULL, &rt_uniresource) < 0) { - bu_log("import of %s failed\n", dp->d_namep); - continue; - } - - RT_CK_DB_INTERNAL(&ip); - bu_mem_barriercheck(); - - if (ip.idb_type != ID_COMBINATION) { - bu_log("idb_type = %d\n", ip.idb_type); - rt_db_free_internal(&ip); - continue; - } - - comb = (struct rt_comb_internal *)ip.idb_ptr; - RT_CK_COMB(comb); - if (comb->region_flag) { - bu_log("\tRegion id = %d, aircode = %d GIFTmater = %d, los = %d\n", - comb->region_id, comb->aircode, comb->GIFTmater, comb->los); - } - bu_log("\trgb_valid = %d, color = %d/%d/%d\n", comb->rgb_valid, V3ARGS(comb->rgb)); - bu_log("\tshader = %s (%s)\n" , - bu_vls_addr(&comb->shader), - bu_vls_addr(&comb->material) - ); - - /* John's way */ - bu_log("Pretty print:\n"); - Print_tree(comb->tree); - - /* Standard way */ - bu_log("Standard print:\n"); - rt_pr_tree(comb->tree, 1); - - /* Compact way */ - { - struct bu_vls str; - bu_vls_init(&str); - rt_pr_tree_vls(&str, comb->tree); - bu_log("%s\n", bu_vls_addr(&str)); - bu_vls_free(&str); - } - - /* Test the support routines */ - if (db_ck_v4gift_tree(comb->tree) < 0) - bu_log("ERROR: db_ck_v4gift_tree is unhappy\n"); - - /* Test the lumberjacks */ - rt_db_free_internal(&ip); - - } - - return 0; -} - - -/* - * Local Variables: - * mode: C - * tab-width: 8 - * indent-tabs-mode: t - * c-file-style: "stroustrup" - * End: - * ex: shiftwidth=4 tabstop=8 - */ Copied: brlcad/trunk/src/librt/prcomb.c (from rev 37823, brlcad/trunk/src/librt/comb.c) =================================================================== --- brlcad/trunk/src/librt/prcomb.c (rev 0) +++ brlcad/trunk/src/librt/prcomb.c 2010-03-02 06:26:00 UTC (rev 37824) @@ -0,0 +1,164 @@ +/* C O M B . C + * BRL-CAD + * + * Copyright (c) 1996-2010 United States Government as represented by + * the U.S. Army Research Laboratory. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public License + * version 2.1 as published by the Free Software Foundation. + * + * This library is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this file; see the file named COPYING for more + * information. + */ +/** @addtogroup dbio */ +/** @{ */ +/** @file comb.c + * + * XXX Move to db_tree.c when complete. + * + */ +/** @} */ + +#include "common.h" + +#include <stdlib.h> +#include <stdio.h> +#include <math.h> +#include <string.h> + +#include "bu.h" +#include "vmath.h" +#include "bn.h" +#include "rtgeom.h" +#include "raytrace.h" + + +/* --- Begin John's pretty-printer --- */ + +void +Print_tree(union tree *tree) +{ + char *str; + + str = (char *)rt_pr_tree_str(tree); + if (str != NULL) { + printf("%s\n", str); + bu_free(str, "Print_tree"); + } else + printf("NULL Tree\n"); +} + + +int +main(int argc, char *argv[]) +{ + struct db_i *dbip; + struct directory *dp; + struct rt_db_internal ip; + struct rt_comb_internal *comb; + mat_t identity_mat; + int i; + struct bu_vls file; + + bu_debug = BU_DEBUG_MEM_CHECK | BU_DEBUG_COREDUMP; + + if (argc < 3) { + fprintf(stderr, "Usage:\n\t%s db_file object1 object2 ...\n", argv[0]); + return 1; + } + + MAT_IDN(identity_mat); + bu_vls_init(&file); + + if ((dbip = db_open(argv[1], "r")) == NULL) { + fprintf(stderr, "Cannot open %s\n", argv[1]); + perror("test"); + return 1; + } + + rt_init_resource(&rt_uniresource, 0, NULL); + + /* Scan the database */ + db_dirbuild(dbip); + + for (i=2; i<argc; i++) { + printf("%s\n", argv[i]); + + dp = db_lookup(dbip, argv[i], 1); + if (!dp) { + bu_log("WARNING: Unable to locate %s in %s, skipping\n", argv[i], argv[1]); + continue; + } + + if (rt_db_get_internal(&ip, dp, dbip, NULL, &rt_uniresource) < 0) { + bu_log("import of %s failed\n", dp->d_namep); + continue; + } + + RT_CK_DB_INTERNAL(&ip); + bu_mem_barriercheck(); + + if (ip.idb_type != ID_COMBINATION) { + bu_log("idb_type = %d\n", ip.idb_type); + rt_db_free_internal(&ip); + continue; + } + + comb = (struct rt_comb_internal *)ip.idb_ptr; + RT_CK_COMB(comb); + if (comb->region_flag) { + bu_log("\tRegion id = %d, aircode = %d GIFTmater = %d, los = %d\n", + comb->region_id, comb->aircode, comb->GIFTmater, comb->los); + } + bu_log("\trgb_valid = %d, color = %d/%d/%d\n", comb->rgb_valid, V3ARGS(comb->rgb)); + bu_log("\tshader = %s (%s)\n" , + bu_vls_addr(&comb->shader), + bu_vls_addr(&comb->material) + ); + + /* John's way */ + bu_log("Pretty print:\n"); + Print_tree(comb->tree); + + /* Standard way */ + bu_log("Standard print:\n"); + rt_pr_tree(comb->tree, 1); + + /* Compact way */ + { + struct bu_vls str; + bu_vls_init(&str); + rt_pr_tree_vls(&str, comb->tree); + bu_log("%s\n", bu_vls_addr(&str)); + bu_vls_free(&str); + } + + /* Test the support routines */ + if (db_ck_v4gift_tree(comb->tree) < 0) + bu_log("ERROR: db_ck_v4gift_tree is unhappy\n"); + + /* Test the lumberjacks */ + rt_db_free_internal(&ip); + + } + + return 0; +} + + +/* + * Local Variables: + * mode: C + * tab-width: 8 + * indent-tabs-mode: t + * c-file-style: "stroustrup" + * End: + * ex: shiftwidth=4 tabstop=8 + */ This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <br...@us...> - 2010-03-02 06:32:33
|
Revision: 37826 http://brlcad.svn.sourceforge.net/brlcad/?rev=37826&view=rev Author: brlcad Date: 2010-03-02 06:32:26 +0000 (Tue, 02 Mar 2010) Log Message: ----------- move most of the comb-specific routines into their own subdirectory (the idea being for consistency, to have each non-primitive object have it's own subdir) Modified Paths: -------------- brlcad/trunk/src/librt/CMakeLists.txt brlcad/trunk/src/librt/Makefile.am Added Paths: ----------- brlcad/trunk/src/librt/comb/ brlcad/trunk/src/librt/comb/comb_mirror.c brlcad/trunk/src/librt/comb/db5_comb.c brlcad/trunk/src/librt/comb/db_comb.c Removed Paths: ------------- brlcad/trunk/src/librt/comb_mirror.c brlcad/trunk/src/librt/db5_comb.c brlcad/trunk/src/librt/db_comb.c Modified: brlcad/trunk/src/librt/CMakeLists.txt =================================================================== --- brlcad/trunk/src/librt/CMakeLists.txt 2010-03-02 06:26:22 UTC (rev 37825) +++ brlcad/trunk/src/librt/CMakeLists.txt 2010-03-02 06:32:26 UTC (rev 37826) @@ -5,18 +5,18 @@ bool.c bundle.c cmd.c - comb_mirror.c + comb/comb_mirror.c + comb/db5_comb.c + comb/db_comb.c constraint.c cut.c db5_alloc.c db5_bin.c - db5_comb.c db5_io.c db5_scan.c db5_types.c db_alloc.c db_anim.c - db_comb.c db_flags.c db_inmem.c db_io.c Modified: brlcad/trunk/src/librt/Makefile.am =================================================================== --- brlcad/trunk/src/librt/Makefile.am 2010-03-02 06:26:22 UTC (rev 37825) +++ brlcad/trunk/src/librt/Makefile.am 2010-03-02 06:32:26 UTC (rev 37826) @@ -39,18 +39,18 @@ bool.c \ bundle.c \ cmd.c \ - comb_mirror.c \ + comb/comb_mirror.c \ constraint.c \ cut.c \ db5_alloc.c \ db5_bin.c \ - db5_comb.c \ + comb/db5_comb.c \ db5_io.c \ db5_scan.c \ db5_types.c \ db_alloc.c \ db_anim.c \ - db_comb.c \ + comb/db_comb.c \ db_flags.c \ db_inmem.c \ db_io.c \ Copied: brlcad/trunk/src/librt/comb/comb_mirror.c (from rev 37823, brlcad/trunk/src/librt/comb_mirror.c) =================================================================== --- brlcad/trunk/src/librt/comb/comb_mirror.c (rev 0) +++ brlcad/trunk/src/librt/comb/comb_mirror.c 2010-03-02 06:32:26 UTC (rev 37826) @@ -0,0 +1,99 @@ +/* C O M B _ M I R R O R . C + * BRL-CAD + * + * Copyright (c) 2009-2010 United States Government as represented by + * the U.S. Army Research Laboratory. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public License + * version 2.1 as published by the Free Software Foundation. + * + * This library is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this file; see the file named COPYING for more + * information. + */ +/** @file comb_mirror.c + * + * mirror support + * + */ + +#include "common.h" + +#include "raytrace.h" +#include "rtgeom.h" + + +/** + * R T _ C O M B _ M I R R O R + * + * Given a pointer to an internal GED database object, mirror the + * object's values about the given transformation matrix. + */ +int +rt_comb_mirror(struct rt_db_internal *ip, register const plane_t plane) +{ + struct rt_comb_internal *comb; + + mat_t mirmat; + mat_t rmat; + mat_t temp; + vect_t nvec; + vect_t xvec; + vect_t mirror_dir; + point_t mirror_pt; + fastf_t ang; + + static point_t origin = {0.0, 0.0, 0.0}; + + RT_CK_DB_INTERNAL(ip); + + comb = (struct rt_comb_internal *)ip->idb_ptr; + RT_CK_COMB(comb); + + MAT_IDN(mirmat); + + VMOVE(mirror_dir, plane); + VSCALE(mirror_pt, plane, plane[W]); + + /* Build mirror transform matrix, for those who need it. */ + /* First, perform a mirror down the X axis */ + mirmat[0] = -1.0; + + /* Create the rotation matrix */ + VSET(xvec, 1, 0, 0); + VCROSS(nvec, xvec, mirror_dir); + VUNITIZE(nvec); + ang = -acos(VDOT(xvec, mirror_dir)); + bn_mat_arb_rot(rmat, origin, nvec, ang*2.0); + + /* Add the rotation to mirmat */ + MAT_COPY(temp, mirmat); + bn_mat_mul(mirmat, temp, rmat); + + /* Add the translation to mirmat */ + mirmat[3 + X*4] += mirror_pt[X] * mirror_dir[X]; + mirmat[3 + Y*4] += mirror_pt[Y] * mirror_dir[Y]; + mirmat[3 + Z*4] += mirror_pt[Z] * mirror_dir[Z]; + + if (comb->tree) { + db_tree_mul_dbleaf(comb->tree, mirmat); + } + + return 0; +} + +/* + * Local Variables: + * tab-width: 8 + * mode: C + * indent-tabs-mode: t + * c-file-style: "stroustrup" + * End: + * ex: shiftwidth=4 tabstop=8 + */ Copied: brlcad/trunk/src/librt/comb/db5_comb.c (from rev 37823, brlcad/trunk/src/librt/db5_comb.c) =================================================================== --- brlcad/trunk/src/librt/comb/db5_comb.c (rev 0) +++ brlcad/trunk/src/librt/comb/db5_comb.c 2010-03-02 06:32:26 UTC (rev 37826) @@ -0,0 +1,1120 @@ +/* D B 5 _ C O M B . C + * BRL-CAD + * + * Copyright (c) 2004-2010 United States Government as represented by + * the U.S. Army Research Laboratory. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public License + * version 2.1 as published by the Free Software Foundation. + * + * This library is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this file; see the file named COPYING for more + * information. + */ +/** @addtogroup db5 */ +/** @{ */ +/** @file db5_comb.c + * + * Implement support for combinations in v5 format. + * + * The on-disk record looks like this: + * width byte + * n matricies (only non-identity matricies stored). + * n leaves + * len of RPN expression. (len=0 signals all-union expression) + * depth of stack + * Section 1: matricies + * Section 2: leaves + * Section 3: (Optional) RPN expression. + * + * Encoding of a matrix is (ELEMENTS_PER_MAT * SIZEOF_NETWORK_DOUBLE) + * bytes, in network order (big-Endian, IEEE double precision). + * + */ +/** @} */ + +#include "common.h" + +#include <stdlib.h> +#include <stdio.h> +#include <string.h> +#include <ctype.h> +#include "bio.h" + +#include "bu.h" +#include "vmath.h" +#include "bn.h" +#include "db5.h" +#include "raytrace.h" + + +struct db_tree_counter_state { + long magic; + long n_mat; /* # leaves with non-identity matricies */ + long n_leaf; /* # leaf nodes */ + long n_oper; /* # operator nodes */ + long leafbytes; /* # bytes for name section */ + int non_union_seen; /* boolean, 1 = non-unions seen */ +}; +#define DB_TREE_COUNTER_STATE_MAGIC 0x64546373 /* dTcs */ +#define DB_CK_TREE_COUNTER_STATE(_p) BU_CKMAG(_p, DB_TREE_COUNTER_STATE_MAGIC, "db_tree_counter_state"); + + +/** + * D B _ T R E E _ C O U N T E R + * + * Count number of non-identity matricies, + * number of leaf nodes, number of operator nodes, etc. + * + * Returns - + * maximum depth of stack needed to unpack this tree, if serialized. + * + * Notes - + * We over-estimate the size of the width fields used for + * holding the matrix subscripts. + * The caller is responsible for correcting by saying: + * tcsp->leafbytes -= tcsp->n_leaf * (8 - db5_enc_len[wid]); + */ +long +db_tree_counter( const union tree *tp, struct db_tree_counter_state *tcsp ) +{ + long ldepth, rdepth; + + RT_CK_TREE(tp); + DB_CK_TREE_COUNTER_STATE(tcsp); + + switch ( tp->tr_op ) { + case OP_DB_LEAF: + tcsp->n_leaf++; + if ( tp->tr_l.tl_mat && !bn_mat_is_identity(tp->tr_l.tl_mat) ) tcsp->n_mat++; + /* Over-estimate storage requirement for matrix # */ + tcsp->leafbytes += (long)strlen(tp->tr_l.tl_name) + 1 + 8; + return 1; + + case OP_NOT: + /* Unary ops */ + tcsp->n_oper++; + tcsp->non_union_seen = 1; + return 1 + db_tree_counter( tp->tr_b.tb_left, tcsp ); + + case OP_UNION: + /* This node is known to be a binary op */ + tcsp->n_oper++; + ldepth = db_tree_counter( tp->tr_b.tb_left, tcsp ); + rdepth = db_tree_counter( tp->tr_b.tb_right, tcsp ); + if ( ldepth > rdepth ) return ldepth; + return rdepth; + + case OP_INTERSECT: + case OP_SUBTRACT: + case OP_XOR: + /* This node is known to be a binary op */ + tcsp->n_oper++; + tcsp->non_union_seen = 1; + ldepth = db_tree_counter( tp->tr_b.tb_left, tcsp ); + rdepth = db_tree_counter( tp->tr_b.tb_right, tcsp ); + if ( ldepth > rdepth ) return ldepth; + return rdepth; + + default: + bu_log("db_tree_counter: bad op %d\n", tp->tr_op); + bu_bomb("db_tree_counter\n"); + /* NOTREACHED */ + } + /* NOTREACHED */ + return 0; +} + +#define DB5COMB_TOKEN_LEAF 1 +#define DB5COMB_TOKEN_UNION 2 +#define DB5COMB_TOKEN_INTERSECT 3 +#define DB5COMB_TOKEN_SUBTRACT 4 +#define DB5COMB_TOKEN_XOR 5 +#define DB5COMB_TOKEN_NOT 6 + +struct rt_comb_v5_serialize_state { + long magic; + long mat_num; /* current matrix number */ + long nmat; /* # matricies, total */ + unsigned char *matp; + unsigned char *leafp; + unsigned char *exprp; + int wid; +}; +#define RT_COMB_V5_SERIALIZE_STATE_MAGIC 0x43357373 /* C5ss */ +#define RT_CK_COMB_V5_SERIALIZE_STATE(_p) BU_CKMAG(_p, RT_COMB_V5_SERIALIZE_STATE_MAGIC, "rt_comb_v5_serialize_state") + + +/** + * R T _ C O M B _ V 5 _ S E R I A L I Z E + * + * In one single pass through the tree, serialize out all three output + * sections at once. + */ +void +rt_comb_v5_serialize( + const union tree *tp, + struct rt_comb_v5_serialize_state *ssp) +{ + size_t n; + int mi; + + RT_CK_TREE(tp); + RT_CK_COMB_V5_SERIALIZE_STATE(ssp); + + switch ( tp->tr_op ) { + case OP_DB_LEAF: + /* + * Encoding of the leaf: A null-terminated name string, + *and the matrix subscript. -1 == identity. + */ + n = strlen(tp->tr_l.tl_name) + 1; + memcpy(ssp->leafp, tp->tr_l.tl_name, n); + ssp->leafp += n; + + if ( tp->tr_l.tl_mat && !bn_mat_is_identity(tp->tr_l.tl_mat) ) + mi = ssp->mat_num++; + else + mi = -1; + BU_ASSERT_LONG( mi, <, ssp->nmat ); + ssp->leafp = db5_encode_length( ssp->leafp, mi, ssp->wid ); + + /* Encoding of the matrix */ + if ( mi > -1 ) { + htond( ssp->matp, + (const unsigned char *)tp->tr_l.tl_mat, + ELEMENTS_PER_MAT ); + ssp->matp += ELEMENTS_PER_MAT * SIZEOF_NETWORK_DOUBLE; + } + + /* Encoding of the "leaf" operator */ + if ( ssp->exprp ) + *ssp->exprp++ = DB5COMB_TOKEN_LEAF; + return; + + case OP_NOT: + /* Unary ops */ + rt_comb_v5_serialize( tp->tr_b.tb_left, ssp ); + if ( ssp->exprp ) + *ssp->exprp++ = DB5COMB_TOKEN_NOT; + return; + + case OP_UNION: + /* This node is known to be a binary op */ + rt_comb_v5_serialize( tp->tr_b.tb_left, ssp ); + rt_comb_v5_serialize( tp->tr_b.tb_right, ssp ); + if ( ssp->exprp ) + *ssp->exprp++ = DB5COMB_TOKEN_UNION; + return; + case OP_INTERSECT: + /* This node is known to be a binary op */ + rt_comb_v5_serialize( tp->tr_b.tb_left, ssp ); + rt_comb_v5_serialize( tp->tr_b.tb_right, ssp ); + if ( ssp->exprp ) + *ssp->exprp++ = DB5COMB_TOKEN_INTERSECT; + return; + case OP_SUBTRACT: + /* This node is known to be a binary op */ + rt_comb_v5_serialize( tp->tr_b.tb_left, ssp ); + rt_comb_v5_serialize( tp->tr_b.tb_right, ssp ); + if ( ssp->exprp ) + *ssp->exprp++ = DB5COMB_TOKEN_SUBTRACT; + return; + case OP_XOR: + /* This node is known to be a binary op */ + rt_comb_v5_serialize( tp->tr_b.tb_left, ssp ); + rt_comb_v5_serialize( tp->tr_b.tb_right, ssp ); + if ( ssp->exprp ) + *ssp->exprp++ = DB5COMB_TOKEN_XOR; + return; + + default: + bu_log("rt_comb_v5_serialize: bad op %d\n", tp->tr_op); + bu_bomb("rt_comb_v5_serialize\n"); + } +} + + +/** + * R T _ C O M B _ E X P O R T 5 + */ +int +rt_comb_export5( + struct bu_external *ep, + const struct rt_db_internal *ip, + double local2mm __attribute__((unused)), + const struct db_i *dbip, + struct resource *resp) +{ + struct rt_comb_internal *comb; + struct db_tree_counter_state tcs; + struct rt_comb_v5_serialize_state ss; + long max_stack_depth; + long need; + int rpn_len = 0; /* # items in RPN expression */ + int wid; + unsigned char *cp; + unsigned char *leafp_end; + struct bu_attribute_value_set *avsp; + struct bu_vls value; + + RT_CK_DB_INTERNAL( ip ); + RT_CK_RESOURCE(resp); + if (dbip) RT_CK_DBI(dbip); + + if ( ip->idb_type != ID_COMBINATION ) bu_bomb("rt_comb_export5() type not ID_COMBINATION"); + comb = (struct rt_comb_internal *)ip->idb_ptr; + RT_CK_COMB(comb); + + /* First pass -- count number of non-identity matricies, number of + * leaf nodes, number of operator nodes. + */ + memset((char *)&tcs, 0, sizeof(tcs)); + tcs.magic = DB_TREE_COUNTER_STATE_MAGIC; + if ( comb->tree ) + max_stack_depth = db_tree_counter( comb->tree, &tcs ); + else + max_stack_depth = 0; /* some combinations have no tree */ + + if ( tcs.non_union_seen ) { + /* RPN expression needs one byte for each leaf or operator node */ + rpn_len = tcs.n_leaf + tcs.n_oper; + } else { + rpn_len = 0; + } + + wid = db5_select_length_encoding( + tcs.n_mat | tcs.n_leaf | tcs.leafbytes | + rpn_len | max_stack_depth ); + + /* Apply correction factor to tcs.leafbytes now that we know + * 'wid'. Ignore the slight chance that a smaller 'wid' might now + * be possible. + */ + tcs.leafbytes -= tcs.n_leaf * (8 - db5_enc_len[wid]); + + /* Second pass -- determine amount of on-disk storage needed */ + need = 1 + /* width code */ + db5_enc_len[wid] + /* size for nmatricies */ + db5_enc_len[wid] + /* size for nleaves */ + db5_enc_len[wid] + /* size for leafbytes */ + db5_enc_len[wid] + /* size for len of RPN */ + db5_enc_len[wid] + /* size for max_stack_depth */ + tcs.n_mat * (ELEMENTS_PER_MAT * SIZEOF_NETWORK_DOUBLE) + /* sizeof matrix array */ + tcs.leafbytes + /* size for leaf nodes */ + rpn_len; /* storage for RPN expression */ + + BU_INIT_EXTERNAL(ep); + ep->ext_nbytes = need; + ep->ext_buf = bu_calloc( 1, need, "rt_comb_export5 ext_buf" ); + + /* Build combination's on-disk header section */ + cp = (unsigned char *)ep->ext_buf; + *cp++ = wid; + cp = db5_encode_length( cp, tcs.n_mat, wid ); + cp = db5_encode_length( cp, tcs.n_leaf, wid ); + cp = db5_encode_length( cp, tcs.leafbytes, wid ); + cp = db5_encode_length( cp, rpn_len, wid ); + cp = db5_encode_length( cp, max_stack_depth, wid ); + + /* + * The output format has three sections: + * Section 1: matricies + * Section 2: leaf nodes + * Section 3: Optional RPN expression + * + * We have pre-computed the exact size of all three sections, so + * they can all be searialized together in one pass. Establish + * pointers to the start of each section. + */ + ss.magic = RT_COMB_V5_SERIALIZE_STATE_MAGIC; + ss.wid = wid; + ss.mat_num = 0; + ss.nmat = tcs.n_mat; + ss.matp = cp; + ss.leafp = cp + tcs.n_mat * (ELEMENTS_PER_MAT * SIZEOF_NETWORK_DOUBLE); + leafp_end = ss.leafp + tcs.leafbytes; + if ( rpn_len ) + ss.exprp = leafp_end; + else + ss.exprp = NULL; + + if ( comb->tree ) + rt_comb_v5_serialize( comb->tree, &ss ); + + BU_ASSERT_LONG( ss.mat_num, ==, tcs.n_mat ); + BU_ASSERT_PTR( ss.matp, ==, cp + tcs.n_mat * (ELEMENTS_PER_MAT * SIZEOF_NETWORK_DOUBLE) ); + BU_ASSERT_PTR( ss.leafp, ==, leafp_end ); + if ( rpn_len ) + BU_ASSERT_PTR( ss.exprp, <=, ((unsigned char *)ep->ext_buf) + ep->ext_nbytes ); + + /* Encode all the other stuff as attributes. */ + bu_vls_init( &value ); + /* WARNING: We remove const from the ip pointer!!! */ + avsp = (struct bu_attribute_value_set *)&ip->idb_avs; + if ( avsp->magic != BU_AVS_MAGIC ) + bu_avs_init( avsp, 32, "rt_comb v5 attributes" ); + if ( comb->region_flag ) { + /* Presence of this attribute means this comb is a region. + * Current code values are 0, 1, and 2; all are regions. See + * raytrace.h for meanings of different values + */ + bu_vls_trunc( &value, 0 ); + switch (comb->is_fastgen) { + case REGION_FASTGEN_PLATE: + bu_vls_printf(&value, "P"); + break; + case REGION_FASTGEN_VOLUME: + bu_vls_printf(&value, "V"); + break; + case REGION_NON_FASTGEN: /* fallthrough */ + default: + bu_vls_printf(&value, "R"); + break; + } + bu_avs_add_vls( avsp, "region", &value ); + } else + bu_avs_remove( avsp, "region" ); + + if ( comb->inherit ) + bu_avs_add( avsp, "inherit", "1" ); + else + bu_avs_remove( avsp, "inherit" ); + + if ( comb->rgb_valid ) { + bu_vls_trunc( &value, 0 ); + bu_vls_printf( &value, "%d/%d/%d", V3ARGS(comb->rgb) ); + bu_avs_add_vls( avsp, "rgb", &value ); + } else + bu_avs_remove( avsp, "rgb" ); + + /* optical shader string goes in an attribute */ + if ( bu_vls_strlen( &comb->shader ) > 0 ) + bu_avs_add_vls( avsp, "oshader", &comb->shader ); + else + bu_avs_remove( avsp, "oshader" ); + + /* GIFT compatability */ + if ( comb->region_id != 0 ) { + bu_vls_trunc( &value, 0 ); + bu_vls_printf( &value, "%d", comb->region_id ); + bu_avs_add_vls( avsp, "region_id", &value ); + } else + bu_avs_remove( avsp, "region_id" ); + + if ( comb->aircode != 0 ) { + bu_vls_trunc( &value, 0 ); + bu_vls_printf( &value, "%d", comb->aircode ); + bu_avs_add_vls( avsp, "aircode", &value ); + } else + bu_avs_remove( avsp, "aircode" ); + + if ( comb->GIFTmater != 0 ) { + bu_vls_trunc( &value, 0 ); + bu_vls_printf( &value, "%d", comb->GIFTmater ); + bu_avs_add_vls( avsp, "material_id", &value ); + } else + bu_avs_remove( avsp, "material_id" ); + + if ( comb->los != 0 ) { + bu_vls_trunc( &value, 0 ); + bu_vls_printf( &value, "%d", comb->los ); + bu_avs_add_vls( avsp, "los", &value ); + } else + bu_avs_remove( avsp, "los" ); + + bu_vls_free( &value ); + return 0; /* OK */ +} + + +/** + * R T _ C O M B _ I M P O R T 5 + * + * Read a combination object in v5 external (on-disk) format, and + * convert it into the internal format described in rtgeom.h + * + * This is an unusual conversion, because some of the data is taken + * from attributes, not just from the object body. By the time this + * is called, the attributes will already have been cracked into + * ip->idb_avs, we get the attributes from there. + * + * Returns - + * 0 OK + * -1 FAIL + */ +int +rt_comb_import5(struct rt_db_internal *ip, const struct bu_external *ep, const mat_t mat, const struct db_i *dbip, struct resource *resp) +{ + struct rt_comb_internal *comb; + unsigned char *cp; + int wid; + size_t nmat, nleaf, rpn_len, max_stack_depth; + size_t leafbytes; + unsigned char *matp; + unsigned char *leafp; + unsigned char *leafp_end; + unsigned char *exprp; +#define MAX_V5_STACK 8000 + union tree *stack[MAX_V5_STACK]; + union tree **sp; /* stack pointer */ + const char *ap; + size_t ius; + + RT_CK_DB_INTERNAL( ip ); + BU_CK_EXTERNAL(ep); + RT_CK_DBI(dbip); + RT_CK_RESOURCE(resp); + + ip->idb_major_type = DB5_MAJORTYPE_BRLCAD; + ip->idb_type = ID_COMBINATION; + ip->idb_meth = &rt_functab[ID_COMBINATION]; + BU_GETSTRUCT( comb, rt_comb_internal ); + ip->idb_ptr = (genptr_t)comb; + comb->magic = RT_COMB_MAGIC; + bu_vls_init( &comb->shader ); + bu_vls_init( &comb->material ); + comb->temperature = -1; + + cp = ep->ext_buf; + wid = *cp++; + cp += db5_decode_length( &nmat, cp, wid ); + cp += db5_decode_length( &nleaf, cp, wid ); + cp += db5_decode_length( &leafbytes, cp, wid ); + cp += db5_decode_length( &rpn_len, cp, wid ); + cp += db5_decode_length( &max_stack_depth, cp, wid ); + matp = cp; + leafp = cp + nmat * (ELEMENTS_PER_MAT * SIZEOF_NETWORK_DOUBLE); + exprp = leafp + leafbytes; + leafp_end = exprp; + + if ( rpn_len == 0 ) { + ssize_t is; + + /* This tree is all union operators, import it as a balanced tree */ + struct bu_ptbl *tbl1, *tbl2; + + tbl1 = (struct bu_ptbl *)bu_malloc( sizeof( struct bu_ptbl ), "rt_comb_import5: tbl1" ); + tbl2 = (struct bu_ptbl *)bu_malloc( sizeof( struct bu_ptbl ), "rt_comb_import5: tbl2" ); + + /* insert all the leaf nodes into a bu_ptbl */ + bu_ptbl_init( tbl1, nleaf, "rt_comb_import5: tbl" ); + for (is = nleaf-1; is >= 0; is-- ) { + union tree *tp; + size_t mi; + + RT_GET_TREE( tp, resp ); + tp->tr_l.magic = RT_TREE_MAGIC; + tp->tr_l.tl_op = OP_DB_LEAF; + tp->tr_l.tl_name = bu_strdup( (const char *)leafp ); + leafp += strlen( (const char *)leafp) + 1; + + /* Get matrix index */ + mi = 4095; /* sanity */ + leafp += db5_decode_signed( &mi, leafp, wid ); + + if ( (ssize_t)mi < 0 ) { + /* Signal identity matrix */ + if ( !mat || bn_mat_is_identity( mat ) ) { + tp->tr_l.tl_mat = (matp_t)NULL; + } else + tp->tr_l.tl_mat = bn_mat_dup( mat ); + } else { + mat_t diskmat; + + /* Unpack indicated matrix mi */ + BU_ASSERT_LONG( mi, <, nmat ); + ntohd( (unsigned char *)diskmat, + &matp[mi*ELEMENTS_PER_MAT*SIZEOF_NETWORK_DOUBLE], + ELEMENTS_PER_MAT); + if ( !mat || bn_mat_is_identity( mat ) ) { + tp->tr_l.tl_mat = bn_mat_dup( diskmat ); + } else { + tp->tr_l.tl_mat = (matp_t)bu_malloc( + sizeof(mat_t), "v5comb mat"); + bn_mat_mul( tp->tr_l.tl_mat, mat, diskmat ); + if ( bn_mat_is_identity( tp->tr_l.tl_mat ) ) { + bu_free( (char *)tp->tr_l.tl_mat, "tl_mat"); + tp->tr_l.tl_mat = (matp_t)NULL; + } + } + } + bu_ptbl_ins( tbl1, (long *)tp ); + } + + /* use a second bu_ptbl to help build a balanced tree + * 1 - pick off pairs of pointers from tbl1 + * 2 - make a small tree thats unions the pair + * 3 - insert that tree into tbl2 + * 4 - insert any leftover pointer from tbl1 into tbl2 + * 5 - swap tbl1 and tbl2 + * 6 - truncate tbl2 and go to step 1 + * stop when tbl2 has less than 2 members + */ + bu_ptbl_init( tbl2, (BU_PTBL_LEN( tbl1) + 1)/2, "rt_comb_import5: tbl1" ); + while ( 1 ) { + struct bu_ptbl *tmp; + + for ( is=0; is<BU_PTBL_LEN( tbl1 ); is += 2 ) { + union tree *tp1, *tp2, *unionp; + int j; + + j = is + 1; + tp1 = (union tree *)BU_PTBL_GET( tbl1, is ); + if ( j < BU_PTBL_LEN( tbl1 ) ) { + tp2 = (union tree *)BU_PTBL_GET( tbl1, j ); + } else { + tp2 = (union tree *)NULL; + } + + if ( tp2 ) { + RT_GET_TREE( unionp, resp ); + unionp->tr_b.magic = RT_TREE_MAGIC; + unionp->tr_b.tb_op = OP_UNION; + unionp->tr_b.tb_left = tp1; + unionp->tr_b.tb_right = tp2; + bu_ptbl_ins( tbl2, (long *)unionp ); + } else { + bu_ptbl_ins( tbl2, (long *)tp1 ); + } + + } + + if ( BU_PTBL_LEN( tbl2 ) == 0 ) { + comb->tree = (union tree *)NULL; + bu_ptbl_free( tbl1 ); + bu_ptbl_free( tbl2 ); + bu_free( (char *)tbl1, "rt_comb_import5: tbl1" ); + bu_free( (char *)tbl2, "rt_comb_import5: tbl2" ); + break; + } else if ( BU_PTBL_LEN( tbl2 ) == 1 ) { + comb->tree = (union tree *)BU_PTBL_GET( tbl2, 0 ); + bu_ptbl_free( tbl1 ); + bu_ptbl_free( tbl2 ); + bu_free( (char *)tbl1, "rt_comb_import5: tbl1" ); + bu_free( (char *)tbl2, "rt_comb_import5: tbl2" ); + break; + } + + tmp = tbl2; + tbl2 = tbl1; + tbl1 = tmp; + bu_ptbl_trunc( tbl2, 0 ); + } + BU_ASSERT_PTR( leafp, ==, leafp_end ); + goto finish; + } + + /* + * Bring the RPN expression back from the disk, populating leaves + * and matricies in the order they are encountered. + */ + if ( max_stack_depth > MAX_V5_STACK ) { + bu_log("Combination needs stack depth %d, only have %d, aborted\n", + max_stack_depth, MAX_V5_STACK); + return -1; + } + sp = &stack[0]; + + for ( ius=0; ius < rpn_len; ius++, exprp++ ) { + union tree *tp; + size_t mi; + + RT_GET_TREE( tp, resp ); + tp->tr_b.magic = RT_TREE_MAGIC; + + switch ( *exprp ) { + case DB5COMB_TOKEN_LEAF: + tp->tr_l.tl_op = OP_DB_LEAF; + tp->tr_l.tl_name = bu_strdup( (const char *)leafp ); + leafp += strlen( (const char *)leafp) + 1; + + /* Get matrix index */ + mi = 4095; /* sanity */ + leafp += db5_decode_signed( &mi, leafp, wid ); + + if ( (ssize_t)mi < 0 ) { + /* Signal identity matrix */ + if ( !mat || bn_mat_is_identity( mat ) ) { + tp->tr_l.tl_mat = (matp_t)NULL; + } else + tp->tr_l.tl_mat = bn_mat_dup( mat ); + } else { + mat_t diskmat; + + /* Unpack indicated matrix mi */ + BU_ASSERT_LONG( mi, <, nmat ); + ntohd( (unsigned char *)diskmat, + &matp[mi*ELEMENTS_PER_MAT*SIZEOF_NETWORK_DOUBLE], + ELEMENTS_PER_MAT); + if ( !mat || bn_mat_is_identity( mat ) ) { + tp->tr_l.tl_mat = bn_mat_dup( diskmat ); + } else { + tp->tr_l.tl_mat = (matp_t)bu_malloc( + sizeof(mat_t), "v5comb mat"); + bn_mat_mul( tp->tr_l.tl_mat, mat, diskmat ); + if ( bn_mat_is_identity( tp->tr_l.tl_mat ) ) { + bu_free( (char *)tp->tr_l.tl_mat, "tl_mat"); + tp->tr_l.tl_mat = (matp_t)NULL; + } + } + } + break; + + case DB5COMB_TOKEN_UNION: + case DB5COMB_TOKEN_INTERSECT: + case DB5COMB_TOKEN_SUBTRACT: + case DB5COMB_TOKEN_XOR: + /* These are all binary operators */ + tp->tr_b.tb_regionp = REGION_NULL; + tp->tr_b.tb_right = *--sp; + RT_CK_TREE(tp->tr_b.tb_right); + tp->tr_b.tb_left = *--sp; + RT_CK_TREE(tp->tr_b.tb_left); + switch ( *exprp ) { + case DB5COMB_TOKEN_UNION: + tp->tr_b.tb_op = OP_UNION; + break; + case DB5COMB_TOKEN_INTERSECT: + tp->tr_b.tb_op = OP_INTERSECT; + break; + case DB5COMB_TOKEN_SUBTRACT: + tp->tr_b.tb_op = OP_SUBTRACT; + break; + case DB5COMB_TOKEN_XOR: + tp->tr_b.tb_op = OP_XOR; + break; + } + break; + + case DB5COMB_TOKEN_NOT: + /* This is a unary operator */ + tp->tr_b.tb_regionp = REGION_NULL; + tp->tr_b.tb_left = *--sp; + RT_CK_TREE(tp->tr_b.tb_left); + tp->tr_b.tb_right = TREE_NULL; + tp->tr_b.tb_op = OP_NOT; + break; + default: + bu_log("rt_comb_import5() unknown RPN expression token=%d, import aborted\n", *exprp); + return -1; + } + + /* Push this node on the stack */ + *sp++ = tp; + } + BU_ASSERT_PTR( leafp, ==, leafp_end ); + + /* There should only be one thing left on the stack, the result */ + BU_ASSERT_PTR( sp, ==, &stack[1] ); + + comb->tree = stack[0]; + RT_CK_TREE(comb->tree); + + finish: + if ( ip->idb_avs.magic != BU_AVS_MAGIC ) return 0; /* OK */ + + /* Unpack the attributes */ + comb->rgb_valid = 0; + if ( (ap = bu_avs_get( &ip->idb_avs, "rgb" )) != NULL ) { + int ibuf[3]; + if ( sscanf( ap, "%d/%d/%d", ibuf, ibuf+1, ibuf+2 ) == 3 ) { + VMOVE( comb->rgb, ibuf ); + comb->rgb_valid = 1; + } else { + bu_log("unable to parse 'rgb' attribute '%s'\n", ap); + } + } + if ( (ap = bu_avs_get( &ip->idb_avs, "inherit" )) != NULL ) { + comb->inherit = atoi( ap ); + } + if ( (ap = bu_avs_get( &ip->idb_avs, "region" )) != NULL ) { + /* Presence of this attribute implies it is a region */ + comb->region_flag = 1; + + /* Determine if this is a FASTGEN region */ + switch (*ap) { + case 'V' : /* fallthrough */ + case '2' : + comb->is_fastgen = REGION_FASTGEN_VOLUME; + break; + case 'P' : /* fallthrough */ + case '1' : + comb->is_fastgen = REGION_FASTGEN_PLATE; + break; + case 'R' : /* fallthrough */ + case '0' : + comb->is_fastgen = REGION_NON_FASTGEN; + break; + default: + bu_log("unable to parse 'region' attribute '%s'\n", ap); + break; + } + + /* get the other GIFT "region" attributes */ + if ( (ap = bu_avs_get( &ip->idb_avs, "region_id" )) != NULL ) { + comb->region_id = atoi( ap ); + } + if ( (ap = bu_avs_get( &ip->idb_avs, "aircode" )) != NULL ) { + comb->aircode = atoi( ap ); + } + if ( (ap = bu_avs_get( &ip->idb_avs, "material_id" )) != NULL ) { + comb->GIFTmater = atoi( ap ); + } + if ( (ap = bu_avs_get( &ip->idb_avs, "los" )) != NULL ) { + comb->los = atoi( ap ); + } + } + if ( (ap = bu_avs_get( &ip->idb_avs, "oshader" )) != NULL ) { + bu_vls_strcat( &comb->shader, ap ); + } + + return 0; /* OK */ +} + + +/** + * R T _ C O M B _ G E T + * + * Sets the result string to a description of the given combination. + * Entered via rt_functab[].ft_get(). + */ +int +rt_comb_get(struct bu_vls *logstr, const struct rt_db_internal *intern, const char *item) +{ + const struct rt_comb_internal *comb; + char buf[128]; + + RT_CK_DB_INTERNAL(intern); + comb = (struct rt_comb_internal *)intern->idb_ptr; + RT_CK_COMB(comb); + + if (item==0) { + /* Print out the whole combination. */ + + bu_vls_printf(logstr, "comb region "); + if (comb->region_flag) { + bu_vls_printf(logstr, "yes id %d ", comb->region_id); + + if (comb->aircode) { + bu_vls_printf(logstr, "air %d ", comb->aircode); + } + if (comb->los) { + bu_vls_printf(logstr, "los %d ", comb->los); + } + + if (comb->GIFTmater) { + bu_vls_printf(logstr, "GIFTmater %d ", comb->GIFTmater); + } + } else { + bu_vls_printf(logstr, "no "); + } + + if (comb->rgb_valid) { + bu_vls_printf(logstr, "rgb {%d %d %d} ", V3ARGS(comb->rgb)); + } + + if (bu_vls_strlen(&comb->shader) > 0) { + bu_vls_printf(logstr, "shader {%s} ", bu_vls_addr(&comb->shader)); + } + + if (bu_vls_strlen(&comb->material) > 0) { + bu_vls_printf(logstr, "material %s ", bu_vls_addr(&comb->material)); + } + + if (comb->inherit) { + bu_vls_printf(logstr, "inherit yes "); + } + + bu_vls_printf(logstr, "tree {"); + db_tree_list(logstr, comb->tree); + bu_vls_putc(logstr, '}'); + + return BRLCAD_OK; + } else { + /* Print out only the requested item. */ + register int i; + char itemlwr[128]; + + for (i = 0; i < 128 && item[i]; i++) { + itemlwr[i] = (isupper(item[i]) ? tolower(item[i]) : + item[i]); + } + itemlwr[i] = 0; + + if (strcmp(itemlwr, "region")==0) { + snprintf(buf, 128, "%s", comb->region_flag ? "yes" : "no"); + } else if (strcmp(itemlwr, "id")==0) { + if (!comb->region_flag) goto not_region; + snprintf(buf, 128, "%ld", comb->region_id); + } else if (strcmp(itemlwr, "air")==0) { + if (!comb->region_flag) goto not_region; + snprintf(buf, 128, "%ld", comb->aircode); + } else if (strcmp(itemlwr, "los")==0) { + if (!comb->region_flag) goto not_region; + snprintf(buf, 128, "%ld", comb->los); + } else if (strcmp(itemlwr, "giftmater")==0) { + if (!comb->region_flag) goto not_region; + snprintf(buf, 128, "%ld", comb->GIFTmater); + } else if (strcmp(itemlwr, "rgb")==0) { + if (comb->rgb_valid) + snprintf(buf, 128, "%d %d %d", V3ARGS(comb->rgb)); + else + snprintf(buf, 128, "invalid"); + } else if (strcmp(itemlwr, "shader")==0) { + bu_vls_printf(logstr, "%s", bu_vls_addr(&comb->shader)); + return BRLCAD_OK; + } else if (strcmp(itemlwr, "material")==0) { + bu_vls_printf(logstr, "%s", bu_vls_addr(&comb->material)); + return BRLCAD_OK; + } else if (strcmp(itemlwr, "inherit")==0) { + snprintf(buf, 128, "%s", comb->inherit ? "yes" : "no"); + } else if (strcmp(itemlwr, "tree")==0) { + db_tree_list(logstr, comb->tree); + return BRLCAD_OK; + } else { + bu_vls_printf(logstr, "no such attribute"); + return BRLCAD_ERROR; + } + + bu_vls_printf(logstr, "%s", buf); + return BRLCAD_OK; + + not_region: + bu_vls_printf(logstr, "item not valid for non-region"); + return BRLCAD_ERROR; + } +} + + +/** + * R T _ C O M B _ A D J U S T + * + * Example - + * rgb "1 2 3" ... + * + * Invoked via rt_functab[ID_COMBINATION].ft_adjust() + */ +int +rt_comb_adjust(struct bu_vls *logstr, struct rt_db_internal *intern, int argc, char **argv) +{ + struct rt_comb_internal *comb; + char buf[128]; + int i; + double d; + + RT_CK_DB_INTERNAL(intern); + comb = (struct rt_comb_internal *)intern->idb_ptr; + RT_CK_COMB(comb); + + while (argc >= 2) { + /* Force to lower case */ + for (i=0; i<128 && argv[0][i]!='\0'; i++) + buf[i] = isupper(argv[0][i])?tolower(argv[0][i]):argv[0][i]; + buf[i] = 0; + + if (strcmp(buf, "region")==0) { + if (strcmp(argv[1], "none") == 0) { + comb->region_flag = 0; + } else if (strcmp(argv[1], "no") == 0) { + comb->region_flag = 0; + } else if (strcmp(argv[1], "yes") == 0) { + comb->region_flag = 1; + } else { + if (sscanf(argv[1], "%d", &i) != 1) + return BRLCAD_ERROR; + + if (i != 0) + i = 1; + + comb->region_flag = (char)i; + } + } else if (strcmp(buf, "temp")==0) { + if (!comb->region_flag) goto not_region; + if (strcmp(argv[1], "none") == 0) { + comb->temperature = 0.0; + } else { + if (sscanf(argv[1], "%lf", &d) != 1) + return BRLCAD_ERROR; + comb->temperature = (float)d; + } + } else if (strcmp(buf, "id")==0) { + if (!comb->region_flag) goto not_region; + if (strcmp(argv[1], "none") == 0) { + comb->region_id = 0; + } else { + if (sscanf(argv[1], "%d", &i) != 1) + return BRLCAD_ERROR; + comb->region_id = i; + } + } else if (strcmp(buf, "air")==0) { + if (!comb->region_flag) goto not_region; + if (strcmp(argv[1], "none") == 0) { + comb->aircode = 0; + } else { + if (sscanf(argv[1], "%d", &i) != 1) + return BRLCAD_ERROR; + comb->aircode = i; + } + } else if (strcmp(buf, "los")==0) { + if (!comb->region_flag) goto not_region; + if (strcmp(argv[1], "none") == 0) { + comb->los = 0; + } else { + if (sscanf(argv[1], "%d", &i) != 1) + return BRLCAD_ERROR; + comb->los = i; + } + } else if (strcmp(buf, "giftmater")==0) { + if (!comb->region_flag) goto not_region; + if (strcmp(argv[1], "none") == 0) { + comb->GIFTmater = 0; + } else { + if (sscanf(argv[1], "%d", &i) != 1) + return BRLCAD_ERROR; + comb->GIFTmater = i; + } + } else if (strcmp(buf, "rgb")==0) { + if (strcmp(argv[1], "invalid")==0 || strcmp(argv[1], "none") == 0) { + comb->rgb[0] = comb->rgb[1] = + comb->rgb[2] = 0; + comb->rgb_valid = 0; + } else { + unsigned int r, g, b; + i = sscanf(argv[1], "%u %u %u", + &r, &g, &b); + if (i != 3) { + bu_vls_printf(logstr, "adjust rgb %s: not valid rgb 3-tuple\n", argv[1]); + return BRLCAD_ERROR; + } + comb->rgb[0] = (unsigned char)r; + comb->rgb[1] = (unsigned char)g; + comb->rgb[2] = (unsigned char)b; + comb->rgb_valid = 1; + } + } else if (strcmp(buf, "shader")==0) { + bu_vls_trunc(&comb->shader, 0); + if (strcmp(argv[1], "none")) { + bu_vls_strcat(&comb->shader, argv[1]); + /* Leading spaces boggle the combination exporter */ + bu_vls_trimspace(&comb->shader); + } + } else if (strcmp(buf, "material")==0) { + bu_vls_trunc(&comb->material, 0); + if (strcmp(argv[1], "none")) { + bu_vls_strcat(&comb->material, argv[1]); + bu_vls_trimspace(&comb->material); + } + } else if (strcmp(buf, "inherit")==0) { + if (strcmp(argv[1], "none") == 0) { + comb->inherit = 0; + } else if (strcmp(argv[1], "no") == 0) { + comb->inherit = 0; + } else if (strcmp(argv[1], "yes") == 0) { + comb->inherit = 1; + } else { + if (sscanf(argv[1], "%d", &i) != 1) + return BRLCAD_ERROR; + + if (i != 0) + i = 1; + + comb->inherit = (char)i; + } + } else if (strcmp(buf, "tree")==0) { + union tree *new; + + if (*argv[1] == '\0' || strcmp(argv[1], "none") == 0) { + if (comb->tree) { + db_free_tree(comb->tree, &rt_uniresource); + } + comb->tree = TREE_NULL; + } else { + new = db_tree_parse(logstr, argv[1], &rt_uniresource); + if (new == TREE_NULL) { + bu_vls_printf(logstr, "db adjust tree: bad tree '%s'\n", argv[1]); + return BRLCAD_ERROR; + } + if (comb->tree) + db_free_tree(comb->tree, &rt_uniresource); + comb->tree = new; + } + } else { + bu_vls_printf(logstr, "db adjust %s : no such attribute", buf); + return BRLCAD_ERROR; + } + argc -= 2; + argv += 2; + } + + return BRLCAD_OK; + +not_region: + bu_vls_printf(logstr, "adjusting attribute %s is not valid for a non-region combination.", buf); + return BRLCAD_ERROR; +} + + +/** + * R T _ C O M B _ F O R M + */ +int +rt_comb_form(struct bu_vls *logstr, const struct rt_functab *ftp) +{ + RT_CK_FUNCTAB(ftp); + + bu_vls_printf(logstr, "region {%%s} id {%%d} air {%%d} los {%%d} GIFTmater {%%d} rgb {%%d %%d %%d} shader {%%s} material {%%s} inherit {%%s} tree {%%s}"); + + return BRLCAD_OK; +} + + +/** + * R T _ C O M B _ M A K E + * + * Create a blank combination with appropriate values. Called via + * rt_functab[ID_COMBINATION].ft_make(). + */ +void +rt_comb_make(const struct rt_functab *ftp __attribute__((unused)), struct rt_db_internal *intern) +{ + struct rt_comb_internal *comb; + + intern->idb_major_type = DB5_MAJORTYPE_BRLCAD; + intern->idb_type = ID_COMBINATION; + intern->idb_meth = &rt_functab[ID_COMBINATION]; + intern->idb_ptr = bu_calloc(sizeof(struct rt_comb_internal), 1, + "rt_comb_internal"); + + comb = (struct rt_comb_internal *)intern->idb_ptr; + comb->magic = (long)RT_COMB_MAGIC; + comb->temperature = -1; + comb->tree = (union tree *)0; + comb->region_flag = 1; + comb->region_id = 0; + comb->aircode = 0; + comb->GIFTmater = 0; + comb->los = 0; + comb->rgb_valid = 0; + comb->rgb[0] = comb->rgb[1] = comb->rgb[2] = 0; + bu_vls_init(&comb->shader); + bu_vls_init(&comb->material); + comb->inherit = 0; +} + + +/* + * Local Variables: + * mode: C + * tab-width: 8 + * indent-tabs-mode: t + * c-file-style: "stroustrup" + * End: + * ex: shiftwidth=4 tabstop=8 + */ Copied: brlcad/trunk/src/librt/comb/db_comb.c (from rev 37823, brlcad/trunk/src/librt/db_comb.c) =================================================================== --- brlcad/trunk/src/librt/comb/db_comb.c (rev 0) +++ brlcad/trunk/src/librt/comb/db_comb.c 2010-03-02 06:32:26 UTC (rev 37826) @@ -0,0 +1,1204 @@ +/* D B _ C O M B . C + * BRL-CAD + * + * Copyright (c) 1996-2010 United States Government as represented by + * the U.S. Army Research Laboratory. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public License + * version 2.1 as published by the Free Software Foundation. + * + * This library is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this file; see the file named COPYING for more + * information. + */ +/** @addtogroup db4 */ +/** @{ */ +/** @file db_comb.c + * + * This module contains the import/export routines for "Combinations", + * the non-leaf nodes in the directed acyclic graphs (DAGs) in the + * BRL-CAD ".g" database. + * + * This parallels the function of the geometry (leaf-node) + * import/export routines found in the g_xxx.c routines. + * + * As a reminder, some combinations are special, when marked with the + * "Region" flag, everything from that node down is considered to be + * made of uniform material. + * + */ + +#include "common.h" + +#include <stdio.h> +#include <math.h> +#include <string.h> +#include "bio.h" + +#include "bu.h" +#include "vmath.h" +#include "bn.h" +#include "db.h" +#include "mater.h" +#include "raytrace.h" + + +#define STAT_ROT 1 +#define STAT_XLATE 2 +#define STAT_PERSP 4 +#define STAT_SCALE 8 + + +/** + * D B _ C O M B _ M A T _ C A T E G O R I Z E + * + * Describe with a bit vector the effects this matrix will have. + */ +static int +db_comb_mat_categorize(const fastf_t *matp) +{ + int status = 0; + + if (!matp) return 0; + + if (!NEAR_ZERO(matp[0] - 1.0, SMALL_FASTF) + || !NEAR_ZERO(matp[5] - 1.0, SMALL_FASTF) + || !NEAR_ZERO(matp[10] - 1.0, SMALL_FASTF)) + { + status |= STAT_ROT; + } + + if (!NEAR_ZERO(matp[MDX], SMALL_FASTF) + || !NEAR_ZERO(matp[MDY], SMALL_FASTF) + || !NEAR_ZERO(matp[MDZ], SMALL_FASTF)) + { + status |= STAT_XLATE; + } + + if (!NEAR_ZERO(matp[12], SMALL_FASTF) + || !NEAR_ZERO(matp[13], SMALL_FASTF) + || !NEAR_ZERO(matp[14], SMALL_FASTF)) + { + status |= STAT_PERSP; + } + + if (!NEAR_ZERO(matp[15], SMALL_FASTF)) + status |= STAT_SCALE; + + return status; +} + + +/** + * D B _ T R E E _ N L E A V E S + * + * Return count of number of leaf nodes in this tree. + */ +int +db_tree_nleaves(const union tree *tp) +{ + if (tp == TREE_NULL) return 0; + + RT_CK_TREE(tp); + + switch (tp->tr_op) { + case OP_NOP: + return 0; + case OP_DB_LEAF: + return 1; + case OP_SOLID: + return 1; + case OP_REGION: + return 1; + + case OP_NOT: + case OP_GUARD: + case OP_XNOP: + /* Unary ops */ + return db_tree_nleaves(tp->tr_b.tb_left); + + case OP_UNION: + case OP_INTERSECT: + case OP_SUBTRACT: + case OP_XOR: + /* This node is known to be a binary op */ + return db_tree_nleaves(tp->tr_b.tb_left) + + db_tree_nleaves(tp->tr_b.tb_right); + + default: + bu_log("db_tree_nleaves: bad op %d\n", tp->tr_op); + bu_bomb("db_tree_nleaves\n"); + } + return(-1); /* for the compiler */ +} + + +/** + * D B _ F L A T T E N _ T R E E + * + * Take a binary tree in "V4-ready" layout (non-unions pushed below unions, + * left-heavy), and flatten it into an array layout, ready for conversion + * back to the GIFT-inspired V4 database format. + * + * This is done using the db_non_union_push() routine. + * + * If argument 'free' is non-zero, then + * the non-leaf nodes are freed along the way, to prevent memory leaks. + * In this case, the caller's copy of 'tp' will be invalid upon return. + * + * When invoked at the very top of the tree, the op argument must be OP_UNION. + */ +struct rt_tree_array * +db_flatten_tree( + struct rt_tree_array *rt_tree_array, + union tree *tp, + int op, + int freeflag, + struct resource *resp) +{ + + RT_CK_TREE(tp); + RT_CK_RESOURCE(resp); + + switch (tp->tr_op) { + case OP_DB_LEAF: + rt_tree_array->tl_op = op; + rt_tree_array->tl_tree = tp; + return rt_tree_array+1; + + case OP_UNION: + case OP_INTERSECT: + case OP_SUBTRACT: + /* This node is known to be a binary op */ + rt_tree_array = db_flatten_tree(rt_tree_array, tp->tr_b.tb_left, op, freeflag, resp); + rt_tree_array = db_flatten_tree(rt_tree_array, tp->tr_b.tb_right, tp->tr_op, freeflag, resp); + if (freeflag) { + /* The leaves have been stolen, free the binary op */ + tp->tr_b.tb_left = TREE_NULL; + tp->tr_b.tb_right = TREE_NULL; + RT_FREE_TREE(tp, resp); + } + return rt_tree_array; + + default: + bu_log("db_flatten_tree: bad op %d\n", tp->tr_op); + bu_bomb("db_flatten_tree\n"); + } + + return((struct rt_tree_array *)NULL); /* for the compiler */ +} + + +/** + * R T _ C O M B _ I M P O R T 4 + * + * Import a combination record from a V4 database into internal form. + */ +int +rt_comb_import4( + struct rt_db_internal *ip, + const struct bu_external *ep, + const mat_t matrix, /* NULL if identity */ + const struct db_i *dbip, + struct resource *resp) +{ + union record *rp; + struct rt_tree_array *rt_tree_array; + union tree *tree; + struct rt_comb_internal *comb; + size_t j; + size_t node_count; + + BU_CK_EXTERNAL(ep); + rp = (union record *)ep->ext_buf; + if (dbip) RT_CK_DBI(dbip); + + if (rp[0].u_id != ID_COMB) { + bu_log("rt_comb_import4: Attempt to import a non-combination\n"); + return(-1); + } + + /* Compute how many granules of MEMBER records follow */ + node_count = ep->ext_nbytes/sizeof(union record) - 1; + + if (node_count) + rt_tree_array = (struct rt_tree_array *)bu_calloc(node_count, sizeof(struct rt_tree_array), "rt_tree_array"); + else + rt_tree_array = (struct rt_tree_array *)NULL; + + for (j=0; j<node_count; j++) { + if (rp[j+1].u_id != ID_MEMB) { + bu_free((genptr_t)rt_tree_array, "rt_comb_import4: rt_tree_array"); + bu_log("rt_comb_import4(): granule in external buffer is not ID_MEMB, id=%d\n", rp[j+1].u_id); + return(-1); + } + + switch (rp[j+1].M.m_relation) { + case '+': + rt_tree_array[j].tl_op = OP_INTERSECT; + break; + case '-': + rt_tree_array[j].tl_op = OP_SUBTRACT; + break; + default: + bu_log("rt_comb_import4() unknown op=x%x, assuming UNION\n", rp[j+1].M.m_relation); + /* Fall through */ + case 'u': + rt_tree_array[j].tl_op = OP_UNION; + break; + } + + /* Build leaf node for in-memory tree */ + { + union tree *tp; + mat_t diskmat; + char namebuf[NAMESIZE+1]; + + RT_GET_TREE(tp, resp); + rt_tree_array[j].tl_tree = tp; + tp->tr_l.magic = RT_TREE_MAGIC; + tp->tr_l.tl_op = OP_DB_LEAF; + + /* bu_strlcpy not safe here, buffer size mismatch */ + strncpy(namebuf, rp[j+1].M.m_instname, NAMESIZE); + namebuf[NAMESIZE] = '\0'; /* sanity */ + + tp->tr_l.tl_name = bu_strdup(namebuf); + + rt_mat_dbmat(diskmat, rp[j+1].M.m_mat); + + /* Verify that rotation part is pure rotation */ + if (fabs(diskmat[0]) > 1 || fabs(diskmat[1]) > 1 || + fabs(diskmat[2]) > 1 || + fabs(diskmat[4]) > 1 || fabs(diskmat[5]) > 1 || + fabs(diskmat[6]) > 1 || + fabs(diskmat[8]) > 1 || fabs(diskmat[9]) > 1 || + fabs(diskmat[10]) > 1) + { + bu_log("ERROR: %s/%s improper scaling, rotation matrix elements > 1\n", + rp[0].c.c_name, namebuf); + } + + /* Verify that perspective isn't used as a modeling transform */ + if (!NEAR_ZERO(diskmat[12], SMALL_FASTF) + || !NEAR_ZERO(diskmat[13], SMALL_FASTF) + || !NEAR_ZERO(diskmat[14], SMALL_FASTF)) + { + bu_log("ERROR: %s/%s has perspective transform\n", rp[0].c.c_name, namebuf); + } + + /* See if disk record is identity matrix */ + if (bn_mat_is_identity(diskmat)) { + if (matrix == NULL) { + tp->tr_l.tl_mat = NULL; /* identity */ + } else { + tp->tr_l.tl_mat = bn_mat_dup(matrix); + } + } else { + if (matrix == NULL) { + tp->tr_l.tl_mat = bn_mat_dup(diskmat); + } else { + mat_t prod; + bn_mat_mul(prod, matrix, diskmat); + tp->tr_l.tl_mat = bn_mat_dup(prod); + } + } +/* bu_log("M_name=%s, matp=x%x\n", tp->tr_l.tl_name, tp->tr_l.tl_mat); */ + } + } + if (node_count) + tree = db_mkgift_tree(rt_tree_array, node_count, &rt_uniresource); + else + tree = (union tree *)NULL; + + RT_INIT_DB_INTERNAL(ip); + ip->idb_major_type = DB5_MAJORTYPE_BRLCAD; + ip->idb_type = ID_COMBINATION; + ip->idb_meth = &rt_functab[ID_COMBINATION]; + comb = (struct rt_comb_internal *)bu_malloc(sizeof(struct rt_comb_internal), "rt_comb_import4: rt_comb_internal"); + ip->idb_ptr = (genptr_t)comb; + comb->magic = RT_COMB_MAGIC; + bu_vls_init(&comb->shader); + bu_vls_init(&comb->material); + comb->tree = tree; + comb->temperature = -1; + switch (rp[0].c.c_flags) { + case DBV4_NON_REGION_NULL: + case DBV4_NON_REGION: + comb->region_flag = 0; + break; + case DBV4_REGION: + comb->region_flag = 1; + comb->is_fastgen = REGION_NON_FASTGEN; + break; + case DBV4_REGION_FASTGEN_PLATE: + comb->region_flag = 1; + comb->is_fastgen = REGION_FASTGEN_PLATE; + break; + case DBV4_REGION_FASTGEN_VOLUME: + comb->region_flag = 1; + comb->is_fastgen = REGION_FASTGEN_VOLUME; + break; + default: + bu_log("WARNING: combination %s has illegal c_flag=x%x\n", + rp[0].c.c_name, rp[0].c.c_flags); + break; + } + + if (comb->region_flag) { + comb->region_id = rp[0].c.c_regionid; + comb->aircode = rp[0].c.c_aircode; + comb->GIFTmater = rp[0].c.c_material; + comb->los = rp[0].c.c_los; + } else { + /* set some reasonable defaults */ + comb->region_id = 0; + comb->aircode = 0; + comb->GIFTmater = 0; + comb->los = 0; + } + + comb->rgb_valid = rp[0].c.c_override; + if (comb->rgb_valid) { + comb->rgb[0] = rp[0].c.c_rgb[0]; + comb->rgb[1] = rp[0].c.c_rgb[1]; + comb->rgb[2] = rp[0].c.c_rgb[2]; + } + if (rp[0].c.c_matname[0] != '\0') { + char shader_str[94]; + + memset(shader_str, 0, 94); + + /* copy shader info to a static string */ + strncpy(shader_str, rp[0].c.c_matname, 32); + shader_str[32] = '\0'; /* c_matname is a buffer, bu_strlcpy not safe here */ + + strcat(shader_str, " "); + + /* c_matparm is a buffer, bu_strlcpy not safe here */ + strncat(shader_str, rp[0].c.c_matparm, 32); + + /* convert to TCL format and place into comb->shader */ + if (bu_shader_to_tcl_list(shader_str, &comb->shader)) { + bu_log("rt_comb_import4: Error: Cannot convert following shader to TCL format:\n"); + bu_log("\t%s\n", shader_str); + bu_vls_free(&comb->shader); + return -1; + } + } + /* XXX Separate flags for color inherit, shader inherit, (new) material inherit? */ + /* XXX cf: ma_cinherit, ma_minherit */ + /* This ? is necessary to clean up old databases with grunge here */ + comb->inherit = (rp[0].c.c_inherit == DB_INH_HIGHER) ? 1 : 0; + /* Automatic material table lookup here? */ + if (comb->region_flag) + bu_vls_printf(&comb->material, "gift%d", comb->GIFTmater); + + if (rt_tree_array) bu_free((genptr_t)rt_tree_array, "rt_tree_array"); + + return(0); +} + + +/** + * R T _ C O M B _ E X P O R T 4 + */ +int +rt_comb_export4( + struct bu_external *ep, + const struct rt_db_internal *ip, + double local2mm __attribute__((unused)), + const struct db_i *dbip, + struct resource *resp) +{ + struct rt_comb_internal *comb; + int node_count; + int actual_count; + struct rt_tree_array *rt_tree_array; + union tree *tp; + union record *rp; + int j; + char *endp; + struct bu_vls tmp_vls; + + RT_CK_DB_INTERNAL(ip); + if (dbip) RT_CK_DBI(dbip); + RT_CK_RESOURCE(resp); + if (ip->idb_type != ID_COMBINATION) bu_bomb("rt_comb_export4() type not ID_COMBINATION"); + comb = (struct rt_comb_internal *)ip->idb_ptr; + RT_CK_COMB(comb); + + if (comb->tree && db_ck_v4gift_tree(comb->tree) < 0) { + db_non_union_push(comb->tree, resp); + if (db_ck_v4gift_tree(comb->tree) < 0) { + /* Need to further modify tree */ + bu_log("rt_comb_export4() Unable to V4-ify tree, aborting.\n"); + rt_pr_tree(comb->tree, 0); + return -1; + } + } + + /* Count # leaves in tree -- that's how many Member records needed. */ + node_count = db_tree_nleaves(comb->tree); + if (node_count > 0) { + rt_tree_array = (struct rt_tree_array *)bu_calloc(node_count, sizeof(struct rt_tree_array), "rt_tree_array"); + + /* Convert tree into array form */ + actual_count = db_flatten_tree(rt_tree_array, comb->tree, + OP_UNION, 1, resp) - rt_tree_array; + BU_ASSERT_LONG(actual_count, ==, node_count); + comb->tree = TREE_NULL; + } else { + rt_tree_array = (struct rt_tree_array *)NULL; + actual_count = 0; + } + + /* Reformat the data into the necessary V4 granules */ + BU_INIT_EXTERNAL(ep); + ep->ext_nbytes = sizeof(union record) * (1 + node_count); + ep->ext_buf = bu_calloc(1, ep->ext_nbytes, "v4 comb external"); + rp = (union record *)ep->ext_buf; + + /* Convert the member records */ + for (j = 0; j < node_count; j++) { + tp = rt_tree_array[j].tl_tree; + RT_CK_TREE(tp); + if (tp->tr_op != OP_DB_LEAF) bu_bomb("rt_comb_export4() tree not OP_DB_LEAF"); + + rp[j+1].u_id = ID_MEMB; + switch (rt_tree_array[j].tl_op) { + case OP_INTERSECT: + rp[j+1].M.m_relation = '+'; + break; + case OP_SUBTRACT: + rp[j+1].M.m_relation = '-'; + break; + case OP_UNION: + rp[j+1].M.m_relation = 'u'; + break; + default: + bu_bomb("rt_comb_export4() corrupt rt_tree_array"); + } + + NAMEMOVE(tp->tr_l.tl_name, rp[j+1].M.m_instname); + + if (tp->tr_l.tl_mat) { + rt_dbmat_mat(rp[j+1].M.m_mat, tp->tr_l.tl_mat); + } else { + rt_dbmat_mat(rp[j+1].M.m_mat, bn_mat_identity); + } + db_free_tree(tp, resp); + } + + /* Build the Combination record, on the front */ + rp[0].u_id = ID_COMB; + /* c_name[] filled in by db_wrap_v4_external() */ + if (comb->region_flag) { + rp[0].c.c_regionid = (short)comb->region_id; + rp[0].c.c_aircode = (short)comb->aircode; + rp[0].c.c_material = (short)comb->GIFTmater; + rp[0].c.c_los = (short)comb->los; + switch (comb->is_fastgen) { + case REGION_FASTGEN_PLATE: + rp[0].c.c_flags = DBV4_REGION_FASTGEN_PLATE; + break; + case REGION_FASTGEN_VOLUME: + rp[0].c.c_flags = DBV4_REGION_FASTGEN_VOLUME; + break; + default: + case REGION_NON_FASTGEN: + rp[0].c.c_flags = DBV4_REGION; + break; + } + } else { + rp[0].c.c_flags = DBV4_NON_REGION; + } + if (comb->rgb_valid) { + rp[0].c.c_override = 1; + rp[0].c.c_rgb[0] = comb->rgb[0]; + rp[0].c.c_rgb[1] = comb->rgb[1]; + rp[0].c.c_rgb[2] = comb->rgb[2]; + } + + bu_vls_init(&tmp_vls); + + /* convert TCL list format shader to keyword=value format */ + if (bu_shader_to_key_eq(bu_vls_addr(&comb->shader), &tmp_vls)) { + + bu_log("rt_comb_export4: Cannot convert following shader string to keyword=value format:\n"); + bu_log("\t%s\n", bu_vls_addr(&comb->shader)); + rp[0].c.c_matparm[0] = '\0'; + rp[0].c.c_matname[0] = '\0'; + return -1; + } else { + endp = strchr(bu_vls_addr(&tmp_vls), ' '); + if (endp) { + size_t len; + len = endp - bu_vls_addr(&tmp_vls); + if (len <= 0 && bu_vls_strlen(&tmp_vls) > 0) { + bu_log("WARNING: leading spaces on shader '%s' implies NULL shader\n", + bu_vls_addr(&tmp_vls)); + } + + if (len >= sizeof(rp[0].c.c_matname)) { + bu_log("ERROR: Shader name '%s' exceeds v4 database field, aborting.\n", + bu_vls_addr(&tmp_vls)); + return -1; + } + if (strlen(endp+1) >= sizeof(rp[0].c.c_matparm)) { + bu_log("ERROR: Shader parameters '%s' exceed database field, aborting.\nUse \"dbupgrade\" to enable unlimited length strings.\n", + endp+1); + return -1; + } + + /* stash as string even though c_matname/parm are NAMESIZE buffers */ + bu_strlcpy(rp[0].c.c_matname, bu_vls_addr(&tmp_vls), sizeof(rp[0].c.c_matname)); + bu_strlcpy(rp[0].c.c_matparm, endp+1, sizeof(rp[0].c.c_matparm)); + } else { + if ((size_t)bu_vls_strlen(&tmp_vls) >= sizeof(rp[0].c.c_matname)) { + bu_log("ERROR: Shader name '%s' exceeds v4 database field, aborting.\n", + bu_vls_addr(&tmp_vls)); + return -1; + } + bu_strlcpy(rp[0].c.c_matname, bu_vls_addr(&tmp_vls), sizeof(rp[0].c.c_matname)); + rp[0].c.c_matparm[0] = '\0'; + } + } + bu_vls_free(&tmp_vls); + + rp[0].c.c_inherit = comb->inherit; + + if (rt_tree_array) bu_free((char *)rt_tree_array, "rt_tree_array"); + + return 0; /* OK */ +} + + +/** + * D B _ T R E E _ F L A T T E N _ D E S C R I B E + * + * Produce a GIFT-compatible listing, one "member" per line, + * regardless of the structure of the tree we've been given. + */ +void +db_tree_flatten_describe( + struct bu_vls *vls, + const union tree *tp, + int indented, + int lvl, + double mm2local, + struct resource *resp) +{ + int node_count; + struct rt_tree_array *rt_tree_array; + int i; + char op = OP_NOP; + int status; + union tree *ntp; + + BU_CK_VLS(vls); + RT_CK_RESOURCE(resp); + + if (!tp) { + /* no tree, probably an empty combination */ + bu_vls_strcat(vls, "-empty-\n"); + return; + } + RT_CK_TREE(tp); + + node_count = db_tree_nleaves(tp); + if (node_count <= 0) { + if (!indented) bu_vls_spaces(vls, 2*lvl); + bu_vls_strcat(vls, "-empty-\n"); + return; + } + + /* + * We're going to whack the heck out of the tree, but our + * argument is 'const'. Before getting started, make a + * private copy just for us. + */ + ntp = db_dup_subtree(tp, resp); + RT_CK_TREE(ntp); + + /* Convert to "v4 / GIFT style", so that the flatten makes sense. */ + if (db_ck_v4gift_tree(ntp) < 0) + db_non_union_push(ntp, resp); + RT_CK_TREE(ntp); + + node_count = db_tree_nleaves(ntp); + rt_tree_array = (struct rt_tree_array *)bu_calloc(node_count, sizeof(struct rt_tree_array), "rt_tree_array"); + + /* + * free=0 means that the tree won't have any leaf nodes freed. + */ + (void)db_flatten_tree(rt_tree_array, ntp, OP_UNION, 0, resp); + + for (i=0; i<node_count; i++) { + union tree *itp = rt_tree_array[i].tl_tree; + + RT_CK_TREE(itp); + BU_ASSERT_LONG(itp->tr_op, ==, OP_DB_LEAF); + BU_ASSERT_PTR(itp->tr_l.tl_name, !=, NULL); + + switch (rt_tree_array[i].tl_op) { + case OP_INTERSECT: + op = '+'; + break; + case OP_SUBTRACT: + op = '-'; + break; + case OP_UNION: + op = 'u'; + break; + default: + bu_bomb("db_tree_flatten_describe() corrupt rt_tree_array"); + } + + status = db_comb_mat_categorize(itp->tr_l.tl_mat); + if (!indented) bu_vls_spaces(vls, 2*lvl); + bu_vls_printf(vls, " %c %s", op, itp->tr_l.tl_name); + if (status & STAT_ROT) { + fastf_t az, el; + bn_ae_vec(&az, &el, itp->tr_l.tl_mat ? + itp->tr_l.tl_mat : bn_mat_identity); + bu_vls_printf(vls, + " az=%g, el=%g, ", + az, el); + } + if (status & STAT_XLATE) { + bu_vls_printf(vls, " [%g, %g, %g]", + itp->tr_l.tl_mat[MDX]*mm2local, + itp->tr_l.tl_mat[MDY]*mm2local, + itp->tr_l.tl_mat[MDZ]*mm2local); + } + if (status & STAT_SCALE) { + bu_vls_printf(vls, " scale %g", + 1.0/itp->tr_l.tl_mat[15]); + } + if (status & STAT_PERSP) { + bu_vls_printf(vls, + " Perspective=[%g, %g, %g]??", + itp->tr_l.tl_mat[12], + itp->tr_l.tl_mat[13], + itp->tr_l.tl_mat[14]); + } + bu_vls_printf(vls, "\n"); + } + + if (rt_tree_array) bu_free((genptr_t)rt_tree_array, "rt_tree_array"); + db_free_tree(ntp, resp); +} + + +/** + * D B _ T R E E _ D E S C R I B E + */ +void +db_tree_describe( + struct bu_vls *vls, + const union tree *tp, + int indented, + int lvl, + double mm2local) +{ + int status; + + BU_CK_VLS(vls); + + if (!tp) { + /* no tree, probably an empty combination */ + bu_vls_strcat(vls, "-empty-\n"); + return; + } + RT_CK_TREE(tp); + switch (tp->tr_op) { + + case OP_DB_LEAF: + status = db_comb_mat_categorize(tp->tr_l.tl_mat); + + /* One per line, out onto the vls */ + if (!indented) bu_vls_spaces(vls, 2*lvl); + bu_vls_strcat(vls, tp->tr_l.tl_name); + if (status & STAT_ROT) { + fastf_t az, el; + bn_ae_vec(&az, &el, tp->tr_l.tl_mat ? + tp->tr_l.tl_mat : bn_mat_identity); + bu_vls_printf(vls, + " az=%g, el=%g, ", + az, el); + } + if (status & STAT_XLATE) { + bu_vls_printf(vls, " [%g, %g, %g]", + tp->tr_l.tl_mat[MDX]*mm2local, + tp->tr_l.tl_mat[MDY]*mm2local, + tp->tr_l.tl_mat[MDZ]*mm2local); + } + if (status & STAT_SCALE) { + bu_vls_printf(vls, " scale %g", + 1.0/tp->tr_l.tl_mat[15]); + } + if (status & STAT_PERSP) { + bu_vls_printf(vls, + " Perspective=[%g, %g, %g]??", + tp->tr_l.tl_mat[12], + tp->tr_l.tl_mat[13], + tp->tr_l.tl_mat[14]); + } + bu_vls_printf(vls, "\n"); + return; + + /* This node is known to be a binary op */ + case OP_UNION: + if (!indented) bu_vls_spaces(vls, 2*lvl); + bu_vls_strcat(vls, "u "); + goto bin; + case OP_INTERSECT: + if (!indented) bu_vls_spaces(vls, 2*lvl); + bu_vls_strcat(vls, "+ "); + goto bin; + case OP_SUBTRACT: + if (!indented) bu_vls_spaces(vls, 2*lvl); + bu_vls_strcat(vls, "- "); + goto bin; + case OP_XOR: + if (!indented) bu_vls_spaces(vls, 2*lvl); + bu_vls_strcat(vls, "^ "); + bin: + db_tree_describe(vls, tp->tr_b.tb_left, 1, lvl+1, mm2local); + db_tree_describe(vls, tp->tr_b.tb_right, 0, lvl+1, mm2local); + return; + + /* This node is known to be a unary op */ + case OP_NOT: + if (!indented) bu_vls_spaces(vls, 2*lvl); + bu_vls_strcat(vls, "! "); + goto unary; + case OP_GUARD: + if (!indented) bu_vls_spaces(vls, 2*lvl); + bu_vls_strcat(vls, "G "); + goto unary; + case OP_XNOP: + if (!indented) bu_vls_spaces(vls, 2*lvl); + bu_vls_strcat(vls, "X "); + unary: + db_tree_describe(vls, tp->tr_b.tb_lef... [truncated message content] |
From: <br...@us...> - 2010-03-02 06:38:15
|
Revision: 37828 http://brlcad.svn.sourceforge.net/brlcad/?rev=37828&view=rev Author: brlcad Date: 2010-03-02 06:38:07 +0000 (Tue, 02 Mar 2010) Log Message: ----------- moving binunif code into binunif subdir too Modified Paths: -------------- brlcad/trunk/src/librt/CMakeLists.txt brlcad/trunk/src/librt/Makefile.am Added Paths: ----------- brlcad/trunk/src/librt/binunif/ brlcad/trunk/src/librt/binunif/binary_obj.c brlcad/trunk/src/librt/binunif/db5_bin.c Removed Paths: ------------- brlcad/trunk/src/librt/binary_obj.c brlcad/trunk/src/librt/db5_bin.c Modified: brlcad/trunk/src/librt/CMakeLists.txt =================================================================== --- brlcad/trunk/src/librt/CMakeLists.txt 2010-03-02 06:35:05 UTC (rev 37827) +++ brlcad/trunk/src/librt/CMakeLists.txt 2010-03-02 06:38:07 UTC (rev 37828) @@ -1,6 +1,7 @@ set(LIBRT_SOURCES bezier_2d_isect.c - binary_obj.c + binunif/binary_obj.c + binunif/db5_bin.c bomb.c bool.c bundle.c @@ -11,7 +12,6 @@ constraint.c cut.c db5_alloc.c - db5_bin.c db5_io.c db5_scan.c db5_types.c Modified: brlcad/trunk/src/librt/Makefile.am =================================================================== --- brlcad/trunk/src/librt/Makefile.am 2010-03-02 06:35:05 UTC (rev 37827) +++ brlcad/trunk/src/librt/Makefile.am 2010-03-02 06:38:07 UTC (rev 37828) @@ -34,7 +34,8 @@ librt_nil_la_SOURCES = \ bezier_2d_isect.c \ - binary_obj.c \ + binunif/binary_obj.c \ + binunif/db5_bin.c \ bomb.c \ bool.c \ bundle.c \ @@ -45,7 +46,6 @@ constraint.c \ cut.c \ db5_alloc.c \ - db5_bin.c \ db5_io.c \ db5_scan.c \ db5_types.c \ Deleted: brlcad/trunk/src/librt/binary_obj.c =================================================================== --- brlcad/trunk/src/librt/binary_obj.c 2010-03-02 06:35:05 UTC (rev 37827) +++ brlcad/trunk/src/librt/binary_obj.c 2010-03-02 06:38:07 UTC (rev 37828) @@ -1,180 +0,0 @@ -/* B I N A R Y _ O B J . C - * BRL-CAD - * - * Copyright (c) 2001-2010 United States Government as represented by - * the U.S. Army Research Laboratory. - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public License - * version 2.1 as published by the Free Software Foundation. - * - * This library is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this file; see the file named COPYING for more - * information. - */ -/** @addtogroup db5 */ -/** @{ */ -/** @file binary_obj.c - * - * Routines for writing binary objects to a BRL-CAD database - * Assumes that some of the structure of such databases are known - * by the calling routines. - * - * Return codes of 0 are OK, -1 signal an error. - * - */ -/** @} */ - -#include "common.h" - -#include <stdio.h> -#include <sys/stat.h> -#include <math.h> -#include <string.h> -#include <limits.h> - -#ifdef HAVE_SYS_TYPES_H -# include <sys/types.h> -#endif - -#include "bio.h" - -#include "bu.h" -#include "vmath.h" -#include "bn.h" -#include "rtgeom.h" -#include "raytrace.h" -#include "wdb.h" - - -int -rt_mk_binunif(struct rt_wdb *wdbp, const char *obj_name, const char *file_name, unsigned int minor_type, size_t max_count) -{ - struct stat st; - unsigned int major_type=DB5_MAJORTYPE_BINARY_UNIF; - size_t num_items=-1; - size_t obj_length=-1; - size_t item_length=0; - struct bu_mapped_file *bu_fd; - struct rt_binunif_internal *bip; - struct rt_db_internal intern; - struct bu_external body; - struct bu_external bin_ext; - struct directory *dp; - int ret; - - if ( (item_length=db5_type_sizeof_h_binu( minor_type ) ) <= 0 ) { - bu_log( "Unrecognized minor type!\n" ); - return -1; - } - - if ( stat( file_name, &st ) ) { - bu_log( "Cannot stat input file(%s)", file_name ); - return -1; - } - - if ( (bu_fd=bu_open_mapped_file( file_name, NULL)) == NULL ) { - bu_log( "Cannot open input file(%s) for reading", - file_name ); - return -1; - } - - /* create the rt_binunif internal form */ - BU_GETSTRUCT( bip, rt_binunif_internal ); - bip->magic = RT_BINUNIF_INTERNAL_MAGIC; - bip->type = minor_type; - - if (item_length != 0) { - num_items = (size_t)(st.st_size / item_length); - } else { - num_items = 0; - } - - /* maybe only a partial file read */ - if (max_count > 0 && max_count < num_items) { - num_items = max_count; - } - - obj_length = num_items * item_length; - if (obj_length < 1) { - obj_length = 1; - } - - /* just copy the bytes */ - bip->count = (long)num_items; - bip->u.int8 = (char *)bu_malloc( obj_length, "binary uniform object" ); - memcpy(bip->u.int8, bu_fd->buf, obj_length); - - bu_close_mapped_file( bu_fd ); - - /* create the rt_internal form */ - RT_INIT_DB_INTERNAL( &intern ); - intern.idb_major_type = major_type; - intern.idb_minor_type = minor_type; - intern.idb_ptr = (genptr_t)bip; - intern.idb_meth = &rt_functab[ID_BINUNIF]; - - /* create body portion of external form */ - ret = -1; - if (intern.idb_meth->ft_export5) { - ret = intern.idb_meth->ft_export5(&body, &intern, 1.0, wdbp->dbip, wdbp->wdb_resp); - } - if (ret != 0) { - bu_log( "Error while attemptimg to export %s\n", obj_name ); - rt_db_free_internal(&intern); - return -1; - } - - /* create entire external form */ - db5_export_object3( &bin_ext, DB5HDR_HFLAGS_DLI_APPLICATION_DATA_OBJECT, - obj_name, 0, NULL, &body, - intern.idb_major_type, intern.idb_minor_type, - DB5_ZZZ_UNCOMPRESSED, DB5_ZZZ_UNCOMPRESSED ); - - rt_db_free_internal(&intern); - bu_free_external( &body ); - - /* make sure the database directory is initialized */ - if (wdbp->dbip->dbi_eof == RT_DIR_PHONY_ADDR) { - ret = db_dirbuild(wdbp->dbip); - if (ret) { - return -1; - } - } - - /* add this (phony until written) object to the directory */ - if ( (dp=db_diradd5( wdbp->dbip, obj_name, -1, major_type, - minor_type, 0, 0, NULL )) == DIR_NULL ) { - bu_log( "Error while attemptimg to add new name (%s) to the database", - obj_name ); - bu_free_external( &bin_ext ); - return -1; - } - - /* and write it to the database */ - if ( db_put_external5( &bin_ext, dp, wdbp->dbip ) ) { - bu_log( "Error while adding new binary object (%s) to the database", - obj_name ); - bu_free_external( &bin_ext ); - return -1; - } - - bu_free_external( &bin_ext ); - - return 0; -} - -/* - * Local Variables: - * mode: C - * tab-width: 8 - * indent-tabs-mode: t - * c-file-style: "stroustrup" - * End: - * ex: shiftwidth=4 tabstop=8 - */ Copied: brlcad/trunk/src/librt/binunif/binary_obj.c (from rev 37823, brlcad/trunk/src/librt/binary_obj.c) =================================================================== --- brlcad/trunk/src/librt/binunif/binary_obj.c (rev 0) +++ brlcad/trunk/src/librt/binunif/binary_obj.c 2010-03-02 06:38:07 UTC (rev 37828) @@ -0,0 +1,180 @@ +/* B I N A R Y _ O B J . C + * BRL-CAD + * + * Copyright (c) 2001-2010 United States Government as represented by + * the U.S. Army Research Laboratory. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public License + * version 2.1 as published by the Free Software Foundation. + * + * This library is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this file; see the file named COPYING for more + * information. + */ +/** @addtogroup db5 */ +/** @{ */ +/** @file binary_obj.c + * + * Routines for writing binary objects to a BRL-CAD database + * Assumes that some of the structure of such databases are known + * by the calling routines. + * + * Return codes of 0 are OK, -1 signal an error. + * + */ +/** @} */ + +#include "common.h" + +#include <stdio.h> +#include <sys/stat.h> +#include <math.h> +#include <string.h> +#include <limits.h> + +#ifdef HAVE_SYS_TYPES_H +# include <sys/types.h> +#endif + +#include "bio.h" + +#include "bu.h" +#include "vmath.h" +#include "bn.h" +#include "rtgeom.h" +#include "raytrace.h" +#include "wdb.h" + + +int +rt_mk_binunif(struct rt_wdb *wdbp, const char *obj_name, const char *file_name, unsigned int minor_type, size_t max_count) +{ + struct stat st; + unsigned int major_type=DB5_MAJORTYPE_BINARY_UNIF; + size_t num_items=-1; + size_t obj_length=-1; + size_t item_length=0; + struct bu_mapped_file *bu_fd; + struct rt_binunif_internal *bip; + struct rt_db_internal intern; + struct bu_external body; + struct bu_external bin_ext; + struct directory *dp; + int ret; + + if ( (item_length=db5_type_sizeof_h_binu( minor_type ) ) <= 0 ) { + bu_log( "Unrecognized minor type!\n" ); + return -1; + } + + if ( stat( file_name, &st ) ) { + bu_log( "Cannot stat input file(%s)", file_name ); + return -1; + } + + if ( (bu_fd=bu_open_mapped_file( file_name, NULL)) == NULL ) { + bu_log( "Cannot open input file(%s) for reading", + file_name ); + return -1; + } + + /* create the rt_binunif internal form */ + BU_GETSTRUCT( bip, rt_binunif_internal ); + bip->magic = RT_BINUNIF_INTERNAL_MAGIC; + bip->type = minor_type; + + if (item_length != 0) { + num_items = (size_t)(st.st_size / item_length); + } else { + num_items = 0; + } + + /* maybe only a partial file read */ + if (max_count > 0 && max_count < num_items) { + num_items = max_count; + } + + obj_length = num_items * item_length; + if (obj_length < 1) { + obj_length = 1; + } + + /* just copy the bytes */ + bip->count = (long)num_items; + bip->u.int8 = (char *)bu_malloc( obj_length, "binary uniform object" ); + memcpy(bip->u.int8, bu_fd->buf, obj_length); + + bu_close_mapped_file( bu_fd ); + + /* create the rt_internal form */ + RT_INIT_DB_INTERNAL( &intern ); + intern.idb_major_type = major_type; + intern.idb_minor_type = minor_type; + intern.idb_ptr = (genptr_t)bip; + intern.idb_meth = &rt_functab[ID_BINUNIF]; + + /* create body portion of external form */ + ret = -1; + if (intern.idb_meth->ft_export5) { + ret = intern.idb_meth->ft_export5(&body, &intern, 1.0, wdbp->dbip, wdbp->wdb_resp); + } + if (ret != 0) { + bu_log( "Error while attemptimg to export %s\n", obj_name ); + rt_db_free_internal(&intern); + return -1; + } + + /* create entire external form */ + db5_export_object3( &bin_ext, DB5HDR_HFLAGS_DLI_APPLICATION_DATA_OBJECT, + obj_name, 0, NULL, &body, + intern.idb_major_type, intern.idb_minor_type, + DB5_ZZZ_UNCOMPRESSED, DB5_ZZZ_UNCOMPRESSED ); + + rt_db_free_internal(&intern); + bu_free_external( &body ); + + /* make sure the database directory is initialized */ + if (wdbp->dbip->dbi_eof == RT_DIR_PHONY_ADDR) { + ret = db_dirbuild(wdbp->dbip); + if (ret) { + return -1; + } + } + + /* add this (phony until written) object to the directory */ + if ( (dp=db_diradd5( wdbp->dbip, obj_name, -1, major_type, + minor_type, 0, 0, NULL )) == DIR_NULL ) { + bu_log( "Error while attemptimg to add new name (%s) to the database", + obj_name ); + bu_free_external( &bin_ext ); + return -1; + } + + /* and write it to the database */ + if ( db_put_external5( &bin_ext, dp, wdbp->dbip ) ) { + bu_log( "Error while adding new binary object (%s) to the database", + obj_name ); + bu_free_external( &bin_ext ); + return -1; + } + + bu_free_external( &bin_ext ); + + return 0; +} + +/* + * Local Variables: + * mode: C + * tab-width: 8 + * indent-tabs-mode: t + * c-file-style: "stroustrup" + * End: + * ex: shiftwidth=4 tabstop=8 + */ Copied: brlcad/trunk/src/librt/binunif/db5_bin.c (from rev 37823, brlcad/trunk/src/librt/db5_bin.c) =================================================================== --- brlcad/trunk/src/librt/binunif/db5_bin.c (rev 0) +++ brlcad/trunk/src/librt/binunif/db5_bin.c 2010-03-02 06:38:07 UTC (rev 37828) @@ -0,0 +1,743 @@ +/* D B 5 _ B I N . C + * BRL-CAD + * + * Copyright (c) 2000-2010 United States Government as represented by + * the U.S. Army Research Laboratory. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public License + * version 2.1 as published by the Free Software Foundation. + * + * This library is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this file; see the file named COPYING for more + * information. + */ +/** @addtogroup db5 */ +/** @{ */ +/** @file db5_bin.c + * + * Handle bulk binary objects + * + */ +/** @} */ + +#include "common.h" + +#include <stdlib.h> +#include <stdio.h> +#include <math.h> +#include <string.h> +#include <ctype.h> +#include "bio.h" + +#include "bu.h" +#include "vmath.h" +#include "db5.h" +#include "rtgeom.h" +#include "raytrace.h" +#include "nurb.h" + + +/* size of each element (in bytes) for the different BINUNIF types */ +/* this array depends on the values of the definitions of the DB5_MINORTYPE_BINU_... in db5.h */ +static const int binu_sizes[]={ + 0, + 0, + SIZEOF_NETWORK_FLOAT, + SIZEOF_NETWORK_DOUBLE, + 1, + 2, + 4, + 8, + 0, + 0, + 0, + 0, + 1, + 2, + 4, + 8 +}; + + +/** + * XXX these are the interface routines needed for table.c + */ +int +rt_bin_unif_export5(struct bu_external *ep __attribute__((unused)), + const struct rt_db_internal *ip __attribute__((unused)), + double local2mm __attribute__((unused)), + const struct db_i *dbip __attribute__((unused)), + struct resource *resp __attribute__((unused))) +{ + bu_log("rt_bin_unif_export5() not implemented\n"); + return -1; +} + +int +rt_bin_unif_import5(struct rt_db_internal *ip __attribute__((unused)), + const struct bu_external *ep __attribute__((unused)), + const mat_t mat __attribute__((unused)), + const struct db_i *dbip __attribute__((unused)), + struct resource *resp __attribute__((unused))) +{ + bu_log("rt_bin_unif_import5() not implemented\n"); + return -1; +} + +int +rt_bin_mime_import5(struct rt_db_internal * ip __attribute__((unused)), + const struct bu_external *ep __attribute__((unused)), + const mat_t mat __attribute__((unused)), + const struct db_i *dbip __attribute__((unused)), + struct resource *resp __attribute__((unused))) +{ + bu_log("rt_bin_mime_import5() not implemented\n"); + return -1; +} + +/** + * R T _ B I N U N I F _ I M P O R T 5 + * + * Import a uniform-array binary object from the database format to + * the internal structure. + */ +int +rt_binunif_import5_minor_type(struct rt_db_internal *ip, + const struct bu_external *ep, + const mat_t mat __attribute__((unused)), + const struct db_i *dbip, + struct resource *resp, + int minor_type) +{ + struct rt_binunif_internal *bip; + size_t i; + unsigned char *srcp; + unsigned long *ldestp; + int in_cookie, out_cookie; + size_t gotten; + + BU_CK_EXTERNAL( ep ); + if (dbip) RT_CK_DBI(dbip); + if (resp) RT_CK_RESOURCE(resp); + + /* + * There's no particular size to expect + * + * BU_ASSERT_LONG( ep->ext_nbytes, ==, SIZEOF_NETWORK_DOUBLE * 3*4 ); + */ + + RT_CK_DB_INTERNAL( ip ); + ip->idb_major_type = DB5_MAJORTYPE_BINARY_UNIF; + ip->idb_minor_type = minor_type; + ip->idb_meth = &rt_functab[ID_BINUNIF]; + ip->idb_ptr = bu_malloc( sizeof(struct rt_binunif_internal), + "rt_binunif_internal"); + + bip = (struct rt_binunif_internal *)ip->idb_ptr; + bip->magic = RT_BINUNIF_INTERNAL_MAGIC; + bip->type = minor_type; + + /* + * Convert from database (network) to internal (host) format + */ + switch (bip->type) { + case DB5_MINORTYPE_BINU_FLOAT: + bip->count = ep->ext_nbytes/SIZEOF_NETWORK_FLOAT; + bip->u.uint8 = (unsigned char *) bu_malloc( bip->count * sizeof(float), + "rt_binunif_internal" ); + ntohf( (unsigned char *) bip->u.uint8, + ep->ext_buf, bip->count ); + break; + case DB5_MINORTYPE_BINU_DOUBLE: + bip->count = ep->ext_nbytes/SIZEOF_NETWORK_DOUBLE; + bip->u.uint8 = (unsigned char *) bu_malloc( bip->count * sizeof(double), + "rt_binunif_internal" ); + ntohd( (unsigned char *) bip->u.uint8, + ep->ext_buf, bip->count ); + break; + case DB5_MINORTYPE_BINU_8BITINT: + case DB5_MINORTYPE_BINU_8BITINT_U: + bip->count = ep->ext_nbytes; + bip->u.uint8 = (unsigned char *) bu_malloc( ep->ext_nbytes, + "rt_binunif_internal" ); + memcpy((char *) bip->u.uint8, (char *) ep->ext_buf, ep->ext_nbytes); + break; + case DB5_MINORTYPE_BINU_16BITINT: + case DB5_MINORTYPE_BINU_16BITINT_U: + bip->count = ep->ext_nbytes/2; + bip->u.uint8 = (unsigned char *) bu_malloc( ep->ext_nbytes, + "rt_binunif_internal" ); + in_cookie = bu_cv_cookie("nus"); + out_cookie = bu_cv_cookie("hus"); + if (bu_cv_optimize(in_cookie) != bu_cv_optimize(out_cookie)) { + gotten = + bu_cv_w_cookie((genptr_t)bip->u.uint8, out_cookie, + ep->ext_nbytes, + ep->ext_buf, in_cookie, bip->count); + if (gotten != bip->count) { + bu_log("%s:%d: Tried to convert %llu, did %d", + __FILE__, __LINE__, (unsigned long long)bip->count, gotten); + bu_bomb("\n"); + } + } else + memcpy((char *) bip->u.uint8, + (char *) ep->ext_buf, + ep->ext_nbytes ); + break; + case DB5_MINORTYPE_BINU_32BITINT: + case DB5_MINORTYPE_BINU_32BITINT_U: + bip->count = ep->ext_nbytes/4; + bip->u.uint8 = (unsigned char *) bu_malloc( ep->ext_nbytes, + "rt_binunif_internal" ); + srcp = (unsigned char *) ep->ext_buf; + ldestp = (unsigned long *) bip->u.uint8; + for (i = 0; i < bip->count; ++i, ++ldestp, srcp += 4) { + *ldestp = bu_glong( srcp ); + } + break; + case DB5_MINORTYPE_BINU_64BITINT: + case DB5_MINORTYPE_BINU_64BITINT_U: + bu_log("rt_binunif_import5_minor_type() Can't handle 64-bit integers yet\n"); + return -1; + } + + return 0; /* OK */ +} + + +/** + * R T _ B I N U N I F _ D U M P + * + * Diagnostic routine + */ +void +rt_binunif_dump( struct rt_binunif_internal *bip) { + RT_CK_BINUNIF(bip); + bu_log("rt_bin_unif_internal <%x>...\n", bip); + bu_log(" type = x%x = %d", bip->type, bip->type); + bu_log(" count = %ld first = 0x%02x", bip->count, + bip->u.uint8[0] & 0x0ff); + bu_log("- - - - -\n"); +} + + +/** + * R T _ B I N U N I F _ E X P O R T 5 + * + * Create the "body" portion of external form + */ +int +rt_binunif_export5( struct bu_external *ep, + const struct rt_db_internal *ip, + double local2mm __attribute__((unused)), /* we ignore */ + const struct db_i *dbip, + struct resource *resp) +{ + struct rt_binunif_internal *bip; + size_t i; + unsigned char *destp; + unsigned long *lsrcp; + int in_cookie, out_cookie; + size_t gotten; + + if (dbip) RT_CK_DBI(dbip); + if (resp) RT_CK_RESOURCE(resp); + + RT_CK_DB_INTERNAL(ip); + bip = (struct rt_binunif_internal *)ip->idb_ptr; + RT_CK_BINUNIF(bip); + + BU_INIT_EXTERNAL(ep); + + /* + * Convert from internal (host) to database (network) format + */ + switch (bip->type) { + case DB5_MINORTYPE_BINU_FLOAT: + ep->ext_nbytes = bip->count * SIZEOF_NETWORK_FLOAT; + ep->ext_buf = (genptr_t)bu_malloc( ep->ext_nbytes, + "binunif external"); + htonf( ep->ext_buf, (unsigned char *) bip->u.uint8, bip->count ); + break; + case DB5_MINORTYPE_BINU_DOUBLE: + ep->ext_nbytes = bip->count * SIZEOF_NETWORK_DOUBLE; + ep->ext_buf = (genptr_t)bu_malloc( ep->ext_nbytes, + "binunif external"); + htond( ep->ext_buf, (unsigned char *) bip->u.uint8, bip->count ); + break; + case DB5_MINORTYPE_BINU_8BITINT: + case DB5_MINORTYPE_BINU_8BITINT_U: + ep->ext_nbytes = bip->count; + ep->ext_buf = (genptr_t)bu_malloc( ep->ext_nbytes, + "binunif external"); + memcpy((char *) ep->ext_buf, (char *) bip->u.uint8, bip->count); + break; + case DB5_MINORTYPE_BINU_16BITINT: + case DB5_MINORTYPE_BINU_16BITINT_U: + ep->ext_nbytes = bip->count * 2; + ep->ext_buf = (genptr_t)bu_malloc( ep->ext_nbytes, "binunif external"); + in_cookie = bu_cv_cookie("hus"); + out_cookie = bu_cv_cookie("nus"); + if (bu_cv_optimize(in_cookie) != bu_cv_optimize(out_cookie)) { + gotten = + bu_cv_w_cookie(ep->ext_buf, out_cookie, + ep->ext_nbytes, + (genptr_t) bip->u.uint8, in_cookie, + bip->count); + + if (gotten != bip->count) { + bu_log("%s:%d: Tried to convert %llu, did %d", + __FILE__, __LINE__, bip->count, gotten); + bu_bomb("\n"); + } + } else { + memcpy((char *) ep->ext_buf, + (char *) bip->u.uint8, + ep->ext_nbytes ); + } + break; + case DB5_MINORTYPE_BINU_32BITINT: + case DB5_MINORTYPE_BINU_32BITINT_U: + ep->ext_nbytes = bip->count * 4; + ep->ext_buf = (genptr_t)bu_malloc( ep->ext_nbytes, "binunif external"); + + lsrcp = (unsigned long *) bip->u.uint8; + destp = (unsigned char *) ep->ext_buf; + for (i = 0; i < bip->count; ++i, ++destp, ++lsrcp) { + (void) bu_plong( destp, *lsrcp ); + } + break; + case DB5_MINORTYPE_BINU_64BITINT: + case DB5_MINORTYPE_BINU_64BITINT_U: + bu_log("rt_binunif_export5() Can't handle 64-bit integers yet\n"); + return -1; + } + + return 0; +} + +/** + * R T _ B I N U N I F _ D E S C R I B E + * + * Make human-readable formatted presentation of this object. First + * line describes type of object. Additional lines are indented one + * tab, and give parameter values. + */ +int +rt_binunif_describe( struct bu_vls *str, + const struct rt_db_internal *ip, + int verbose __attribute__((unused)), + double mm2local __attribute__((unused))) +{ + register struct rt_binunif_internal *bip; + char buf[256]; + unsigned short wid; + + bip = (struct rt_binunif_internal *) ip->idb_ptr; + RT_CK_BINUNIF(bip); + bu_vls_strcat( str, "uniform-array binary object (BINUNIF)\n"); + wid = (bip->type & DB5_MINORTYPE_BINU_WID_MASK) >> 4; + switch (wid) { + case 0: + sprintf( buf, "%llu ", (unsigned long long)bip->count ); break; + case 1: + sprintf( buf, "%llu pairs of ", (unsigned long long)(bip->count / 2) ); break; + case 2: + sprintf( buf, "%llu triples of ", (unsigned long long)(bip->count / 3) ); break; + case 3: + sprintf( buf, "%llu quadruples of ", (unsigned long long)(bip->count / 4) ); break; + } + bu_vls_strcat( str, buf ); + switch (bip->type & DB5_MINORTYPE_BINU_ATM_MASK) { + case DB5_MINORTYPE_BINU_FLOAT: + bu_vls_strcat( str, "floats\n"); break; + case DB5_MINORTYPE_BINU_DOUBLE: + bu_vls_strcat( str, "doubles\n"); break; + case DB5_MINORTYPE_BINU_8BITINT: + bu_vls_strcat( str, "8-bit ints\n"); break; + case DB5_MINORTYPE_BINU_16BITINT: + bu_vls_strcat( str, "16-bit ints\n"); break; + case DB5_MINORTYPE_BINU_32BITINT: + bu_vls_strcat( str, "32-bit ints\n"); break; + case DB5_MINORTYPE_BINU_64BITINT: + bu_vls_strcat( str, "64-bit ints\n"); break; + case DB5_MINORTYPE_BINU_8BITINT_U: + bu_vls_strcat( str, "unsigned 8-bit ints\n"); break; + case DB5_MINORTYPE_BINU_16BITINT_U: + bu_vls_strcat( str, "unsigned 16-bit ints\n"); break; + case DB5_MINORTYPE_BINU_32BITINT_U: + bu_vls_strcat( str, "unsigned 32-bit ints\n"); break; + case DB5_MINORTYPE_BINU_64BITINT_U: + bu_vls_strcat( str, "unsigned 64-bit ints\n"); break; + default: + bu_log("%s:%d: This shouldn't happen", __FILE__, __LINE__); + return(1); + } + + return(0); +} + +/** + * R T _ B I N U N I F _ F R E E + * + * Free the storage associated with a binunif_internal object + */ +void +rt_binunif_free( struct rt_binunif_internal *bip) { + RT_CK_BINUNIF(bip); + bu_free( (genptr_t) bip->u.uint8, "binunif free uint8" ); + bu_free( bip, "binunif free"); + bip = GENPTR_NULL; /* sanity */ +} + + +/** + * R T _ B I N U N I F _ I F R E E + * + * Free the storage associated with the rt_db_internal version of this + * thing. + */ +void +rt_binunif_ifree(struct rt_db_internal *ip) +{ + struct rt_binunif_internal *bip; + + RT_CK_DB_INTERNAL(ip); + bip = (struct rt_binunif_internal *)ip->idb_ptr; + RT_CK_BINUNIF(bip); + bu_free( (genptr_t) bip->u.uint8, "binunif ifree" ); + bu_free( ip->idb_ptr, "binunif ifree" ); + ip->idb_ptr = GENPTR_NULL; +} + + +int +rt_retrieve_binunif(struct rt_db_internal *intern, + struct db_i *dbip, + char *name) +{ + register struct directory *dp; + struct rt_binunif_internal *bip; + struct bu_external ext; + struct db5_raw_internal raw; + char *tmp; + + /* + *Find the guy we're told to write + */ + if ( (dp = db_lookup( dbip, name, LOOKUP_NOISY)) == DIR_NULL ) + return -1; + + RT_INIT_DB_INTERNAL(intern); + if ( rt_db_get_internal5( intern, dp, dbip, NULL, &rt_uniresource) + != ID_BINUNIF || db_get_external( &ext, dp, dbip ) < 0 ) + return -1; + + if (db5_get_raw_internal_ptr(&raw, ext.ext_buf) == NULL) { + bu_log("%s:%d\n", __FILE__, __LINE__); + bu_free_external( &ext ); + return -1; + } + if (db5_type_descrip_from_codes(&tmp, raw.major_type, raw.minor_type)) + tmp = 0; + + if (RT_G_DEBUG & DEBUG_VOL) + bu_log("get_body() sees type (%d, %d)='%s'\n", + raw.major_type, raw.minor_type, tmp); + + if (raw.major_type != DB5_MAJORTYPE_BINARY_UNIF) + return -1; + + bip = intern->idb_ptr; + RT_CK_BINUNIF(bip); + if (RT_G_DEBUG & DEBUG_HF) + rt_binunif_dump(bip); + + if (RT_G_DEBUG & DEBUG_VOL) + bu_log("cmd_export_body() thinks bip->count=%d\n", + bip->count); + + switch (bip->type) { + case DB5_MINORTYPE_BINU_FLOAT: + if (RT_G_DEBUG & DEBUG_VOL) + bu_log("bip->type switch... float"); + break; + case DB5_MINORTYPE_BINU_DOUBLE: + if (RT_G_DEBUG & DEBUG_VOL) + bu_log("bip->type switch... double"); + break; + case DB5_MINORTYPE_BINU_8BITINT: + if (RT_G_DEBUG & DEBUG_VOL) + bu_log("bip->type switch... 8bitint"); + break; + case DB5_MINORTYPE_BINU_8BITINT_U: + if (RT_G_DEBUG & DEBUG_VOL) + bu_log("bip->type switch... 8bituint"); + break; + case DB5_MINORTYPE_BINU_16BITINT: + if (RT_G_DEBUG & DEBUG_VOL) + bu_log("bip->type switch... 16bituint"); + break; + case DB5_MINORTYPE_BINU_16BITINT_U: + if (RT_G_DEBUG & DEBUG_VOL) + bu_log("bip->type switch... 16bitint"); + break; + case DB5_MINORTYPE_BINU_32BITINT: + case DB5_MINORTYPE_BINU_32BITINT_U: + if (RT_G_DEBUG & DEBUG_VOL) + bu_log("bip->type switch... 32bitint"); + break; + case DB5_MINORTYPE_BINU_64BITINT: + case DB5_MINORTYPE_BINU_64BITINT_U: + if (RT_G_DEBUG & DEBUG_VOL) + bu_log("bip->type switch... 64bitint"); + break; + default: + /* XXX This shouln't happen!! */ + bu_log("bip->type switch... default"); + break; + } + + bu_free_external( &ext ); + + return 0; +} + +void +rt_binunif_make(const struct rt_functab *ftp, struct rt_db_internal *intern) +{ + struct rt_binunif_internal *bip; + + intern->idb_type = DB5_MINORTYPE_BINU_8BITINT; + intern->idb_major_type = DB5_MAJORTYPE_BINARY_UNIF; + BU_ASSERT(&rt_functab[ID_BINUNIF] == ftp); + + intern->idb_meth = ftp; + bip = (struct rt_binunif_internal *)bu_calloc( sizeof( struct rt_binunif_internal), 1, + "rt_binunif_make"); + intern->idb_ptr = (genptr_t) bip; + bip->magic = RT_BINUNIF_INTERNAL_MAGIC; + bip->type = DB5_MINORTYPE_BINU_8BITINT; + bip->count = 0; + bip->u.int8 = NULL; +} + +int +rt_binunif_get(struct bu_vls *logstr, const struct rt_db_internal *intern, const char *attr) +{ + register struct rt_binunif_internal *bip=(struct rt_binunif_internal *)intern->idb_ptr; + struct bu_external ext; + size_t i; + unsigned char *c; + + RT_CHECK_BINUNIF( bip ); + + if (attr == (char *)NULL) { + /* export the object to get machine independent form */ + if ( rt_binunif_export5( &ext, intern, 1.0, NULL, NULL ) ) { + bu_vls_strcpy( logstr, "Failed to export binary object!!\n" ); + return BRLCAD_ERROR; + } else { + bu_vls_strcpy( logstr, "binunif" ); + bu_vls_printf( logstr, " T %d D {", bip->type ); + c = ext.ext_buf; + for ( i=0; i<ext.ext_nbytes; i++, c++ ) { + if ( i%40 == 0 ) bu_vls_strcat( logstr, "\n" ); + bu_vls_printf( logstr, "%2.2x", *c ); + } + bu_vls_strcat( logstr, "}" ); + bu_free_external( &ext ); + } + + } else { + if ( !strcmp( attr, "T" ) ) { + bu_vls_printf( logstr, "%d", bip->type ); + } else if ( !strcmp( attr, "D" ) ) { + /* export the object to get machine independent form */ + if ( rt_binunif_export5( &ext, intern, 1.0, NULL, NULL ) ) { + bu_vls_strcpy( logstr, "Failed to export binary object!!\n" ); + return BRLCAD_ERROR; + } else { + c = ext.ext_buf; + for ( i=0; i<ext.ext_nbytes; i++, c++ ) { + if ( i != 0 && i%40 == 0 ) bu_vls_strcat( logstr, "\n" ); + bu_vls_printf( logstr, "%2.2x", *c ); + } + bu_free_external( &ext ); + } + } else { + bu_vls_printf( logstr, "Binary object has no attribute '%s'", attr ); + return BRLCAD_ERROR; + } + } + + return BRLCAD_OK; +} + +int +rt_binunif_adjust(struct bu_vls *logstr, struct rt_db_internal *intern, int argc, char **argv ) +{ + struct rt_binunif_internal *bip; + size_t i; + + RT_CK_DB_INTERNAL( intern ); + bip = (struct rt_binunif_internal *)intern->idb_ptr; + RT_CHECK_BINUNIF( bip ); + + while ( argc >= 2 ) { + if ( !strcmp( argv[0], "T" ) ) { + int new_type=-1; + char *c; + int type_is_digit=1; + + c = argv[1]; + while ( *c != '\0' ) { + if ( !isdigit( *c ) ) { + type_is_digit = 0; + break; + } + c++; + } + + if ( type_is_digit ) { + new_type = atoi( argv[1] ); + } else { + if ( argv[1][1] != '\0' ) { + bu_vls_printf(logstr, + "Illegal type: %s, must be 'f', 'd', 'c', 'i', 'l', 'C', 'S', 'I', or 'L'", + argv[1]); + return BRLCAD_ERROR; + } + switch ( argv[1][0] ) { + case 'f': + new_type = 2; + break; + case 'd': + new_type = 3; + break; + case 'c': + new_type = 4; + break; + case 's': + new_type = 5; + break; + case 'i': + new_type = 6; + break; + case 'l': + new_type = 7; + break; + case 'C': + new_type = 12; + break; + case 'S': + new_type = 13; + break; + case 'I': + new_type = 14; + break; + case 'L': + new_type = 15; + break; + } + } + if ( new_type < 0 || + new_type > DB5_MINORTYPE_BINU_64BITINT || + binu_types[new_type] == NULL ) { + /* Illegal value for type */ + bu_vls_printf(logstr, "Illegal value for binary type: %s", argv[1]); + return BRLCAD_ERROR; + } else { + if ( bip->u.uint8 ) { + size_t new_count; + size_t old_byte_count, new_byte_count; + size_t remainder_count; + + old_byte_count = bip->count * binu_sizes[bip->type]; + new_count = old_byte_count / binu_sizes[new_type]; + remainder_count = old_byte_count % binu_sizes[new_type]; + if ( remainder_count ) { + new_count++; + new_byte_count = new_count * binu_sizes[new_type]; + } else { + new_byte_count = old_byte_count; + } + + if ( new_byte_count != old_byte_count ) { + bip->u.uint8 = bu_realloc( bip->u.uint8, + new_byte_count, + "new bytes for binunif" ); + /* zero out the new bytes */ + for ( i=old_byte_count; i<new_byte_count; i++ ) { + bip->u.uint8[i] = 0; + } + } + bip->count = new_count; + } + bip->type = new_type; + intern->idb_type = new_type; + } + } else if ( !strcmp( argv[0], "D" ) ) { + Tcl_Obj *obj, *list, **obj_array; + int list_len; + unsigned char *buf, *d; + char *s; + int hexlen; + unsigned int h; + + obj = Tcl_NewStringObj( argv[1], -1 ); + list = Tcl_NewListObj( 0, NULL ); + Tcl_ListObjAppendList( brlcad_interp, list, obj ); + (void)Tcl_ListObjGetElements( brlcad_interp, list, &list_len, &obj_array ); + + hexlen = 0; + for ( i=0; i<(size_t)list_len; i++ ) { + hexlen += Tcl_GetCharLength( obj_array[i] ); + } + + if ( hexlen % 2 ) { + bu_vls_printf(logstr, "Hex form of binary data must have an even number of hex digits"); + return BRLCAD_ERROR; + } + + buf = (unsigned char *)bu_malloc( hexlen / 2, "tcladjust binary data" ); + d = buf; + for ( i=0; i<(size_t)list_len; i++ ) { + s = Tcl_GetString( obj_array[i] ); + while ( *s ) { + sscanf( s, "%2x", &h ); + *d++ = h; + s += 2; + } + } + Tcl_DecrRefCount( list ); + + if ( bip->u.uint8 ) { + bu_free( bip->u.uint8, "binary data" ); + } + bip->u.uint8 = buf; + bip->count = hexlen / 2 / binu_sizes[bip->type]; + } + + argc -= 2; + argv += 2; + } + + return TCL_OK; +} + +/* + * Local Variables: + * mode: C + * tab-width: 8 + * indent-tabs-mode: t + * c-file-style: "stroustrup" + * End: + * ex: shiftwidth=4 tabstop=8 + */ Deleted: brlcad/trunk/src/librt/db5_bin.c =================================================================== --- brlcad/trunk/src/librt/db5_bin.c 2010-03-02 06:35:05 UTC (rev 37827) +++ brlcad/trunk/src/librt/db5_bin.c 2010-03-02 06:38:07 UTC (rev 37828) @@ -1,743 +0,0 @@ -/* D B 5 _ B I N . C - * BRL-CAD - * - * Copyright (c) 2000-2010 United States Government as represented by - * the U.S. Army Research Laboratory. - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public License - * version 2.1 as published by the Free Software Foundation. - * - * This library is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this file; see the file named COPYING for more - * information. - */ -/** @addtogroup db5 */ -/** @{ */ -/** @file db5_bin.c - * - * Handle bulk binary objects - * - */ -/** @} */ - -#include "common.h" - -#include <stdlib.h> -#include <stdio.h> -#include <math.h> -#include <string.h> -#include <ctype.h> -#include "bio.h" - -#include "bu.h" -#include "vmath.h" -#include "db5.h" -#include "rtgeom.h" -#include "raytrace.h" -#include "nurb.h" - - -/* size of each element (in bytes) for the different BINUNIF types */ -/* this array depends on the values of the definitions of the DB5_MINORTYPE_BINU_... in db5.h */ -static const int binu_sizes[]={ - 0, - 0, - SIZEOF_NETWORK_FLOAT, - SIZEOF_NETWORK_DOUBLE, - 1, - 2, - 4, - 8, - 0, - 0, - 0, - 0, - 1, - 2, - 4, - 8 -}; - - -/** - * XXX these are the interface routines needed for table.c - */ -int -rt_bin_unif_export5(struct bu_external *ep __attribute__((unused)), - const struct rt_db_internal *ip __attribute__((unused)), - double local2mm __attribute__((unused)), - const struct db_i *dbip __attribute__((unused)), - struct resource *resp __attribute__((unused))) -{ - bu_log("rt_bin_unif_export5() not implemented\n"); - return -1; -} - -int -rt_bin_unif_import5(struct rt_db_internal *ip __attribute__((unused)), - const struct bu_external *ep __attribute__((unused)), - const mat_t mat __attribute__((unused)), - const struct db_i *dbip __attribute__((unused)), - struct resource *resp __attribute__((unused))) -{ - bu_log("rt_bin_unif_import5() not implemented\n"); - return -1; -} - -int -rt_bin_mime_import5(struct rt_db_internal * ip __attribute__((unused)), - const struct bu_external *ep __attribute__((unused)), - const mat_t mat __attribute__((unused)), - const struct db_i *dbip __attribute__((unused)), - struct resource *resp __attribute__((unused))) -{ - bu_log("rt_bin_mime_import5() not implemented\n"); - return -1; -} - -/** - * R T _ B I N U N I F _ I M P O R T 5 - * - * Import a uniform-array binary object from the database format to - * the internal structure. - */ -int -rt_binunif_import5_minor_type(struct rt_db_internal *ip, - const struct bu_external *ep, - const mat_t mat __attribute__((unused)), - const struct db_i *dbip, - struct resource *resp, - int minor_type) -{ - struct rt_binunif_internal *bip; - size_t i; - unsigned char *srcp; - unsigned long *ldestp; - int in_cookie, out_cookie; - size_t gotten; - - BU_CK_EXTERNAL( ep ); - if (dbip) RT_CK_DBI(dbip); - if (resp) RT_CK_RESOURCE(resp); - - /* - * There's no particular size to expect - * - * BU_ASSERT_LONG( ep->ext_nbytes, ==, SIZEOF_NETWORK_DOUBLE * 3*4 ); - */ - - RT_CK_DB_INTERNAL( ip ); - ip->idb_major_type = DB5_MAJORTYPE_BINARY_UNIF; - ip->idb_minor_type = minor_type; - ip->idb_meth = &rt_functab[ID_BINUNIF]; - ip->idb_ptr = bu_malloc( sizeof(struct rt_binunif_internal), - "rt_binunif_internal"); - - bip = (struct rt_binunif_internal *)ip->idb_ptr; - bip->magic = RT_BINUNIF_INTERNAL_MAGIC; - bip->type = minor_type; - - /* - * Convert from database (network) to internal (host) format - */ - switch (bip->type) { - case DB5_MINORTYPE_BINU_FLOAT: - bip->count = ep->ext_nbytes/SIZEOF_NETWORK_FLOAT; - bip->u.uint8 = (unsigned char *) bu_malloc( bip->count * sizeof(float), - "rt_binunif_internal" ); - ntohf( (unsigned char *) bip->u.uint8, - ep->ext_buf, bip->count ); - break; - case DB5_MINORTYPE_BINU_DOUBLE: - bip->count = ep->ext_nbytes/SIZEOF_NETWORK_DOUBLE; - bip->u.uint8 = (unsigned char *) bu_malloc( bip->count * sizeof(double), - "rt_binunif_internal" ); - ntohd( (unsigned char *) bip->u.uint8, - ep->ext_buf, bip->count ); - break; - case DB5_MINORTYPE_BINU_8BITINT: - case DB5_MINORTYPE_BINU_8BITINT_U: - bip->count = ep->ext_nbytes; - bip->u.uint8 = (unsigned char *) bu_malloc( ep->ext_nbytes, - "rt_binunif_internal" ); - memcpy((char *) bip->u.uint8, (char *) ep->ext_buf, ep->ext_nbytes); - break; - case DB5_MINORTYPE_BINU_16BITINT: - case DB5_MINORTYPE_BINU_16BITINT_U: - bip->count = ep->ext_nbytes/2; - bip->u.uint8 = (unsigned char *) bu_malloc( ep->ext_nbytes, - "rt_binunif_internal" ); - in_cookie = bu_cv_cookie("nus"); - out_cookie = bu_cv_cookie("hus"); - if (bu_cv_optimize(in_cookie) != bu_cv_optimize(out_cookie)) { - gotten = - bu_cv_w_cookie((genptr_t)bip->u.uint8, out_cookie, - ep->ext_nbytes, - ep->ext_buf, in_cookie, bip->count); - if (gotten != bip->count) { - bu_log("%s:%d: Tried to convert %llu, did %d", - __FILE__, __LINE__, (unsigned long long)bip->count, gotten); - bu_bomb("\n"); - } - } else - memcpy((char *) bip->u.uint8, - (char *) ep->ext_buf, - ep->ext_nbytes ); - break; - case DB5_MINORTYPE_BINU_32BITINT: - case DB5_MINORTYPE_BINU_32BITINT_U: - bip->count = ep->ext_nbytes/4; - bip->u.uint8 = (unsigned char *) bu_malloc( ep->ext_nbytes, - "rt_binunif_internal" ); - srcp = (unsigned char *) ep->ext_buf; - ldestp = (unsigned long *) bip->u.uint8; - for (i = 0; i < bip->count; ++i, ++ldestp, srcp += 4) { - *ldestp = bu_glong( srcp ); - } - break; - case DB5_MINORTYPE_BINU_64BITINT: - case DB5_MINORTYPE_BINU_64BITINT_U: - bu_log("rt_binunif_import5_minor_type() Can't handle 64-bit integers yet\n"); - return -1; - } - - return 0; /* OK */ -} - - -/** - * R T _ B I N U N I F _ D U M P - * - * Diagnostic routine - */ -void -rt_binunif_dump( struct rt_binunif_internal *bip) { - RT_CK_BINUNIF(bip); - bu_log("rt_bin_unif_internal <%x>...\n", bip); - bu_log(" type = x%x = %d", bip->type, bip->type); - bu_log(" count = %ld first = 0x%02x", bip->count, - bip->u.uint8[0] & 0x0ff); - bu_log("- - - - -\n"); -} - - -/** - * R T _ B I N U N I F _ E X P O R T 5 - * - * Create the "body" portion of external form - */ -int -rt_binunif_export5( struct bu_external *ep, - const struct rt_db_internal *ip, - double local2mm __attribute__((unused)), /* we ignore */ - const struct db_i *dbip, - struct resource *resp) -{ - struct rt_binunif_internal *bip; - size_t i; - unsigned char *destp; - unsigned long *lsrcp; - int in_cookie, out_cookie; - size_t gotten; - - if (dbip) RT_CK_DBI(dbip); - if (resp) RT_CK_RESOURCE(resp); - - RT_CK_DB_INTERNAL(ip); - bip = (struct rt_binunif_internal *)ip->idb_ptr; - RT_CK_BINUNIF(bip); - - BU_INIT_EXTERNAL(ep); - - /* - * Convert from internal (host) to database (network) format - */ - switch (bip->type) { - case DB5_MINORTYPE_BINU_FLOAT: - ep->ext_nbytes = bip->count * SIZEOF_NETWORK_FLOAT; - ep->ext_buf = (genptr_t)bu_malloc( ep->ext_nbytes, - "binunif external"); - htonf( ep->ext_buf, (unsigned char *) bip->u.uint8, bip->count ); - break; - case DB5_MINORTYPE_BINU_DOUBLE: - ep->ext_nbytes = bip->count * SIZEOF_NETWORK_DOUBLE; - ep->ext_buf = (genptr_t)bu_malloc( ep->ext_nbytes, - "binunif external"); - htond( ep->ext_buf, (unsigned char *) bip->u.uint8, bip->count ); - break; - case DB5_MINORTYPE_BINU_8BITINT: - case DB5_MINORTYPE_BINU_8BITINT_U: - ep->ext_nbytes = bip->count; - ep->ext_buf = (genptr_t)bu_malloc( ep->ext_nbytes, - "binunif external"); - memcpy((char *) ep->ext_buf, (char *) bip->u.uint8, bip->count); - break; - case DB5_MINORTYPE_BINU_16BITINT: - case DB5_MINORTYPE_BINU_16BITINT_U: - ep->ext_nbytes = bip->count * 2; - ep->ext_buf = (genptr_t)bu_malloc( ep->ext_nbytes, "binunif external"); - in_cookie = bu_cv_cookie("hus"); - out_cookie = bu_cv_cookie("nus"); - if (bu_cv_optimize(in_cookie) != bu_cv_optimize(out_cookie)) { - gotten = - bu_cv_w_cookie(ep->ext_buf, out_cookie, - ep->ext_nbytes, - (genptr_t) bip->u.uint8, in_cookie, - bip->count); - - if (gotten != bip->count) { - bu_log("%s:%d: Tried to convert %llu, did %d", - __FILE__, __LINE__, bip->count, gotten); - bu_bomb("\n"); - } - } else { - memcpy((char *) ep->ext_buf, - (char *) bip->u.uint8, - ep->ext_nbytes ); - } - break; - case DB5_MINORTYPE_BINU_32BITINT: - case DB5_MINORTYPE_BINU_32BITINT_U: - ep->ext_nbytes = bip->count * 4; - ep->ext_buf = (genptr_t)bu_malloc( ep->ext_nbytes, "binunif external"); - - lsrcp = (unsigned long *) bip->u.uint8; - destp = (unsigned char *) ep->ext_buf; - for (i = 0; i < bip->count; ++i, ++destp, ++lsrcp) { - (void) bu_plong( destp, *lsrcp ); - } - break; - case DB5_MINORTYPE_BINU_64BITINT: - case DB5_MINORTYPE_BINU_64BITINT_U: - bu_log("rt_binunif_export5() Can't handle 64-bit integers yet\n"); - return -1; - } - - return 0; -} - -/** - * R T _ B I N U N I F _ D E S C R I B E - * - * Make human-readable formatted presentation of this object. First - * line describes type of object. Additional lines are indented one - * tab, and give parameter values. - */ -int -rt_binunif_describe( struct bu_vls *str, - const struct rt_db_internal *ip, - int verbose __attribute__((unused)), - double mm2local __attribute__((unused))) -{ - register struct rt_binunif_internal *bip; - char buf[256]; - unsigned short wid; - - bip = (struct rt_binunif_internal *) ip->idb_ptr; - RT_CK_BINUNIF(bip); - bu_vls_strcat( str, "uniform-array binary object (BINUNIF)\n"); - wid = (bip->type & DB5_MINORTYPE_BINU_WID_MASK) >> 4; - switch (wid) { - case 0: - sprintf( buf, "%llu ", (unsigned long long)bip->count ); break; - case 1: - sprintf( buf, "%llu pairs of ", (unsigned long long)(bip->count / 2) ); break; - case 2: - sprintf( buf, "%llu triples of ", (unsigned long long)(bip->count / 3) ); break; - case 3: - sprintf( buf, "%llu quadruples of ", (unsigned long long)(bip->count / 4) ); break; - } - bu_vls_strcat( str, buf ); - switch (bip->type & DB5_MINORTYPE_BINU_ATM_MASK) { - case DB5_MINORTYPE_BINU_FLOAT: - bu_vls_strcat( str, "floats\n"); break; - case DB5_MINORTYPE_BINU_DOUBLE: - bu_vls_strcat( str, "doubles\n"); break; - case DB5_MINORTYPE_BINU_8BITINT: - bu_vls_strcat( str, "8-bit ints\n"); break; - case DB5_MINORTYPE_BINU_16BITINT: - bu_vls_strcat( str, "16-bit ints\n"); break; - case DB5_MINORTYPE_BINU_32BITINT: - bu_vls_strcat( str, "32-bit ints\n"); break; - case DB5_MINORTYPE_BINU_64BITINT: - bu_vls_strcat( str, "64-bit ints\n"); break; - case DB5_MINORTYPE_BINU_8BITINT_U: - bu_vls_strcat( str, "unsigned 8-bit ints\n"); break; - case DB5_MINORTYPE_BINU_16BITINT_U: - bu_vls_strcat( str, "unsigned 16-bit ints\n"); break; - case DB5_MINORTYPE_BINU_32BITINT_U: - bu_vls_strcat( str, "unsigned 32-bit ints\n"); break; - case DB5_MINORTYPE_BINU_64BITINT_U: - bu_vls_strcat( str, "unsigned 64-bit ints\n"); break; - default: - bu_log("%s:%d: This shouldn't happen", __FILE__, __LINE__); - return(1); - } - - return(0); -} - -/** - * R T _ B I N U N I F _ F R E E - * - * Free the storage associated with a binunif_internal object - */ -void -rt_binunif_free( struct rt_binunif_internal *bip) { - RT_CK_BINUNIF(bip); - bu_free( (genptr_t) bip->u.uint8, "binunif free uint8" ); - bu_free( bip, "binunif free"); - bip = GENPTR_NULL; /* sanity */ -} - - -/** - * R T _ B I N U N I F _ I F R E E - * - * Free the storage associated with the rt_db_internal version of this - * thing. - */ -void -rt_binunif_ifree(struct rt_db_internal *ip) -{ - struct rt_binunif_internal *bip; - - RT_CK_DB_INTERNAL(ip); - bip = (struct rt_binunif_internal *)ip->idb_ptr; - RT_CK_BINUNIF(bip); - bu_free( (genptr_t) bip->u.uint8, "binunif ifree" ); - bu_free( ip->idb_ptr, "binunif ifree" ); - ip->idb_ptr = GENPTR_NULL; -} - - -int -rt_retrieve_binunif(struct rt_db_internal *intern, - struct db_i *dbip, - char *name) -{ - register struct directory *dp; - struct rt_binunif_internal *bip; - struct bu_external ext; - struct db5_raw_internal raw; - char *tmp; - - /* - *Find the guy we're told to write - */ - if ( (dp = db_lookup( dbip, name, LOOKUP_NOISY)) == DIR_NULL ) - return -1; - - RT_INIT_DB_INTERNAL(intern); - if ( rt_db_get_internal5( intern, dp, dbip, NULL, &rt_uniresource) - != ID_BINUNIF || db_get_external( &ext, dp, dbip ) < 0 ) - return -1; - - if (db5_get_raw_internal_ptr(&raw, ext.ext_buf) == NULL) { - bu_log("%s:%d\n", __FILE__, __LINE__); - bu_free_external( &ext ); - return -1; - } - if (db5_type_descrip_from_codes(&tmp, raw.major_type, raw.minor_type)) - tmp = 0; - - if (RT_G_DEBUG & DEBUG_VOL) - bu_log("get_body() sees type (%d, %d)='%s'\n", - raw.major_type, raw.minor_type, tmp); - - if (raw.major_type != DB5_MAJORTYPE_BINARY_UNIF) - return -1; - - bip = intern->idb_ptr; - RT_CK_BINUNIF(bip); - if (RT_G_DEBUG & DEBUG_HF) - rt_binunif_dump(bip); - - if (RT_G_DEBUG & DEBUG_VOL) - bu_log("cmd_export_body() thinks bip->count=%d\n", - bip->count); - - switch (bip->type) { - case DB5_MINORTYPE_BINU_FLOAT: - if (RT_G_DEBUG & DEBUG_VOL) - bu_log("bip->type switch... float"); - break; - case DB5_MINORTYPE_BINU_DOUBLE: - if (RT_G_DEBUG & DEBUG_VOL) - bu_log("bip->type switch... double"); - break; - case DB5_MINORTYPE_BINU_8BITINT: - if (RT_G_DEBUG & DEBUG_VOL) - bu_log("bip->type switch... 8bitint"); - break; - case DB5_MINORTYPE_BINU_8BITINT_U: - if (RT_G_DEBUG & DEBUG_VOL) - bu_log("bip->type switch... 8bituint"); - break; - case DB5_MINORTYPE_BINU_16BITINT: - if (RT_G_DEBUG & DEBUG_VOL) - bu_log("bip->type switch... 16bituint"); - break; - case DB5_MINORTYPE_BINU_16BITINT_U: - if (RT_G_DEBUG & DEBUG_VOL) - bu_log("bip->type switch... 16bitint"); - break; - case DB5_MINORTYPE_BINU_32BITINT: - case DB5_MINORTYPE_BINU_32BITINT_U: - if (RT_G_DEBUG & DEBUG_VOL) - bu_log("bip->type switch... 32bitint"); - break; - case DB5_MINORTYPE_BINU_64BITINT: - case DB5_MINORTYPE_BINU_64BITINT_U: - if (RT_G_DEBUG & DEBUG_VOL) - bu_log("bip->type switch... 64bitint"); - break; - default: - /* XXX This shouln't happen!! */ - bu_log("bip->type switch... default"); - break; - } - - bu_free_external( &ext ); - - return 0; -} - -void -rt_binunif_make(const struct rt_functab *ftp, struct rt_db_internal *intern) -{ - struct rt_binunif_internal *bip; - - intern->idb_type = DB5_MINORTYPE_BINU_8BITINT; - intern->idb_major_type = DB5_MAJORTYPE_BINARY_UNIF; - BU_ASSERT(&rt_functab[ID_BINUNIF] == ftp); - - intern->idb_meth = ftp; - bip = (struct rt_binunif_internal *)bu_calloc( sizeof( struct rt_binunif_internal), 1, - "rt_binunif_make"); - intern->idb_ptr = (genptr_t) bip; - bip->magic = RT_BINUNIF_INTERNAL_MAGIC; - bip->type = DB5_MINORTYPE_BINU_8BITINT; - bip->count = 0; - bip->u.int8 = NULL; -} - -int -rt_binunif_get(struct bu_vls *logstr, const struct rt_db_internal *intern, const char *attr) -{ - register struct rt_binunif_internal *bip=(struct rt_binunif_internal *)intern->idb_ptr; - struct bu_external ext; - size_t i; - unsigned char *c; - - RT_CHECK_BINUNIF( bip ); - - if (attr == (char *)NULL) { - /* export the object to get machine independent form */ - if ( rt_binunif_export5( &ext, intern, 1.0, NULL, NULL ) ) { - bu_vls_strcpy( logstr, "Failed to export binary object!!\n" ); - return BRLCAD_ERROR; - } else { - bu_vls_strcpy( logstr, "binunif" ); - bu_vls_printf( logstr, " T %d D {", bip->type ); - c = ext.ext_buf; - for ( i=0; i<ext.ext_nbytes; i++, c++ ) { - if ( i%40 == 0 ) bu_vls_strcat( logstr, "\n" ); - bu_vls_printf( logstr, "%2.2x", *c ); - } - bu_vls_strcat( logstr, "}" ); - bu_free_external( &ext ); - } - - } else { - if ( !strcmp( attr, "T" ) ) { - bu_vls_printf( logstr, "%d", bip->type ); - } else if ( !strcmp( attr, "D" ) ) { - /* export the object to get machine independent form */ - if ( rt_binunif_export5( &ext, intern, 1.0, NULL, NULL ) ) { - bu_vls_strcpy( logstr, "Failed to export binary object!!\n" ); - return BRLCAD_ERROR; - } else { - c = ext.ext_buf; - for ( i=0; i<ext.ext_nbytes; i++, c++ ) { - if ( i != 0 && i%40 == 0 ) bu_vls_strcat( logstr, "\n" ); - bu_vls_printf( logstr, "%2.2x", *c ); - } - bu_free_external( &ext ); - } - } else { - bu_vls_printf( logstr, "Binary object has no attribute '%s'", attr ); - return BRLCAD_ERROR; - } - } - - return BRLCAD_OK; -} - -int -rt_binunif_adjust(struct bu_vls *logstr, struct rt_db_internal *intern, int argc, char **argv ) -{ - struct rt_binunif_internal *bip; - size_t i; - - RT_CK_DB_INTERNAL( intern ); - bip = (struct rt_binunif_internal *)intern->idb_ptr; - RT_CHECK_BINUNIF( bip ); - - while ( argc >= 2 ) { - if ( !strcmp( argv[0], "T" ) ) { - int new_type=-1; - char *c; - int type_is_digit=1; - - c = argv[1]; - while ( *c != '\0' ) { - if ( !isdigit( *c ) ) { - type_is_digit = 0; - break; - } - c++; - } - - if ( type_is_digit ) { - new_type = atoi( argv[1] ); - } else { - if ( argv[1][1] != '\0' ) { - bu_vls_printf(logstr, - "Illegal type: %s, must be 'f', 'd', 'c', 'i', 'l', 'C', 'S', 'I', or 'L'", - argv[1]); - return BRLCAD_ERROR; - } - switch ( argv[1][0] ) { - case 'f': - new_type = 2; - break; - case 'd': - new_type = 3; - break; - case 'c': - new_type = 4; - break; - case 's': - new_type = 5; - break; - case 'i': - new_type = 6; - break; - case 'l': - new_type = 7; - break; - case 'C': - new_type = 12; - break; - case 'S': - new_type = 13; - break; - case 'I': - new_type = 14; - break; - case 'L': - new_type = 15; - break; - } - } - if ( new_type < 0 || - new_type > DB5_MINORTYPE_BINU_64BITINT || - binu_types[new_type] == NULL ) { - /* Illegal value for type */ - bu_vls_printf(logstr, "Illegal value for binary type: %s", argv[1]); - return BRLCAD_ERROR; - } else { - if ( bip->u.uint8 ) { - size_t new_count; - size_t old_byte_count, new_byte_count; - size_t remainder_count; - - old_byte_count = bip->count * binu_sizes[bip->type]; - new_count = old_byte_count / binu_sizes[new_type]; - remainder_count = old_byte_count % binu_sizes[new_type]; - if ( remainder_count ) { - new_count++; - new_byte_count = new_count * binu_sizes[new_type]; - } else { - new_byte_count = old_byte_count; - } - - if ( new_byte_count != old_byte_count ) { - bip->u.uint8 = bu_realloc( bip->u.uint8, - new_byte_count, - "new bytes for binunif" ); - /* zero out the new bytes */ - for ( i=old_byte_count; i<new_byte_count; i++ ) { - bip->u.uint8[i] = 0; - } - } - bip->count = new_count; - } - bip->type = new_type; - intern->idb_type = new_type; - } - } else if ( !strcmp( argv[0], "D" ) ) { - Tcl_Obj *obj, *list, **obj_array; - int list_len; - unsigned char *buf, *d; - char *s; - int hexlen; - unsigned int h; - - obj = Tcl_NewStringObj( argv[1], -1 ); - list = Tcl_NewListObj( 0, NULL ); - Tcl_ListObjAppendList( brlcad_interp, list, obj ); - (void)Tcl_ListObjGetElements( brlcad_interp, list, &list_len, &obj_array ); - - hexlen = 0; - for ( i=0; i<(size_t)list_len; i++ ) { - hexlen += Tcl_GetCharLength( obj_array[i] ); - } - - if ( hexlen % 2 ) { - bu_vls_printf(logstr, "Hex form of binary data must have an even number of hex digits"); - return BRLCAD_ERROR; - } - - buf = (unsigned char *)bu_malloc( hexlen / 2, "tcladjust binary data" ); - d = buf; - for ( i=0; i<(size_t)list_len; i++ ) { - s = Tcl_GetString( obj_array[i] ); - while ( *s ) { - sscanf( s, "%2x", &h ); - *d++ = h; - s += 2; - } - } - Tcl_DecrRefCount( list ); - - if ( bip->u.uint8 ) { - bu_free( bip->u.uint8, "binary data" ); - } - bip->u.uint8 = buf; - bip->count = hexlen / 2 / binu_sizes[bip->type]; - } - - argc -= 2; - argv += 2; - } - - return TCL_OK; -} - -/* - * Local Variables: - * mode: C - * tab-width: 8 - * indent-tabs-mode: t - * c-file-style: "stroustrup" - * End: - * ex: shiftwidth=4 tabstop=8 - */ This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <br...@us...> - 2010-03-02 17:56:35
|
Revision: 37846 http://brlcad.svn.sourceforge.net/brlcad/?rev=37846&view=rev Author: brlcad Date: 2010-03-02 17:56:27 +0000 (Tue, 02 Mar 2010) Log Message: ----------- renamed binary_obj.c->binunif.c and db5_comb.c->comb.c to move towards making them more consistent with the layout of other db objects. Modified Paths: -------------- brlcad/trunk/src/librt/CMakeLists.txt brlcad/trunk/src/librt/Makefile.am brlcad/trunk/src/librt/roots.c Added Paths: ----------- brlcad/trunk/src/librt/binunif/binunif.c brlcad/trunk/src/librt/comb/comb.c Removed Paths: ------------- brlcad/trunk/src/librt/binunif/binary_obj.c brlcad/trunk/src/librt/comb/db5_comb.c Modified: brlcad/trunk/src/librt/CMakeLists.txt =================================================================== --- brlcad/trunk/src/librt/CMakeLists.txt 2010-03-02 17:53:46 UTC (rev 37845) +++ brlcad/trunk/src/librt/CMakeLists.txt 2010-03-02 17:56:27 UTC (rev 37846) @@ -1,13 +1,13 @@ set(LIBRT_SOURCES bezier_2d_isect.c - binunif/binary_obj.c + binunif/binunif.c binunif/db5_bin.c bomb.c bool.c bundle.c cmd.c + comb/comb.c comb/comb_mirror.c - comb/db5_comb.c comb/db_comb.c constraint.c cut.c Modified: brlcad/trunk/src/librt/Makefile.am =================================================================== --- brlcad/trunk/src/librt/Makefile.am 2010-03-02 17:53:46 UTC (rev 37845) +++ brlcad/trunk/src/librt/Makefile.am 2010-03-02 17:56:27 UTC (rev 37846) @@ -34,7 +34,7 @@ librt_nil_la_SOURCES = \ bezier_2d_isect.c \ - binunif/binary_obj.c \ + binunif/binunif.c \ binunif/db5_bin.c \ bomb.c \ bool.c \ Deleted: brlcad/trunk/src/librt/binunif/binary_obj.c =================================================================== --- brlcad/trunk/src/librt/binunif/binary_obj.c 2010-03-02 17:53:46 UTC (rev 37845) +++ brlcad/trunk/src/librt/binunif/binary_obj.c 2010-03-02 17:56:27 UTC (rev 37846) @@ -1,180 +0,0 @@ -/* B I N A R Y _ O B J . C - * BRL-CAD - * - * Copyright (c) 2001-2010 United States Government as represented by - * the U.S. Army Research Laboratory. - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public License - * version 2.1 as published by the Free Software Foundation. - * - * This library is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this file; see the file named COPYING for more - * information. - */ -/** @addtogroup db5 */ -/** @{ */ -/** @file binary_obj.c - * - * Routines for writing binary objects to a BRL-CAD database - * Assumes that some of the structure of such databases are known - * by the calling routines. - * - * Return codes of 0 are OK, -1 signal an error. - * - */ -/** @} */ - -#include "common.h" - -#include <stdio.h> -#include <sys/stat.h> -#include <math.h> -#include <string.h> -#include <limits.h> - -#ifdef HAVE_SYS_TYPES_H -# include <sys/types.h> -#endif - -#include "bio.h" - -#include "bu.h" -#include "vmath.h" -#include "bn.h" -#include "rtgeom.h" -#include "raytrace.h" -#include "wdb.h" - - -int -rt_mk_binunif(struct rt_wdb *wdbp, const char *obj_name, const char *file_name, unsigned int minor_type, size_t max_count) -{ - struct stat st; - unsigned int major_type=DB5_MAJORTYPE_BINARY_UNIF; - size_t num_items=-1; - size_t obj_length=-1; - size_t item_length=0; - struct bu_mapped_file *bu_fd; - struct rt_binunif_internal *bip; - struct rt_db_internal intern; - struct bu_external body; - struct bu_external bin_ext; - struct directory *dp; - int ret; - - if ( (item_length=db5_type_sizeof_h_binu( minor_type ) ) <= 0 ) { - bu_log( "Unrecognized minor type!\n" ); - return -1; - } - - if ( stat( file_name, &st ) ) { - bu_log( "Cannot stat input file(%s)", file_name ); - return -1; - } - - if ( (bu_fd=bu_open_mapped_file( file_name, NULL)) == NULL ) { - bu_log( "Cannot open input file(%s) for reading", - file_name ); - return -1; - } - - /* create the rt_binunif internal form */ - BU_GETSTRUCT( bip, rt_binunif_internal ); - bip->magic = RT_BINUNIF_INTERNAL_MAGIC; - bip->type = minor_type; - - if (item_length != 0) { - num_items = (size_t)(st.st_size / item_length); - } else { - num_items = 0; - } - - /* maybe only a partial file read */ - if (max_count > 0 && max_count < num_items) { - num_items = max_count; - } - - obj_length = num_items * item_length; - if (obj_length < 1) { - obj_length = 1; - } - - /* just copy the bytes */ - bip->count = (long)num_items; - bip->u.int8 = (char *)bu_malloc( obj_length, "binary uniform object" ); - memcpy(bip->u.int8, bu_fd->buf, obj_length); - - bu_close_mapped_file( bu_fd ); - - /* create the rt_internal form */ - RT_INIT_DB_INTERNAL( &intern ); - intern.idb_major_type = major_type; - intern.idb_minor_type = minor_type; - intern.idb_ptr = (genptr_t)bip; - intern.idb_meth = &rt_functab[ID_BINUNIF]; - - /* create body portion of external form */ - ret = -1; - if (intern.idb_meth->ft_export5) { - ret = intern.idb_meth->ft_export5(&body, &intern, 1.0, wdbp->dbip, wdbp->wdb_resp); - } - if (ret != 0) { - bu_log( "Error while attemptimg to export %s\n", obj_name ); - rt_db_free_internal(&intern); - return -1; - } - - /* create entire external form */ - db5_export_object3( &bin_ext, DB5HDR_HFLAGS_DLI_APPLICATION_DATA_OBJECT, - obj_name, 0, NULL, &body, - intern.idb_major_type, intern.idb_minor_type, - DB5_ZZZ_UNCOMPRESSED, DB5_ZZZ_UNCOMPRESSED ); - - rt_db_free_internal(&intern); - bu_free_external( &body ); - - /* make sure the database directory is initialized */ - if (wdbp->dbip->dbi_eof == RT_DIR_PHONY_ADDR) { - ret = db_dirbuild(wdbp->dbip); - if (ret) { - return -1; - } - } - - /* add this (phony until written) object to the directory */ - if ( (dp=db_diradd5( wdbp->dbip, obj_name, -1, major_type, - minor_type, 0, 0, NULL )) == DIR_NULL ) { - bu_log( "Error while attemptimg to add new name (%s) to the database", - obj_name ); - bu_free_external( &bin_ext ); - return -1; - } - - /* and write it to the database */ - if ( db_put_external5( &bin_ext, dp, wdbp->dbip ) ) { - bu_log( "Error while adding new binary object (%s) to the database", - obj_name ); - bu_free_external( &bin_ext ); - return -1; - } - - bu_free_external( &bin_ext ); - - return 0; -} - -/* - * Local Variables: - * mode: C - * tab-width: 8 - * indent-tabs-mode: t - * c-file-style: "stroustrup" - * End: - * ex: shiftwidth=4 tabstop=8 - */ Copied: brlcad/trunk/src/librt/binunif/binunif.c (from rev 37839, brlcad/trunk/src/librt/binunif/binary_obj.c) =================================================================== --- brlcad/trunk/src/librt/binunif/binunif.c (rev 0) +++ brlcad/trunk/src/librt/binunif/binunif.c 2010-03-02 17:56:27 UTC (rev 37846) @@ -0,0 +1,180 @@ +/* B I N A R Y _ O B J . C + * BRL-CAD + * + * Copyright (c) 2001-2010 United States Government as represented by + * the U.S. Army Research Laboratory. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public License + * version 2.1 as published by the Free Software Foundation. + * + * This library is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this file; see the file named COPYING for more + * information. + */ +/** @addtogroup db5 */ +/** @{ */ +/** @file binary_obj.c + * + * Routines for writing binary objects to a BRL-CAD database + * Assumes that some of the structure of such databases are known + * by the calling routines. + * + * Return codes of 0 are OK, -1 signal an error. + * + */ +/** @} */ + +#include "common.h" + +#include <stdio.h> +#include <sys/stat.h> +#include <math.h> +#include <string.h> +#include <limits.h> + +#ifdef HAVE_SYS_TYPES_H +# include <sys/types.h> +#endif + +#include "bio.h" + +#include "bu.h" +#include "vmath.h" +#include "bn.h" +#include "rtgeom.h" +#include "raytrace.h" +#include "wdb.h" + + +int +rt_mk_binunif(struct rt_wdb *wdbp, const char *obj_name, const char *file_name, unsigned int minor_type, size_t max_count) +{ + struct stat st; + unsigned int major_type=DB5_MAJORTYPE_BINARY_UNIF; + size_t num_items=-1; + size_t obj_length=-1; + size_t item_length=0; + struct bu_mapped_file *bu_fd; + struct rt_binunif_internal *bip; + struct rt_db_internal intern; + struct bu_external body; + struct bu_external bin_ext; + struct directory *dp; + int ret; + + if ( (item_length=db5_type_sizeof_h_binu( minor_type ) ) <= 0 ) { + bu_log( "Unrecognized minor type!\n" ); + return -1; + } + + if ( stat( file_name, &st ) ) { + bu_log( "Cannot stat input file(%s)", file_name ); + return -1; + } + + if ( (bu_fd=bu_open_mapped_file( file_name, NULL)) == NULL ) { + bu_log( "Cannot open input file(%s) for reading", + file_name ); + return -1; + } + + /* create the rt_binunif internal form */ + BU_GETSTRUCT( bip, rt_binunif_internal ); + bip->magic = RT_BINUNIF_INTERNAL_MAGIC; + bip->type = minor_type; + + if (item_length != 0) { + num_items = (size_t)(st.st_size / item_length); + } else { + num_items = 0; + } + + /* maybe only a partial file read */ + if (max_count > 0 && max_count < num_items) { + num_items = max_count; + } + + obj_length = num_items * item_length; + if (obj_length < 1) { + obj_length = 1; + } + + /* just copy the bytes */ + bip->count = (long)num_items; + bip->u.int8 = (char *)bu_malloc( obj_length, "binary uniform object" ); + memcpy(bip->u.int8, bu_fd->buf, obj_length); + + bu_close_mapped_file( bu_fd ); + + /* create the rt_internal form */ + RT_INIT_DB_INTERNAL( &intern ); + intern.idb_major_type = major_type; + intern.idb_minor_type = minor_type; + intern.idb_ptr = (genptr_t)bip; + intern.idb_meth = &rt_functab[ID_BINUNIF]; + + /* create body portion of external form */ + ret = -1; + if (intern.idb_meth->ft_export5) { + ret = intern.idb_meth->ft_export5(&body, &intern, 1.0, wdbp->dbip, wdbp->wdb_resp); + } + if (ret != 0) { + bu_log( "Error while attemptimg to export %s\n", obj_name ); + rt_db_free_internal(&intern); + return -1; + } + + /* create entire external form */ + db5_export_object3( &bin_ext, DB5HDR_HFLAGS_DLI_APPLICATION_DATA_OBJECT, + obj_name, 0, NULL, &body, + intern.idb_major_type, intern.idb_minor_type, + DB5_ZZZ_UNCOMPRESSED, DB5_ZZZ_UNCOMPRESSED ); + + rt_db_free_internal(&intern); + bu_free_external( &body ); + + /* make sure the database directory is initialized */ + if (wdbp->dbip->dbi_eof == RT_DIR_PHONY_ADDR) { + ret = db_dirbuild(wdbp->dbip); + if (ret) { + return -1; + } + } + + /* add this (phony until written) object to the directory */ + if ( (dp=db_diradd5( wdbp->dbip, obj_name, -1, major_type, + minor_type, 0, 0, NULL )) == DIR_NULL ) { + bu_log( "Error while attemptimg to add new name (%s) to the database", + obj_name ); + bu_free_external( &bin_ext ); + return -1; + } + + /* and write it to the database */ + if ( db_put_external5( &bin_ext, dp, wdbp->dbip ) ) { + bu_log( "Error while adding new binary object (%s) to the database", + obj_name ); + bu_free_external( &bin_ext ); + return -1; + } + + bu_free_external( &bin_ext ); + + return 0; +} + +/* + * Local Variables: + * mode: C + * tab-width: 8 + * indent-tabs-mode: t + * c-file-style: "stroustrup" + * End: + * ex: shiftwidth=4 tabstop=8 + */ Copied: brlcad/trunk/src/librt/comb/comb.c (from rev 37839, brlcad/trunk/src/librt/comb/db5_comb.c) =================================================================== --- brlcad/trunk/src/librt/comb/comb.c (rev 0) +++ brlcad/trunk/src/librt/comb/comb.c 2010-03-02 17:56:27 UTC (rev 37846) @@ -0,0 +1,1120 @@ +/* D B 5 _ C O M B . C + * BRL-CAD + * + * Copyright (c) 2004-2010 United States Government as represented by + * the U.S. Army Research Laboratory. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public License + * version 2.1 as published by the Free Software Foundation. + * + * This library is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this file; see the file named COPYING for more + * information. + */ +/** @addtogroup db5 */ +/** @{ */ +/** @file db5_comb.c + * + * Implement support for combinations in v5 format. + * + * The on-disk record looks like this: + * width byte + * n matricies (only non-identity matricies stored). + * n leaves + * len of RPN expression. (len=0 signals all-union expression) + * depth of stack + * Section 1: matricies + * Section 2: leaves + * Section 3: (Optional) RPN expression. + * + * Encoding of a matrix is (ELEMENTS_PER_MAT * SIZEOF_NETWORK_DOUBLE) + * bytes, in network order (big-Endian, IEEE double precision). + * + */ +/** @} */ + +#include "common.h" + +#include <stdlib.h> +#include <stdio.h> +#include <string.h> +#include <ctype.h> +#include "bio.h" + +#include "bu.h" +#include "vmath.h" +#include "bn.h" +#include "db5.h" +#include "raytrace.h" + + +struct db_tree_counter_state { + long magic; + long n_mat; /* # leaves with non-identity matricies */ + long n_leaf; /* # leaf nodes */ + long n_oper; /* # operator nodes */ + long leafbytes; /* # bytes for name section */ + int non_union_seen; /* boolean, 1 = non-unions seen */ +}; +#define DB_TREE_COUNTER_STATE_MAGIC 0x64546373 /* dTcs */ +#define DB_CK_TREE_COUNTER_STATE(_p) BU_CKMAG(_p, DB_TREE_COUNTER_STATE_MAGIC, "db_tree_counter_state"); + + +/** + * D B _ T R E E _ C O U N T E R + * + * Count number of non-identity matricies, + * number of leaf nodes, number of operator nodes, etc. + * + * Returns - + * maximum depth of stack needed to unpack this tree, if serialized. + * + * Notes - + * We over-estimate the size of the width fields used for + * holding the matrix subscripts. + * The caller is responsible for correcting by saying: + * tcsp->leafbytes -= tcsp->n_leaf * (8 - db5_enc_len[wid]); + */ +long +db_tree_counter( const union tree *tp, struct db_tree_counter_state *tcsp ) +{ + long ldepth, rdepth; + + RT_CK_TREE(tp); + DB_CK_TREE_COUNTER_STATE(tcsp); + + switch ( tp->tr_op ) { + case OP_DB_LEAF: + tcsp->n_leaf++; + if ( tp->tr_l.tl_mat && !bn_mat_is_identity(tp->tr_l.tl_mat) ) tcsp->n_mat++; + /* Over-estimate storage requirement for matrix # */ + tcsp->leafbytes += (long)strlen(tp->tr_l.tl_name) + 1 + 8; + return 1; + + case OP_NOT: + /* Unary ops */ + tcsp->n_oper++; + tcsp->non_union_seen = 1; + return 1 + db_tree_counter( tp->tr_b.tb_left, tcsp ); + + case OP_UNION: + /* This node is known to be a binary op */ + tcsp->n_oper++; + ldepth = db_tree_counter( tp->tr_b.tb_left, tcsp ); + rdepth = db_tree_counter( tp->tr_b.tb_right, tcsp ); + if ( ldepth > rdepth ) return ldepth; + return rdepth; + + case OP_INTERSECT: + case OP_SUBTRACT: + case OP_XOR: + /* This node is known to be a binary op */ + tcsp->n_oper++; + tcsp->non_union_seen = 1; + ldepth = db_tree_counter( tp->tr_b.tb_left, tcsp ); + rdepth = db_tree_counter( tp->tr_b.tb_right, tcsp ); + if ( ldepth > rdepth ) return ldepth; + return rdepth; + + default: + bu_log("db_tree_counter: bad op %d\n", tp->tr_op); + bu_bomb("db_tree_counter\n"); + /* NOTREACHED */ + } + /* NOTREACHED */ + return 0; +} + +#define DB5COMB_TOKEN_LEAF 1 +#define DB5COMB_TOKEN_UNION 2 +#define DB5COMB_TOKEN_INTERSECT 3 +#define DB5COMB_TOKEN_SUBTRACT 4 +#define DB5COMB_TOKEN_XOR 5 +#define DB5COMB_TOKEN_NOT 6 + +struct rt_comb_v5_serialize_state { + long magic; + long mat_num; /* current matrix number */ + long nmat; /* # matricies, total */ + unsigned char *matp; + unsigned char *leafp; + unsigned char *exprp; + int wid; +}; +#define RT_COMB_V5_SERIALIZE_STATE_MAGIC 0x43357373 /* C5ss */ +#define RT_CK_COMB_V5_SERIALIZE_STATE(_p) BU_CKMAG(_p, RT_COMB_V5_SERIALIZE_STATE_MAGIC, "rt_comb_v5_serialize_state") + + +/** + * R T _ C O M B _ V 5 _ S E R I A L I Z E + * + * In one single pass through the tree, serialize out all three output + * sections at once. + */ +void +rt_comb_v5_serialize( + const union tree *tp, + struct rt_comb_v5_serialize_state *ssp) +{ + size_t n; + int mi; + + RT_CK_TREE(tp); + RT_CK_COMB_V5_SERIALIZE_STATE(ssp); + + switch ( tp->tr_op ) { + case OP_DB_LEAF: + /* + * Encoding of the leaf: A null-terminated name string, + *and the matrix subscript. -1 == identity. + */ + n = strlen(tp->tr_l.tl_name) + 1; + memcpy(ssp->leafp, tp->tr_l.tl_name, n); + ssp->leafp += n; + + if ( tp->tr_l.tl_mat && !bn_mat_is_identity(tp->tr_l.tl_mat) ) + mi = ssp->mat_num++; + else + mi = -1; + BU_ASSERT_LONG( mi, <, ssp->nmat ); + ssp->leafp = db5_encode_length( ssp->leafp, mi, ssp->wid ); + + /* Encoding of the matrix */ + if ( mi > -1 ) { + htond( ssp->matp, + (const unsigned char *)tp->tr_l.tl_mat, + ELEMENTS_PER_MAT ); + ssp->matp += ELEMENTS_PER_MAT * SIZEOF_NETWORK_DOUBLE; + } + + /* Encoding of the "leaf" operator */ + if ( ssp->exprp ) + *ssp->exprp++ = DB5COMB_TOKEN_LEAF; + return; + + case OP_NOT: + /* Unary ops */ + rt_comb_v5_serialize( tp->tr_b.tb_left, ssp ); + if ( ssp->exprp ) + *ssp->exprp++ = DB5COMB_TOKEN_NOT; + return; + + case OP_UNION: + /* This node is known to be a binary op */ + rt_comb_v5_serialize( tp->tr_b.tb_left, ssp ); + rt_comb_v5_serialize( tp->tr_b.tb_right, ssp ); + if ( ssp->exprp ) + *ssp->exprp++ = DB5COMB_TOKEN_UNION; + return; + case OP_INTERSECT: + /* This node is known to be a binary op */ + rt_comb_v5_serialize( tp->tr_b.tb_left, ssp ); + rt_comb_v5_serialize( tp->tr_b.tb_right, ssp ); + if ( ssp->exprp ) + *ssp->exprp++ = DB5COMB_TOKEN_INTERSECT; + return; + case OP_SUBTRACT: + /* This node is known to be a binary op */ + rt_comb_v5_serialize( tp->tr_b.tb_left, ssp ); + rt_comb_v5_serialize( tp->tr_b.tb_right, ssp ); + if ( ssp->exprp ) + *ssp->exprp++ = DB5COMB_TOKEN_SUBTRACT; + return; + case OP_XOR: + /* This node is known to be a binary op */ + rt_comb_v5_serialize( tp->tr_b.tb_left, ssp ); + rt_comb_v5_serialize( tp->tr_b.tb_right, ssp ); + if ( ssp->exprp ) + *ssp->exprp++ = DB5COMB_TOKEN_XOR; + return; + + default: + bu_log("rt_comb_v5_serialize: bad op %d\n", tp->tr_op); + bu_bomb("rt_comb_v5_serialize\n"); + } +} + + +/** + * R T _ C O M B _ E X P O R T 5 + */ +int +rt_comb_export5( + struct bu_external *ep, + const struct rt_db_internal *ip, + double local2mm __attribute__((unused)), + const struct db_i *dbip, + struct resource *resp) +{ + struct rt_comb_internal *comb; + struct db_tree_counter_state tcs; + struct rt_comb_v5_serialize_state ss; + long max_stack_depth; + long need; + int rpn_len = 0; /* # items in RPN expression */ + int wid; + unsigned char *cp; + unsigned char *leafp_end; + struct bu_attribute_value_set *avsp; + struct bu_vls value; + + RT_CK_DB_INTERNAL( ip ); + RT_CK_RESOURCE(resp); + if (dbip) RT_CK_DBI(dbip); + + if ( ip->idb_type != ID_COMBINATION ) bu_bomb("rt_comb_export5() type not ID_COMBINATION"); + comb = (struct rt_comb_internal *)ip->idb_ptr; + RT_CK_COMB(comb); + + /* First pass -- count number of non-identity matricies, number of + * leaf nodes, number of operator nodes. + */ + memset((char *)&tcs, 0, sizeof(tcs)); + tcs.magic = DB_TREE_COUNTER_STATE_MAGIC; + if ( comb->tree ) + max_stack_depth = db_tree_counter( comb->tree, &tcs ); + else + max_stack_depth = 0; /* some combinations have no tree */ + + if ( tcs.non_union_seen ) { + /* RPN expression needs one byte for each leaf or operator node */ + rpn_len = tcs.n_leaf + tcs.n_oper; + } else { + rpn_len = 0; + } + + wid = db5_select_length_encoding( + tcs.n_mat | tcs.n_leaf | tcs.leafbytes | + rpn_len | max_stack_depth ); + + /* Apply correction factor to tcs.leafbytes now that we know + * 'wid'. Ignore the slight chance that a smaller 'wid' might now + * be possible. + */ + tcs.leafbytes -= tcs.n_leaf * (8 - db5_enc_len[wid]); + + /* Second pass -- determine amount of on-disk storage needed */ + need = 1 + /* width code */ + db5_enc_len[wid] + /* size for nmatricies */ + db5_enc_len[wid] + /* size for nleaves */ + db5_enc_len[wid] + /* size for leafbytes */ + db5_enc_len[wid] + /* size for len of RPN */ + db5_enc_len[wid] + /* size for max_stack_depth */ + tcs.n_mat * (ELEMENTS_PER_MAT * SIZEOF_NETWORK_DOUBLE) + /* sizeof matrix array */ + tcs.leafbytes + /* size for leaf nodes */ + rpn_len; /* storage for RPN expression */ + + BU_INIT_EXTERNAL(ep); + ep->ext_nbytes = need; + ep->ext_buf = bu_calloc( 1, need, "rt_comb_export5 ext_buf" ); + + /* Build combination's on-disk header section */ + cp = (unsigned char *)ep->ext_buf; + *cp++ = wid; + cp = db5_encode_length( cp, tcs.n_mat, wid ); + cp = db5_encode_length( cp, tcs.n_leaf, wid ); + cp = db5_encode_length( cp, tcs.leafbytes, wid ); + cp = db5_encode_length( cp, rpn_len, wid ); + cp = db5_encode_length( cp, max_stack_depth, wid ); + + /* + * The output format has three sections: + * Section 1: matricies + * Section 2: leaf nodes + * Section 3: Optional RPN expression + * + * We have pre-computed the exact size of all three sections, so + * they can all be searialized together in one pass. Establish + * pointers to the start of each section. + */ + ss.magic = RT_COMB_V5_SERIALIZE_STATE_MAGIC; + ss.wid = wid; + ss.mat_num = 0; + ss.nmat = tcs.n_mat; + ss.matp = cp; + ss.leafp = cp + tcs.n_mat * (ELEMENTS_PER_MAT * SIZEOF_NETWORK_DOUBLE); + leafp_end = ss.leafp + tcs.leafbytes; + if ( rpn_len ) + ss.exprp = leafp_end; + else + ss.exprp = NULL; + + if ( comb->tree ) + rt_comb_v5_serialize( comb->tree, &ss ); + + BU_ASSERT_LONG( ss.mat_num, ==, tcs.n_mat ); + BU_ASSERT_PTR( ss.matp, ==, cp + tcs.n_mat * (ELEMENTS_PER_MAT * SIZEOF_NETWORK_DOUBLE) ); + BU_ASSERT_PTR( ss.leafp, ==, leafp_end ); + if ( rpn_len ) + BU_ASSERT_PTR( ss.exprp, <=, ((unsigned char *)ep->ext_buf) + ep->ext_nbytes ); + + /* Encode all the other stuff as attributes. */ + bu_vls_init( &value ); + /* WARNING: We remove const from the ip pointer!!! */ + avsp = (struct bu_attribute_value_set *)&ip->idb_avs; + if ( avsp->magic != BU_AVS_MAGIC ) + bu_avs_init( avsp, 32, "rt_comb v5 attributes" ); + if ( comb->region_flag ) { + /* Presence of this attribute means this comb is a region. + * Current code values are 0, 1, and 2; all are regions. See + * raytrace.h for meanings of different values + */ + bu_vls_trunc( &value, 0 ); + switch (comb->is_fastgen) { + case REGION_FASTGEN_PLATE: + bu_vls_printf(&value, "P"); + break; + case REGION_FASTGEN_VOLUME: + bu_vls_printf(&value, "V"); + break; + case REGION_NON_FASTGEN: /* fallthrough */ + default: + bu_vls_printf(&value, "R"); + break; + } + bu_avs_add_vls( avsp, "region", &value ); + } else + bu_avs_remove( avsp, "region" ); + + if ( comb->inherit ) + bu_avs_add( avsp, "inherit", "1" ); + else + bu_avs_remove( avsp, "inherit" ); + + if ( comb->rgb_valid ) { + bu_vls_trunc( &value, 0 ); + bu_vls_printf( &value, "%d/%d/%d", V3ARGS(comb->rgb) ); + bu_avs_add_vls( avsp, "rgb", &value ); + } else + bu_avs_remove( avsp, "rgb" ); + + /* optical shader string goes in an attribute */ + if ( bu_vls_strlen( &comb->shader ) > 0 ) + bu_avs_add_vls( avsp, "oshader", &comb->shader ); + else + bu_avs_remove( avsp, "oshader" ); + + /* GIFT compatability */ + if ( comb->region_id != 0 ) { + bu_vls_trunc( &value, 0 ); + bu_vls_printf( &value, "%d", comb->region_id ); + bu_avs_add_vls( avsp, "region_id", &value ); + } else + bu_avs_remove( avsp, "region_id" ); + + if ( comb->aircode != 0 ) { + bu_vls_trunc( &value, 0 ); + bu_vls_printf( &value, "%d", comb->aircode ); + bu_avs_add_vls( avsp, "aircode", &value ); + } else + bu_avs_remove( avsp, "aircode" ); + + if ( comb->GIFTmater != 0 ) { + bu_vls_trunc( &value, 0 ); + bu_vls_printf( &value, "%d", comb->GIFTmater ); + bu_avs_add_vls( avsp, "material_id", &value ); + } else + bu_avs_remove( avsp, "material_id" ); + + if ( comb->los != 0 ) { + bu_vls_trunc( &value, 0 ); + bu_vls_printf( &value, "%d", comb->los ); + bu_avs_add_vls( avsp, "los", &value ); + } else + bu_avs_remove( avsp, "los" ); + + bu_vls_free( &value ); + return 0; /* OK */ +} + + +/** + * R T _ C O M B _ I M P O R T 5 + * + * Read a combination object in v5 external (on-disk) format, and + * convert it into the internal format described in rtgeom.h + * + * This is an unusual conversion, because some of the data is taken + * from attributes, not just from the object body. By the time this + * is called, the attributes will already have been cracked into + * ip->idb_avs, we get the attributes from there. + * + * Returns - + * 0 OK + * -1 FAIL + */ +int +rt_comb_import5(struct rt_db_internal *ip, const struct bu_external *ep, const mat_t mat, const struct db_i *dbip, struct resource *resp) +{ + struct rt_comb_internal *comb; + unsigned char *cp; + int wid; + size_t nmat, nleaf, rpn_len, max_stack_depth; + size_t leafbytes; + unsigned char *matp; + unsigned char *leafp; + unsigned char *leafp_end; + unsigned char *exprp; +#define MAX_V5_STACK 8000 + union tree *stack[MAX_V5_STACK]; + union tree **sp; /* stack pointer */ + const char *ap; + size_t ius; + + RT_CK_DB_INTERNAL( ip ); + BU_CK_EXTERNAL(ep); + RT_CK_DBI(dbip); + RT_CK_RESOURCE(resp); + + ip->idb_major_type = DB5_MAJORTYPE_BRLCAD; + ip->idb_type = ID_COMBINATION; + ip->idb_meth = &rt_functab[ID_COMBINATION]; + BU_GETSTRUCT( comb, rt_comb_internal ); + ip->idb_ptr = (genptr_t)comb; + comb->magic = RT_COMB_MAGIC; + bu_vls_init( &comb->shader ); + bu_vls_init( &comb->material ); + comb->temperature = -1; + + cp = ep->ext_buf; + wid = *cp++; + cp += db5_decode_length( &nmat, cp, wid ); + cp += db5_decode_length( &nleaf, cp, wid ); + cp += db5_decode_length( &leafbytes, cp, wid ); + cp += db5_decode_length( &rpn_len, cp, wid ); + cp += db5_decode_length( &max_stack_depth, cp, wid ); + matp = cp; + leafp = cp + nmat * (ELEMENTS_PER_MAT * SIZEOF_NETWORK_DOUBLE); + exprp = leafp + leafbytes; + leafp_end = exprp; + + if ( rpn_len == 0 ) { + ssize_t is; + + /* This tree is all union operators, import it as a balanced tree */ + struct bu_ptbl *tbl1, *tbl2; + + tbl1 = (struct bu_ptbl *)bu_malloc( sizeof( struct bu_ptbl ), "rt_comb_import5: tbl1" ); + tbl2 = (struct bu_ptbl *)bu_malloc( sizeof( struct bu_ptbl ), "rt_comb_import5: tbl2" ); + + /* insert all the leaf nodes into a bu_ptbl */ + bu_ptbl_init( tbl1, nleaf, "rt_comb_import5: tbl" ); + for (is = nleaf-1; is >= 0; is-- ) { + union tree *tp; + size_t mi; + + RT_GET_TREE( tp, resp ); + tp->tr_l.magic = RT_TREE_MAGIC; + tp->tr_l.tl_op = OP_DB_LEAF; + tp->tr_l.tl_name = bu_strdup( (const char *)leafp ); + leafp += strlen( (const char *)leafp) + 1; + + /* Get matrix index */ + mi = 4095; /* sanity */ + leafp += db5_decode_signed( &mi, leafp, wid ); + + if ( (ssize_t)mi < 0 ) { + /* Signal identity matrix */ + if ( !mat || bn_mat_is_identity( mat ) ) { + tp->tr_l.tl_mat = (matp_t)NULL; + } else + tp->tr_l.tl_mat = bn_mat_dup( mat ); + } else { + mat_t diskmat; + + /* Unpack indicated matrix mi */ + BU_ASSERT_LONG( mi, <, nmat ); + ntohd( (unsigned char *)diskmat, + &matp[mi*ELEMENTS_PER_MAT*SIZEOF_NETWORK_DOUBLE], + ELEMENTS_PER_MAT); + if ( !mat || bn_mat_is_identity( mat ) ) { + tp->tr_l.tl_mat = bn_mat_dup( diskmat ); + } else { + tp->tr_l.tl_mat = (matp_t)bu_malloc( + sizeof(mat_t), "v5comb mat"); + bn_mat_mul( tp->tr_l.tl_mat, mat, diskmat ); + if ( bn_mat_is_identity( tp->tr_l.tl_mat ) ) { + bu_free( (char *)tp->tr_l.tl_mat, "tl_mat"); + tp->tr_l.tl_mat = (matp_t)NULL; + } + } + } + bu_ptbl_ins( tbl1, (long *)tp ); + } + + /* use a second bu_ptbl to help build a balanced tree + * 1 - pick off pairs of pointers from tbl1 + * 2 - make a small tree thats unions the pair + * 3 - insert that tree into tbl2 + * 4 - insert any leftover pointer from tbl1 into tbl2 + * 5 - swap tbl1 and tbl2 + * 6 - truncate tbl2 and go to step 1 + * stop when tbl2 has less than 2 members + */ + bu_ptbl_init( tbl2, (BU_PTBL_LEN( tbl1) + 1)/2, "rt_comb_import5: tbl1" ); + while ( 1 ) { + struct bu_ptbl *tmp; + + for ( is=0; is<BU_PTBL_LEN( tbl1 ); is += 2 ) { + union tree *tp1, *tp2, *unionp; + int j; + + j = is + 1; + tp1 = (union tree *)BU_PTBL_GET( tbl1, is ); + if ( j < BU_PTBL_LEN( tbl1 ) ) { + tp2 = (union tree *)BU_PTBL_GET( tbl1, j ); + } else { + tp2 = (union tree *)NULL; + } + + if ( tp2 ) { + RT_GET_TREE( unionp, resp ); + unionp->tr_b.magic = RT_TREE_MAGIC; + unionp->tr_b.tb_op = OP_UNION; + unionp->tr_b.tb_left = tp1; + unionp->tr_b.tb_right = tp2; + bu_ptbl_ins( tbl2, (long *)unionp ); + } else { + bu_ptbl_ins( tbl2, (long *)tp1 ); + } + + } + + if ( BU_PTBL_LEN( tbl2 ) == 0 ) { + comb->tree = (union tree *)NULL; + bu_ptbl_free( tbl1 ); + bu_ptbl_free( tbl2 ); + bu_free( (char *)tbl1, "rt_comb_import5: tbl1" ); + bu_free( (char *)tbl2, "rt_comb_import5: tbl2" ); + break; + } else if ( BU_PTBL_LEN( tbl2 ) == 1 ) { + comb->tree = (union tree *)BU_PTBL_GET( tbl2, 0 ); + bu_ptbl_free( tbl1 ); + bu_ptbl_free( tbl2 ); + bu_free( (char *)tbl1, "rt_comb_import5: tbl1" ); + bu_free( (char *)tbl2, "rt_comb_import5: tbl2" ); + break; + } + + tmp = tbl2; + tbl2 = tbl1; + tbl1 = tmp; + bu_ptbl_trunc( tbl2, 0 ); + } + BU_ASSERT_PTR( leafp, ==, leafp_end ); + goto finish; + } + + /* + * Bring the RPN expression back from the disk, populating leaves + * and matricies in the order they are encountered. + */ + if ( max_stack_depth > MAX_V5_STACK ) { + bu_log("Combination needs stack depth %d, only have %d, aborted\n", + max_stack_depth, MAX_V5_STACK); + return -1; + } + sp = &stack[0]; + + for ( ius=0; ius < rpn_len; ius++, exprp++ ) { + union tree *tp; + size_t mi; + + RT_GET_TREE( tp, resp ); + tp->tr_b.magic = RT_TREE_MAGIC; + + switch ( *exprp ) { + case DB5COMB_TOKEN_LEAF: + tp->tr_l.tl_op = OP_DB_LEAF; + tp->tr_l.tl_name = bu_strdup( (const char *)leafp ); + leafp += strlen( (const char *)leafp) + 1; + + /* Get matrix index */ + mi = 4095; /* sanity */ + leafp += db5_decode_signed( &mi, leafp, wid ); + + if ( (ssize_t)mi < 0 ) { + /* Signal identity matrix */ + if ( !mat || bn_mat_is_identity( mat ) ) { + tp->tr_l.tl_mat = (matp_t)NULL; + } else + tp->tr_l.tl_mat = bn_mat_dup( mat ); + } else { + mat_t diskmat; + + /* Unpack indicated matrix mi */ + BU_ASSERT_LONG( mi, <, nmat ); + ntohd( (unsigned char *)diskmat, + &matp[mi*ELEMENTS_PER_MAT*SIZEOF_NETWORK_DOUBLE], + ELEMENTS_PER_MAT); + if ( !mat || bn_mat_is_identity( mat ) ) { + tp->tr_l.tl_mat = bn_mat_dup( diskmat ); + } else { + tp->tr_l.tl_mat = (matp_t)bu_malloc( + sizeof(mat_t), "v5comb mat"); + bn_mat_mul( tp->tr_l.tl_mat, mat, diskmat ); + if ( bn_mat_is_identity( tp->tr_l.tl_mat ) ) { + bu_free( (char *)tp->tr_l.tl_mat, "tl_mat"); + tp->tr_l.tl_mat = (matp_t)NULL; + } + } + } + break; + + case DB5COMB_TOKEN_UNION: + case DB5COMB_TOKEN_INTERSECT: + case DB5COMB_TOKEN_SUBTRACT: + case DB5COMB_TOKEN_XOR: + /* These are all binary operators */ + tp->tr_b.tb_regionp = REGION_NULL; + tp->tr_b.tb_right = *--sp; + RT_CK_TREE(tp->tr_b.tb_right); + tp->tr_b.tb_left = *--sp; + RT_CK_TREE(tp->tr_b.tb_left); + switch ( *exprp ) { + case DB5COMB_TOKEN_UNION: + tp->tr_b.tb_op = OP_UNION; + break; + case DB5COMB_TOKEN_INTERSECT: + tp->tr_b.tb_op = OP_INTERSECT; + break; + case DB5COMB_TOKEN_SUBTRACT: + tp->tr_b.tb_op = OP_SUBTRACT; + break; + case DB5COMB_TOKEN_XOR: + tp->tr_b.tb_op = OP_XOR; + break; + } + break; + + case DB5COMB_TOKEN_NOT: + /* This is a unary operator */ + tp->tr_b.tb_regionp = REGION_NULL; + tp->tr_b.tb_left = *--sp; + RT_CK_TREE(tp->tr_b.tb_left); + tp->tr_b.tb_right = TREE_NULL; + tp->tr_b.tb_op = OP_NOT; + break; + default: + bu_log("rt_comb_import5() unknown RPN expression token=%d, import aborted\n", *exprp); + return -1; + } + + /* Push this node on the stack */ + *sp++ = tp; + } + BU_ASSERT_PTR( leafp, ==, leafp_end ); + + /* There should only be one thing left on the stack, the result */ + BU_ASSERT_PTR( sp, ==, &stack[1] ); + + comb->tree = stack[0]; + RT_CK_TREE(comb->tree); + + finish: + if ( ip->idb_avs.magic != BU_AVS_MAGIC ) return 0; /* OK */ + + /* Unpack the attributes */ + comb->rgb_valid = 0; + if ( (ap = bu_avs_get( &ip->idb_avs, "rgb" )) != NULL ) { + int ibuf[3]; + if ( sscanf( ap, "%d/%d/%d", ibuf, ibuf+1, ibuf+2 ) == 3 ) { + VMOVE( comb->rgb, ibuf ); + comb->rgb_valid = 1; + } else { + bu_log("unable to parse 'rgb' attribute '%s'\n", ap); + } + } + if ( (ap = bu_avs_get( &ip->idb_avs, "inherit" )) != NULL ) { + comb->inherit = atoi( ap ); + } + if ( (ap = bu_avs_get( &ip->idb_avs, "region" )) != NULL ) { + /* Presence of this attribute implies it is a region */ + comb->region_flag = 1; + + /* Determine if this is a FASTGEN region */ + switch (*ap) { + case 'V' : /* fallthrough */ + case '2' : + comb->is_fastgen = REGION_FASTGEN_VOLUME; + break; + case 'P' : /* fallthrough */ + case '1' : + comb->is_fastgen = REGION_FASTGEN_PLATE; + break; + case 'R' : /* fallthrough */ + case '0' : + comb->is_fastgen = REGION_NON_FASTGEN; + break; + default: + bu_log("unable to parse 'region' attribute '%s'\n", ap); + break; + } + + /* get the other GIFT "region" attributes */ + if ( (ap = bu_avs_get( &ip->idb_avs, "region_id" )) != NULL ) { + comb->region_id = atoi( ap ); + } + if ( (ap = bu_avs_get( &ip->idb_avs, "aircode" )) != NULL ) { + comb->aircode = atoi( ap ); + } + if ( (ap = bu_avs_get( &ip->idb_avs, "material_id" )) != NULL ) { + comb->GIFTmater = atoi( ap ); + } + if ( (ap = bu_avs_get( &ip->idb_avs, "los" )) != NULL ) { + comb->los = atoi( ap ); + } + } + if ( (ap = bu_avs_get( &ip->idb_avs, "oshader" )) != NULL ) { + bu_vls_strcat( &comb->shader, ap ); + } + + return 0; /* OK */ +} + + +/** + * R T _ C O M B _ G E T + * + * Sets the result string to a description of the given combination. + * Entered via rt_functab[].ft_get(). + */ +int +rt_comb_get(struct bu_vls *logstr, const struct rt_db_internal *intern, const char *item) +{ + const struct rt_comb_internal *comb; + char buf[128]; + + RT_CK_DB_INTERNAL(intern); + comb = (struct rt_comb_internal *)intern->idb_ptr; + RT_CK_COMB(comb); + + if (item==0) { + /* Print out the whole combination. */ + + bu_vls_printf(logstr, "comb region "); + if (comb->region_flag) { + bu_vls_printf(logstr, "yes id %d ", comb->region_id); + + if (comb->aircode) { + bu_vls_printf(logstr, "air %d ", comb->aircode); + } + if (comb->los) { + bu_vls_printf(logstr, "los %d ", comb->los); + } + + if (comb->GIFTmater) { + bu_vls_printf(logstr, "GIFTmater %d ", comb->GIFTmater); + } + } else { + bu_vls_printf(logstr, "no "); + } + + if (comb->rgb_valid) { + bu_vls_printf(logstr, "rgb {%d %d %d} ", V3ARGS(comb->rgb)); + } + + if (bu_vls_strlen(&comb->shader) > 0) { + bu_vls_printf(logstr, "shader {%s} ", bu_vls_addr(&comb->shader)); + } + + if (bu_vls_strlen(&comb->material) > 0) { + bu_vls_printf(logstr, "material %s ", bu_vls_addr(&comb->material)); + } + + if (comb->inherit) { + bu_vls_printf(logstr, "inherit yes "); + } + + bu_vls_printf(logstr, "tree {"); + db_tree_list(logstr, comb->tree); + bu_vls_putc(logstr, '}'); + + return BRLCAD_OK; + } else { + /* Print out only the requested item. */ + register int i; + char itemlwr[128]; + + for (i = 0; i < 128 && item[i]; i++) { + itemlwr[i] = (isupper(item[i]) ? tolower(item[i]) : + item[i]); + } + itemlwr[i] = 0; + + if (strcmp(itemlwr, "region")==0) { + snprintf(buf, 128, "%s", comb->region_flag ? "yes" : "no"); + } else if (strcmp(itemlwr, "id")==0) { + if (!comb->region_flag) goto not_region; + snprintf(buf, 128, "%ld", comb->region_id); + } else if (strcmp(itemlwr, "air")==0) { + if (!comb->region_flag) goto not_region; + snprintf(buf, 128, "%ld", comb->aircode); + } else if (strcmp(itemlwr, "los")==0) { + if (!comb->region_flag) goto not_region; + snprintf(buf, 128, "%ld", comb->los); + } else if (strcmp(itemlwr, "giftmater")==0) { + if (!comb->region_flag) goto not_region; + snprintf(buf, 128, "%ld", comb->GIFTmater); + } else if (strcmp(itemlwr, "rgb")==0) { + if (comb->rgb_valid) + snprintf(buf, 128, "%d %d %d", V3ARGS(comb->rgb)); + else + snprintf(buf, 128, "invalid"); + } else if (strcmp(itemlwr, "shader")==0) { + bu_vls_printf(logstr, "%s", bu_vls_addr(&comb->shader)); + return BRLCAD_OK; + } else if (strcmp(itemlwr, "material")==0) { + bu_vls_printf(logstr, "%s", bu_vls_addr(&comb->material)); + return BRLCAD_OK; + } else if (strcmp(itemlwr, "inherit")==0) { + snprintf(buf, 128, "%s", comb->inherit ? "yes" : "no"); + } else if (strcmp(itemlwr, "tree")==0) { + db_tree_list(logstr, comb->tree); + return BRLCAD_OK; + } else { + bu_vls_printf(logstr, "no such attribute"); + return BRLCAD_ERROR; + } + + bu_vls_printf(logstr, "%s", buf); + return BRLCAD_OK; + + not_region: + bu_vls_printf(logstr, "item not valid for non-region"); + return BRLCAD_ERROR; + } +} + + +/** + * R T _ C O M B _ A D J U S T + * + * Example - + * rgb "1 2 3" ... + * + * Invoked via rt_functab[ID_COMBINATION].ft_adjust() + */ +int +rt_comb_adjust(struct bu_vls *logstr, struct rt_db_internal *intern, int argc, char **argv) +{ + struct rt_comb_internal *comb; + char buf[128]; + int i; + double d; + + RT_CK_DB_INTERNAL(intern); + comb = (struct rt_comb_internal *)intern->idb_ptr; + RT_CK_COMB(comb); + + while (argc >= 2) { + /* Force to lower case */ + for (i=0; i<128 && argv[0][i]!='\0'; i++) + buf[i] = isupper(argv[0][i])?tolower(argv[0][i]):argv[0][i]; + buf[i] = 0; + + if (strcmp(buf, "region")==0) { + if (strcmp(argv[1], "none") == 0) { + comb->region_flag = 0; + } else if (strcmp(argv[1], "no") == 0) { + comb->region_flag = 0; + } else if (strcmp(argv[1], "yes") == 0) { + comb->region_flag = 1; + } else { + if (sscanf(argv[1], "%d", &i) != 1) + return BRLCAD_ERROR; + + if (i != 0) + i = 1; + + comb->region_flag = (char)i; + } + } else if (strcmp(buf, "temp")==0) { + if (!comb->region_flag) goto not_region; + if (strcmp(argv[1], "none") == 0) { + comb->temperature = 0.0; + } else { + if (sscanf(argv[1], "%lf", &d) != 1) + return BRLCAD_ERROR; + comb->temperature = (float)d; + } + } else if (strcmp(buf, "id")==0) { + if (!comb->region_flag) goto not_region; + if (strcmp(argv[1], "none") == 0) { + comb->region_id = 0; + } else { + if (sscanf(argv[1], "%d", &i) != 1) + return BRLCAD_ERROR; + comb->region_id = i; + } + } else if (strcmp(buf, "air")==0) { + if (!comb->region_flag) goto not_region; + if (strcmp(argv[1], "none") == 0) { + comb->aircode = 0; + } else { + if (sscanf(argv[1], "%d", &i) != 1) + return BRLCAD_ERROR; + comb->aircode = i; + } + } else if (strcmp(buf, "los")==0) { + if (!comb->region_flag) goto not_region; + if (strcmp(argv[1], "none") == 0) { + comb->los = 0; + } else { + if (sscanf(argv[1], "%d", &i) != 1) + return BRLCAD_ERROR; + comb->los = i; + } + } else if (strcmp(buf, "giftmater")==0) { + if (!comb->region_flag) goto not_region; + if (strcmp(argv[1], "none") == 0) { + comb->GIFTmater = 0; + } else { + if (sscanf(argv[1], "%d", &i) != 1) + return BRLCAD_ERROR; + comb->GIFTmater = i; + } + } else if (strcmp(buf, "rgb")==0) { + if (strcmp(argv[1], "invalid")==0 || strcmp(argv[1], "none") == 0) { + comb->rgb[0] = comb->rgb[1] = + comb->rgb[2] = 0; + comb->rgb_valid = 0; + } else { + unsigned int r, g, b; + i = sscanf(argv[1], "%u %u %u", + &r, &g, &b); + if (i != 3) { + bu_vls_printf(logstr, "adjust rgb %s: not valid rgb 3-tuple\n", argv[1]); + return BRLCAD_ERROR; + } + comb->rgb[0] = (unsigned char)r; + comb->rgb[1] = (unsigned char)g; + comb->rgb[2] = (unsigned char)b; + comb->rgb_valid = 1; + } + } else if (strcmp(buf, "shader")==0) { + bu_vls_trunc(&comb->shader, 0); + if (strcmp(argv[1], "none")) { + bu_vls_strcat(&comb->shader, argv[1]); + /* Leading spaces boggle the combination exporter */ + bu_vls_trimspace(&comb->shader); + } + } else if (strcmp(buf, "material")==0) { + bu_vls_trunc(&comb->material, 0); + if (strcmp(argv[1], "none")) { + bu_vls_strcat(&comb->material, argv[1]); + bu_vls_trimspace(&comb->material); + } + } else if (strcmp(buf, "inherit")==0) { + if (strcmp(argv[1], "none") == 0) { + comb->inherit = 0; + } else if (strcmp(argv[1], "no") == 0) { + comb->inherit = 0; + } else if (strcmp(argv[1], "yes") == 0) { + comb->inherit = 1; + } else { + if (sscanf(argv[1], "%d", &i) != 1) + return BRLCAD_ERROR; + + if (i != 0) + i = 1; + + comb->inherit = (char)i; + } + } else if (strcmp(buf, "tree")==0) { + union tree *new; + + if (*argv[1] == '\0' || strcmp(argv[1], "none") == 0) { + if (comb->tree) { + db_free_tree(comb->tree, &rt_uniresource); + } + comb->tree = TREE_NULL; + } else { + new = db_tree_parse(logstr, argv[1], &rt_uniresource); + if (new == TREE_NULL) { + bu_vls_printf(logstr, "db adjust tree: bad tree '%s'\n", argv[1]); + return BRLCAD_ERROR; + } + if (comb->tree) + db_free_tree(comb->tree, &rt_uniresource); + comb->tree = new; + } + } else { + bu_vls_printf(logstr, "db adjust %s : no such attribute", buf); + return BRLCAD_ERROR; + } + argc -= 2; + argv += 2; + } + + return BRLCAD_OK; + +not_region: + bu_vls_printf(logstr, "adjusting attribute %s is not valid for a non-region combination.", buf); + return BRLCAD_ERROR; +} + + +/** + * R T _ C O M B _ F O R M + */ +int +rt_comb_form(struct bu_vls *logstr, const struct rt_functab *ftp) +{ + RT_CK_FUNCTAB(ftp); + + bu_vls_printf(logstr, "region {%%s} id {%%d} air {%%d} los {%%d} GIFTmater {%%d} rgb {%%d %%d %%d} shader {%%s} material {%%s} inherit {%%s} tree {%%s}"); + + return BRLCAD_OK; +} + + +/** + * R T _ C O M B _ M A K E + * + * Create a blank combination with appropriate values. Called via + * rt_functab[ID_COMBINATION].ft_make(). + */ +void +rt_comb_make(const struct rt_functab *ftp __attribute__((unused)), struct rt_db_internal *intern) +{ + struct rt_comb_internal *comb; + + intern->idb_major_type = DB5_MAJORTYPE_BRLCAD; + intern->idb_type = ID_COMBINATION; + intern->idb_meth = &rt_functab[ID_COMBINATION]; + intern->idb_ptr = bu_calloc(sizeof(struct rt_comb_internal), 1, + "rt_comb_internal"); + + comb = (struct rt_comb_internal *)intern->idb_ptr; + comb->magic = (long)RT_COMB_MAGIC; + comb->temperature = -1; + comb->tree = (union tree *)0; + comb->region_flag = 1; + comb->region_id = 0; + comb->aircode = 0; + comb->GIFTmater = 0; + comb->los = 0; + comb->rgb_valid = 0; + comb->rgb[0] = comb->rgb[1] = comb->rgb[2] = 0; + bu_vls_init(&comb->shader); + bu_vls_init(&comb->material); + comb->inherit = 0; +} + + +/* + * Local Variables: + * mode: C + * tab-width: 8 + * indent-tabs-mode: t + * c-file-style: "stroustrup" + * End: + * ex: shiftwidth=4 tabstop=8 + */ Deleted: brlcad/trunk/src/librt/comb/db5_comb.c =================================================================== --- brlcad/trunk/src/librt/comb/db5_comb.c 2010-03-02 17:53:46 UTC (rev 37845) +++ brlcad/trunk/src/librt/comb/db5_comb.c 2010-03-02 17:56:27 UTC (rev 37846) @@ -1,1120 +0,0 @@ -/* D B 5 _ C O M B . C - * BRL-CAD - * - * Copyright (c) 2004-2010 United States Government as represented by - * the U.S. Army Research Laboratory. - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public License - * version 2.1 as published by the Free Software Foundation. - * - * This library is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this file; see the file named COPYING for more - * information. - */ -/** @addtogroup db5 */ -/** @{ */ -/** @file db5_comb.c - * - * Implement support for combinations in v5 format. - * - * The on-disk record looks like this: - * width byte - * n matricies (only non-identity matricies stored). - * n leaves - * len of RPN expression. (len=0 signals all-union expression) - * depth of stack - * Section 1: matricies - * Section 2: leaves - * Section 3: (Optional) RPN expression. - * - * Encoding of a matrix is (ELEMENTS_PER_MAT * SIZEOF_NETWORK_DOUBLE) - * bytes, in network order (big-Endian, IEEE double precision). - * - */ -/** @} */ - -#include "common.h" - -#include <stdlib.h> -#include <stdio.h> -#include <string.h> -#include <ctype.h> -#include "bio.h" - -#include "bu.h" -#include "vmath.h" -#include "bn.h" -#include "db5.h" -#include "raytrace.h" - - -struct db_tree_counter_state { - long magic; - long n_mat; /* # leaves with non-identity matricies */ - long n_leaf; /* # leaf nodes */ - long n_oper; /* # operator nodes */ - long leafbytes; /* # bytes for name section */ - int non_union_seen; /* boolean, 1 = non-unions seen */ -}; -#define DB_TREE_COUNTER_STATE_MAGIC 0x64546373 /* dTcs */ -#define DB_CK_TREE_COUNTER_STATE(_p) BU_CKMAG(_p, DB_TREE_COUNTER_STATE_MAGIC, "db_tree_counter_state"); - - -/** - * D B _ T R E E _ C O U N T E R - * - * Count number of non-identity matricies, - * number of leaf nodes, number of operator nodes, etc. - * - * Returns - - * maximum depth of stack needed to unpack this tree, if serialized. - * - * Notes - - * We over-estimate the size of the width fields used for - * holding the matrix subscripts. - * The caller is responsible for correcting by saying: - * tcsp->leafbytes -= tcsp->n_leaf * (8 - db5_enc_len[wid]); - */ -long -db_tree_counter( const union tree *tp, struct db_tree_counter_state *tcsp ) -{ - long ldepth, rdepth; - - RT_CK_TREE(tp); - DB_CK_TREE_COUNTER_STATE(tcsp); - - switch ( tp->tr_op ) { - case OP_DB_LEAF: - tcsp->n_leaf++; - if ( tp->tr_l.tl_mat && !bn_mat_is_identity(tp->tr_l.tl_mat) ) tcsp->n_mat++; - /* Over-estimate storage requirement for matrix # */ - tcsp->leafbytes += (long)strlen(tp->tr_l.tl_name) + 1 + 8; - return 1; - - case OP_NOT: - /* Unary ops */ - tcsp->n_oper++; - tcsp->non_union_seen = 1; - return 1 + db_tree_counter( tp->tr_b.tb_left, tcsp ); - - case OP_UNION: - /* This node is known to be a binary op */ - tcsp->n_oper++; - ldepth = db_tree_counter( tp->tr_b.tb_left, tcsp ); - rdepth = db_tree_counter( tp->tr_b.tb_right, tcsp ); - if ( ldepth > rdepth ) return ldepth; - return rdepth; - - case OP_INTERSECT: - case OP_SUBTRACT: - case OP_XOR: - /* This node is known to be a binary op */ - tcsp->n_oper++; - tcsp->non_union_seen = 1; - ldepth = db_tree_counter( tp->tr_b.tb_left, tcsp ); - rdepth = db_tree_counter( tp->tr_b.tb_right, tcsp ); - if ( ldepth > rdepth ) return ldepth; - return rdepth; - - default: - bu_log("db_tree_counter: bad op %d\n", tp->tr_op); - bu_bomb("db_tree_counter\n"); - /* NOTREACHED */ - } - /* NOTREACHED */ - return 0; -} - -#define DB5COMB_TOKEN_LEAF 1 -#define DB5COMB_TOKEN_UNION 2 -#define DB5COMB_TOKEN_INTERSECT 3 -#define DB5COMB_TOKEN_SUBTRACT 4 -#define DB5COMB_TOKEN_XOR 5 -#define DB5COMB_TOKEN_NOT 6 - -struct rt_comb_v5_serialize_state { - long magic; - long mat_num; /* current matrix number */ - long nmat; /* # matricies, total */ - unsigned char *matp; - unsigned char *leafp; - unsigned char *exprp; - int wid; -}; -#define RT_COMB_V5_SERIALIZE_STATE_MAGIC 0x43357373 /* C5ss */ -#define RT_CK_COMB_V5_SERIALIZE_STATE(_p) BU_CKMAG(_p, RT_COMB_V5_SERIALIZE_STATE_MAGIC, "rt_comb_v5_serialize_state") - - -/** - * R T _ C O M B _ V 5 _ S E R I A L I Z E - * - * In one single pass through the tree, serialize out all three output - * sections at once. - */ -void -rt_comb_v5_serialize( - const union tree *tp, - struct rt_comb_v5_serialize_state *ssp) -{ - size_t n; - int mi; - - RT_CK_TREE(tp); - RT_CK_COMB_V5_SERIALIZE_STATE(ssp); - - switch ( tp->tr_op ) { - case OP_DB_LEAF: - /* - * Encoding of the leaf: A null-terminated name string, - *and the matrix subscript. -1 == identity. - */ - n = strlen(tp->tr_l.tl_name) + 1; - memcpy(ssp->leafp, tp->tr_l.tl_name, n); - ssp->leafp += n; - - if ( tp->tr_l.tl_mat && !bn_mat_is_identity(tp->tr_l.tl_mat) ) - mi = ssp->mat_num++; - else - mi = -1; - BU_ASSERT_LONG( mi, <, ssp->nmat ); - ssp->leafp = db5_encode_length( ssp->leafp, mi, ssp->wid ); - - /* Encoding of the matrix */ - if ( mi > -1 ) { - htond( ssp->matp, - (const unsigned char *)tp->tr_l.tl_mat, - ELEMENTS_PER_MAT ); - ssp->matp += ELEMENTS_PER_MAT * SIZEOF_NETWORK_DOUBLE; - } - - /* Encoding of the "leaf" operator */ - if ( ssp->exprp ) - *ssp->exprp++ = DB5COMB_TOKEN_LEAF; - return; - - case OP_NOT: - /* Unary ops */ - rt_comb_v5_serialize( tp->tr_b.tb_left, ssp ); - if ( ssp->exprp ) - *ssp->exprp++ = DB5COMB_TOKEN_NOT; - return; - - case OP_UNION: - /* This node is known to be a binary op */ - rt_comb_v5_serialize( tp->tr_b.tb_left, ssp ); - rt_comb_v5_serialize( tp->tr_b.tb_right, ssp ); - if ( ssp->exprp ) - *ssp->exprp++ = DB5COMB_TOKEN_UNION; - return; - case OP_INTERSECT: - /* This node is known to be a binary op */ - rt_comb_v5_serialize( tp->tr_b.tb_left, ssp ); - rt_comb_v5_serialize( tp->tr_b.tb_right, ssp ); - if ( ssp->exprp ) - *ssp->exprp++ = DB5COMB_TOKEN_INTERSECT; - return; - case OP_SUBTRACT: - /* This node is known to be a binary op */ - rt_comb_v5_serialize( tp->tr_b.tb_left, ssp ); - rt_comb_v5_serialize( tp->tr_b.tb_right, ssp ); - if ( ssp->exprp ) - *ssp->exprp++ = DB5COMB_TOKEN_SUBTRACT; - return; - case OP_XOR: - /* This node is known to be a binary op */ - rt_comb_v5_serialize( tp->tr_b.tb_left, ssp ); - rt_comb_v5_serialize( tp->tr_b.tb_right, ssp ); - if ( ssp->exprp ) - *ssp->exprp++ = DB5COMB_TOKEN_XOR; - return; - - default: - bu_log("rt_comb_v5_serialize: bad op %d\n", tp->tr_op); - bu_bomb("rt_comb_v5_serialize\n"); - } -} - - -/** - * R T _ C O M B _ E X P O R T 5 - */ -int -rt_comb_export5( - struct bu_external *ep, - const struct rt_db_internal *ip, - double local2mm __attribute__((unused)), - const struct db_i *dbip, - struct resource *resp) -{ - struct rt_comb_internal *comb; - struct db_tree_counter_state tcs; - struct rt_comb_v5_serialize_state ss; - long max_stack_depth; - long need; - int rpn_len = 0; /* # items in RPN expression */ - int wid; - unsigned char *cp; - unsigned char *leafp_end; - struct bu_attribute_value_set *avsp; - struct bu_vls value; - - RT_CK_DB_INTERNAL( ip ); - RT_CK_RESOURCE(resp); - if (dbip) RT_CK_DBI(dbip); - - if ( ip->idb_type != ID_COMBINATION ) bu_bomb("rt_comb_export5() type not ID_COMBINATION"); - comb = (struct rt_comb_internal *)ip->idb_ptr; - RT_CK_COMB(comb); - - /* First pass -- count number of non-identity matricies, number of - * leaf nodes, number of operator nodes. - */ - memset((char *)&tcs, 0, sizeof(tcs)); - tcs.magic = DB_TREE_COUNTER_STATE_MAGIC; - if ( comb->tree ) - max_stack_depth = db_tree_counter( comb->tree, &tcs ); - else - max_stack_depth = 0; /* some combinations have no tree */ - - if ( tcs.non_union_seen ) { - /* RPN expression needs one byte for each leaf or operator node */ - rpn_len = tcs.n_leaf + tcs.n_oper; - } else { - rpn_len = 0; - } - - wid = db5_select_length_encoding( - tcs.n_mat | tcs.n_leaf | tcs.leafbytes | - rpn_len | max_stack_depth ); - - /* Apply correction factor to tcs.leafbytes now that we know - * 'wid'. Ignore the slight chance that a smaller 'wid' might now - * be possible. - */ - tcs.leafbytes -= tcs.n_leaf * (8 - db5_enc_len[wid]); - - /* Second pass -- determine amount of on-disk storage needed */ - need = 1 + /* width code */ - db5_enc_len[wid] + /* size for nmatricies */ - db5_enc_len[wid] + /* size for nleaves */ - db5_enc_len[wid] + /* size for leafbytes */ - db5_enc_len[wid] + /* size for len of RPN */ - db5_enc_len[wid] + /* size for max_stack_depth */ - tcs.n_mat * (ELEMENTS_PER_MAT * SIZEOF_NETWORK_DOUBLE) + /* sizeof matrix array */ - tcs.leafbytes + /* size for leaf nodes */ - rpn_len; /* storage for RPN expression */ - - BU_INIT_EXTERNAL(ep); - ep->ext_nbytes = need; - ep->ext_buf = bu_calloc( 1, need, "rt_comb_export5 ext_buf" ); - - /* Build combination's on-disk header section */ - cp = (unsigned char *)ep->ext_buf; - *cp++ = wid; - cp = db5_encode_length( cp, tcs.n_mat, wid ); - cp = db5_encode_length( cp, tcs.n_leaf, wid ); - cp = db5_encode_length( cp, tcs.leafbytes, wid ); - cp = db5_encode_length( cp, rpn_len, wid ); - cp = db5_encode_length( cp, max_stack_depth, wid ); - - /* - * The output format has three sections: - * Section 1: matricies - * Section 2: leaf nodes - * Section 3: Optional RPN expression - * - * We have pre-computed the exact size of all three sections, so - * they can all be searialized together in one pass. Establish - * pointers to the start of each section. - */ - ss.magic = RT_COMB_V5_SERIALIZE_STATE_MAGIC; - ss.wid = wid; - ss.mat_num = 0; - ss.nmat = tcs.n_mat; - ss.matp = cp; - ss.leafp = cp + tcs.n_mat * (ELEMENTS_PER_MAT * SIZEOF_NETWORK_DOUBLE); - leafp_end = ss.leafp + tcs.leafbytes; - if ( rpn_len ) - ss.exprp = leafp_end; - else - ss.exprp = NULL; - - if ( comb->tree ) - rt_comb_v5_serialize( comb->tree, &ss ); - - BU_ASSERT_LONG( ss.mat_num, ==, tcs.n_mat ); - BU_ASSERT_PTR( ss.matp, ==, cp + tcs.n_mat * (ELEMENTS_PER_MAT * SIZEOF_NETWORK_DOUBLE) ); - BU_ASSERT_PTR( ss.leafp, ==, leafp_end ); - if ( rpn_len ) - BU_ASSERT_PTR( ss.exprp, <=, ((unsigned char *)ep->ext_buf) + ep->ext_nbytes ); - - /* Encode all the other stuff as attributes. */ - bu_vls_init( &value ); - /* WARNING: We remove const from the ip pointer!!! */ - avsp = (struct bu_attribute_value_set *)&ip->idb_avs; - if ( avsp->magic != BU_AVS_MAGIC ) - bu_avs_init( avsp, 32, "rt_comb v5 attributes" ); - if ( comb->region_flag ) { - /* Presence of this attribute means this comb is a region. - * Current code values are 0, 1, and 2; all are regions. See - * raytrace.h for meanings of different values - */ - bu_vls_trunc( &value, 0 ); - switch (comb->is_fastgen) { - case REGION_FASTGEN_PLATE: - bu_vls_printf(&value, "P"); - break; - case REGION_FASTGEN_VOLUME: - bu_vls_printf(&value, "V"); - break; - case REGION_NON_FASTGEN: /* fallthrough */ - default: - bu_vls_printf(&value, "R"); - break; - } - bu_avs_add_vls( avsp, "region", &value ); - } else - bu_avs_remove( avsp, "region" ); - - if ( comb->inherit ) - bu_avs_add( avsp, "inherit", "1" ); - else - bu_avs_remove( avsp, "inherit" ); - - if ( comb->rgb_valid ) { - bu_vls_trunc( &value, 0 ); - bu_vls_printf( &value, "%d/%d/%d", V3ARGS(comb->rgb) ); - bu_avs_add_vls( avsp, "rgb", &value ); - } else - bu_avs_remove( avsp, "rgb" ); - - /* optical shader string goes in an attribute */ - if ( bu_vls_strlen( &comb->shader ) > 0 ) - bu_avs_add_vls( avsp, "oshader", &comb->shader ); - else - bu_avs_remove( avsp, "oshader" ); - - /* GIFT compatability */ - if ( comb->region_id != 0 ) { - bu_vls_trunc( &value, 0 ); - bu_vls_printf( &value, "%d", comb->region_id ); - bu_avs_add_vls( avsp, "region_id", &value ); - } else - bu_avs_remove( avsp, "region_id" ); - - if ( comb->aircode != 0 ) { - bu_vls_trunc( &value, 0 ); - bu_vls_printf( &value, "%d", comb->aircode ); - bu_avs_add_vls( avsp, "aircode", &value ); - } else - bu_avs_remove( avsp, "aircode" ); - - if ( comb->GIFTmater != 0 ) { - bu_vls_trunc( &value, 0 ); - bu_vls_printf( &value, "%d", comb->GIFTmater ); - bu_avs_add_vls( avsp, "material_id", &value ); - } else - bu_avs_remove( avsp, "material_id" ); - - if ( comb->los != 0 ) { - bu_vls_trunc( &value, 0 ); - bu_vls_printf( &value, "%d", comb->los ); - bu_avs_add_vls( avsp, "los", &value ); - } else - bu_avs_remove( avsp, "los" ); - - bu_vls_free( &value ); - return 0; /* OK */ -} - - -/** - * R T _ C O M B _ I M P O R T 5 - * - * Read a combination object in v5 external (on-disk) format, and - * convert it into the internal format described in rtgeom.h - * - * This is an unusual conversion, because some of the data is taken - * from attributes, not just from the object body. By the time this - * is called, the attributes will already have been cracked into - * ip->idb_avs, we get the attributes from there. - * - * Returns - - * 0 OK - * -1 FAIL - */ -int -rt_comb_import5(struct rt_db_internal *ip, const struct bu_external *ep, const mat_t mat, const struct db_i *dbip, struct resource *resp) -{ - struct rt_comb_internal *comb; - unsigned char *cp; - int wid; - size_t nmat, nleaf, rpn_len, max_stack_depth; - size_t leafbytes; - unsigned char *matp; - unsigned char *leafp; - unsigned char *leafp_end; - unsigned char *exprp; -#define MAX_V5_STACK 8000 - union tree *stack[MAX_V5_STACK]; - union tree **sp; /* stack pointer */ - const char *ap; - size_t ius; - - RT_CK_DB_INTERNAL( ip ); - BU_CK_EXTERNAL(ep); - RT_CK_DBI(dbip); - RT_CK_RESOURCE(resp); - - ip->idb_major_type = DB5_MAJORTYPE_BRLCAD; - ip->idb_type = ID_COMBINATION; - ip->idb_meth = &rt_functab[ID_COMBINATION]; - BU_GETSTRUCT( comb, rt_comb_internal ); - ip->idb_ptr = (genptr_t)comb; - comb->magic = RT_COMB_MAGIC; - bu_vls_init( &comb->shader ); - bu_vls_init( &comb->material ); - comb->temperature = -1; - - cp = ep->ext_buf; - wid = *cp++; - cp += db5_decode_length( &nmat, cp, wid ); - cp += db5_decode_length( &nleaf, cp, wid ); - cp += db5... [truncated message content] |
From: <br...@us...> - 2010-03-02 18:19:49
|
Revision: 37847 http://brlcad.svn.sourceforge.net/brlcad/?rev=37847&view=rev Author: brlcad Date: 2010-03-02 18:19:42 +0000 (Tue, 02 Mar 2010) Log Message: ----------- separate out the attribute routines from db5_io.c into their own file, attributes.c, so their logic can be better grouped (this should includes _GLOBAL management) Modified Paths: -------------- brlcad/trunk/src/librt/CMakeLists.txt brlcad/trunk/src/librt/Makefile.am brlcad/trunk/src/librt/db5_io.c Added Paths: ----------- brlcad/trunk/src/librt/attributes.c Modified: brlcad/trunk/src/librt/CMakeLists.txt =================================================================== --- brlcad/trunk/src/librt/CMakeLists.txt 2010-03-02 17:56:27 UTC (rev 37846) +++ brlcad/trunk/src/librt/CMakeLists.txt 2010-03-02 18:19:42 UTC (rev 37847) @@ -1,4 +1,5 @@ set(LIBRT_SOURCES + attributes.c bezier_2d_isect.c binunif/binunif.c binunif/db5_bin.c Modified: brlcad/trunk/src/librt/Makefile.am =================================================================== --- brlcad/trunk/src/librt/Makefile.am 2010-03-02 17:56:27 UTC (rev 37846) +++ brlcad/trunk/src/librt/Makefile.am 2010-03-02 18:19:42 UTC (rev 37847) @@ -33,6 +33,7 @@ librt_xxx_la_SOURCES = primitives/xxx/xxx.c librt_nil_la_SOURCES = \ + attributes.c \ bezier_2d_isect.c \ binunif/binunif.c \ binunif/db5_bin.c \ Added: brlcad/trunk/src/librt/attributes.c =================================================================== --- brlcad/trunk/src/librt/attributes.c (rev 0) +++ brlcad/trunk/src/librt/attributes.c 2010-03-02 18:19:42 UTC (rev 37847) @@ -0,0 +1,568 @@ +/* A T T R I B U T E S . C + * BRL-CAD + * + * Copyright (c) 2010 United States Government as represented by + * the U.S. Army Research Laboratory. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public License + * version 2.1 as published by the Free Software Foundation. + * + * This library is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this file; see the file named COPYING for more + * information. + */ + +#include "common.h" + +#include <string.h> + +#include "bu.h" +#include "raytrace.h" + + +/** + * D B 5 _ I M P O R T _ A T T R I B U T E S + * + * Convert the on-disk encoding into a handy easy-to-use + * bu_attribute_value_set structure. + * + * Take advantage of the readonly_min/readonly_max capability so that + * we don't have to bu_strdup() each string, but can simply point to + * it in the provided buffer *ap. Important implication: don't free + * *ap until you're done with this avs. + * + * The upshot of this is that bu_avs_add() and bu_avs_remove() can be + * safely used with this *avs. + * + * Returns - + * >0 count of attributes successfully imported + * -1 Error, mal-formed input + */ +int +db5_import_attributes(struct bu_attribute_value_set *avs, const struct bu_external *ap) +{ + const char *cp; + const char *ep; + int count = 0; + + BU_CK_EXTERNAL(ap); + + BU_ASSERT_LONG(ap->ext_nbytes, >=, 4); + + /* First pass -- count number of attributes */ + cp = (const char *)ap->ext_buf; + ep = (const char *)ap->ext_buf+ap->ext_nbytes; + + /* Null "name" string indicates end of attribute list */ + while (*cp != '\0') { + if (cp >= ep) { + bu_log("db5_import_attributes() ran off end of buffer, database is probably corrupted\n"); + return -1; + } + cp += strlen(cp)+1; /* value */ + cp += strlen(cp)+1; /* next name */ + count++; + } + /* Ensure we're exactly at the end */ + BU_ASSERT_PTR(cp+1, ==, ep); + + /* not really needed for AVS_ADD since bu_avs_add will + * incrementally allocate as it needs it. but one alloc is better + * than many in case there are many attributes. + */ + bu_avs_init(avs, count, "db5_import_attributes"); + + /* Second pass -- populate attributes. Peek inside struct for non AVS_ADD. */ + +/* Use AVS_ADD to copy the values from the external buffer instead of + * using them directly without copying. This presumes ap will not get + * free'd before we're done with the avs. Preference should be to + * leave AVS_ADD undefined for performance reasons. + */ +#define AVS_ADD 1 + +#if AVS_ADD + cp = (const char *)ap->ext_buf; + while (*cp != '\0') { + const char *name = cp; /* name */ + cp += strlen(cp)+1; /* value */ + bu_avs_add(avs, name, cp); + cp += strlen(cp)+1; /* next name */ + } +#else + /* Conserve malloc/free activity -- use strings in input buffer */ + /* Signal region of memory that input comes from */ + cp = (const char *)ap->ext_buf; + app = avs->avp; + while (*cp != '\0') { + app->name = cp; /* name */ + cp += strlen(cp)+1; + app->value = cp; /* value */ + cp += strlen(cp)+1; + app++; + avs->count++; + } + + /* expand the readonly section if necessary */ + if ((!avs->readonly_min) || ((genptr_t)avs->readonly_min > (genptr_t)ap->ext_buf)) { + avs->readonly_min = (genptr_t)ap->ext_buf; + } + if ((!avs->readonly_max) || ((genptr_t)avs->readonly_max < (genptr_t)(avs->readonly_min + ap->ext_nbytes))) { + avs->readonly_max = (genptr_t)avs->readonly_min + ap->ext_nbytes; + } +#endif + + BU_ASSERT_PTR(cp+1, ==, ep); + BU_ASSERT_LONG(avs->count, <=, avs->max); + BU_ASSERT_LONG((size_t)avs->count, ==, (size_t)count); + + if (bu_debug & BU_DEBUG_AVS) { + bu_avs_print(avs, "db5_import_attributes"); + } + return avs->count; +} + + +/** + * D B 5 _ E X P O R T _ A T T R I B U T E S + * + * Encode the attribute-value pair information into the external + * on-disk format. + * + * The on-disk encoding is: + * + * name1 NULL value1 NULL ... nameN NULL valueN NULL NULL + * + * 'ext' is initialized on behalf of the caller. + */ +void +db5_export_attributes(struct bu_external *ext, const struct bu_attribute_value_set *avs) +{ + size_t need = 0; + const struct bu_attribute_value_pair *avpp; + char *cp; + size_t i; + + BU_CK_AVS(avs); + BU_INIT_EXTERNAL(ext); + + if (avs->count <= 0) { + return; + } + + if (bu_debug & BU_DEBUG_AVS) { + bu_avs_print(avs, "db5_export_attributes"); + } + + /* First pass -- determine how much space is required */ + need = 0; + avpp = avs->avp; + for (i = 0; i < (size_t)avs->count; i++, avpp++) { + if (avpp->name) { + need += (int)strlen(avpp->name) + 1; /* include room for NULL */ + } else { + need += 1; + } + if (avpp->value) { + need += (int)strlen(avpp->value) + 1; /* include room for NULL */ + } else { + need += 1; + } + } + /* include final null */ + need += 1; + + if (need <= 1) { + /* nothing to do */ + return; + } + + ext->ext_nbytes = need; + ext->ext_buf = bu_calloc(1, need, "external attributes"); + + /* Second pass -- store in external form */ + cp = (char *)ext->ext_buf; + avpp = avs->avp; + for (i = 0; i < avs->count; i++, avpp++) { + int len; + + if (avpp->name) { + len = (int)strlen(avpp->name); + memcpy(cp, avpp->name, len); + cp += len + 1; + } + *cp = '\0'; /* pad null */ + + if (avpp->value) { + len = (int)strlen(avpp->value); + memcpy(cp, avpp->value, strlen(avpp->value)); + cp += len + 1; + } + *cp = '\0'; /* pad null */ + } + *(cp++) = '\0'; /* final null */ + + /* sanity check */ + need = cp - ((char *)ext->ext_buf); + BU_ASSERT_LONG(need, ==, ext->ext_nbytes); +} + + +/** + * D B 5 _ R E P L A C E _ A T T R I B U T E S + * + * Replace the attributes of a given database object. + * + * For efficiency, this is done without looking at the object body at + * all. Contents of the bu_attribute_value_set are freed, but not the + * struct itself. + * + * Returns - + * 0 on success + * <0 on error + */ +int +db5_replace_attributes(struct directory *dp, struct bu_attribute_value_set *avsp, struct db_i *dbip) +{ + struct bu_external ext; + struct db5_raw_internal raw; + struct bu_external attr; + struct bu_external ext2; + int ret; + + RT_CK_DIR(dp); + BU_CK_AVS(avsp); + RT_CK_DBI(dbip); + + if (RT_G_DEBUG&DEBUG_DB) { + bu_log("db5_replace_attributes(%s) dbip=x%x\n", + dp->d_namep, dbip); + bu_avs_print(avsp, "new attributes"); + } + + if (dbip->dbi_read_only) { + bu_log("db5_replace_attributes(%s): READ-ONLY file\n", + dbip->dbi_filename); + return -1; + } + + BU_ASSERT_LONG(dbip->dbi_version, ==, 5); + + if (db_get_external(&ext, dp, dbip) < 0) + return -2; /* FAIL */ + + if (db5_get_raw_internal_ptr(&raw, ext.ext_buf) == NULL) { + bu_log("db5_replace_attributes(%s): import failure\n", + dp->d_namep); + bu_free_external(&ext); + return -3; + } + + db5_export_attributes(&attr, avsp); + BU_INIT_EXTERNAL(&ext2); + db5_export_object3(&ext2, + raw.h_dli, + dp->d_namep, + raw.h_name_hidden, + &attr, + &raw.body, + raw.major_type, raw.minor_type, + raw.a_zzz, raw.b_zzz); + + /* Write it */ + ret = db_put_external5(&ext2, dp, dbip); + if (ret < 0) bu_log("db5_replace_attributes(%s): db_put_external5() failure\n", + dp->d_namep); + + bu_free_external(&attr); + bu_free_external(&ext2); + bu_free_external(&ext); /* 'raw' is now invalid */ + bu_avs_free(avsp); + + return ret; +} + + +/** + * D B 5 _ U P D A T E _ A T T R I B U T E S + * + * Update an arbitrary number of attributes on a given database + * object. For efficiency, this is done without looking at the object + * body at all. + * + * Contents of the bu_attribute_value_set are freed, but not the + * struct itself. + * + * Returns - + * 0 on success + * <0 on error + */ +int +db5_update_attributes(struct directory *dp, struct bu_attribute_value_set *avsp, struct db_i *dbip) +{ + struct bu_external ext; + struct db5_raw_internal raw; + struct bu_attribute_value_set old_avs; + struct bu_external attr; + struct bu_external ext2; + int ret; + + RT_CK_DIR(dp); + BU_CK_AVS(avsp); + RT_CK_DBI(dbip); + + if (RT_G_DEBUG&DEBUG_DB) { + bu_log("db5_update_attributes(%s) dbip=x%x\n", + dp->d_namep, dbip); + bu_avs_print(avsp, "new attributes"); + } + + if (dbip->dbi_read_only) { + bu_log("db5_update_attributes(%s): READ-ONLY file\n", + dbip->dbi_filename); + return -1; + } + + BU_ASSERT_LONG(dbip->dbi_version, ==, 5); + + if (db_get_external(&ext, dp, dbip) < 0) + return -2; /* FAIL */ + + if (db5_get_raw_internal_ptr(&raw, ext.ext_buf) == NULL) { + bu_log("db5_update_attributes(%s): import failure\n", + dp->d_namep); + bu_free_external(&ext); + return -3; + } + + /* db5_import_attributes will allocate space */ + bu_avs_init_empty(&old_avs); + + if (raw.attributes.ext_buf) { + if (db5_import_attributes(&old_avs, &raw.attributes) < 0) { + bu_log("db5_update_attributes(%s): mal-formed attributes in database\n", + dp->d_namep); + bu_avs_free(&old_avs); + bu_free_external(&ext); + return -8; + } + } + + bu_avs_merge(&old_avs, avsp); + + db5_export_attributes(&attr, &old_avs); + BU_INIT_EXTERNAL(&ext2); + db5_export_object3(&ext2, + raw.h_dli, + dp->d_namep, + raw.h_name_hidden, + &attr, + &raw.body, + raw.major_type, raw.minor_type, + raw.a_zzz, raw.b_zzz); + + /* Write it */ + ret = db_put_external5(&ext2, dp, dbip); + if (ret < 0) { + bu_log("db5_update_attributes(%s): db_put_external5() failure\n", dp->d_namep); + } + + bu_free_external(&attr); + bu_free_external(&ext2); + bu_free_external(&ext); /* 'raw' is now invalid */ + bu_avs_free(&old_avs); + bu_avs_free(avsp); + + return ret; +} + + +/** + * D B 5 _ U P D A T E _ A T T R I B U T E + * + * A convenience routine to update the value of a single attribute. + * + * Returns - + * 0 on success + * <0 on error + */ +int +db5_update_attribute(const char *obj_name, const char *name, const char *value, struct db_i *dbip) +{ + struct directory *dp; + struct bu_attribute_value_set avs; + + RT_CK_DBI(dbip); + if ((dp = db_lookup(dbip, obj_name, LOOKUP_NOISY)) == DIR_NULL) + return -1; + + bu_avs_init(&avs, 2, "db5_update_attribute"); + bu_avs_add(&avs, name, value); + + return db5_update_attributes(dp, &avs, dbip); +} + + +/** + * D B 5 _ U P D A T E _ I D E N T + * + * Update the _GLOBAL object, which in v5 serves the place of the + * "ident" header record in v4 as the place to stash global + * information. Since every database will have one of these things, + * it's no problem to update it. + * + * Returns - + * 0 Success + * -1 Fatal Error + */ +int db5_update_ident(struct db_i *dbip, const char *title, double local2mm) +{ + struct bu_attribute_value_set avs; + struct directory *dp; + struct bu_vls units; + int ret; + char *old_title = NULL; + + RT_CK_DBI(dbip); + + if ((dp = db_lookup(dbip, DB5_GLOBAL_OBJECT_NAME, LOOKUP_QUIET)) == DIR_NULL) { + struct bu_external global; + unsigned char minor_type=0; + + bu_log("db5_update_ident() WARNING: %s object is missing, creating new one.\nYou may have lost important global state when you deleted this object.\n", + DB5_GLOBAL_OBJECT_NAME); + + /* OK, make one. It will be empty to start with, updated below. */ + db5_export_object3(&global, + DB5HDR_HFLAGS_DLI_APPLICATION_DATA_OBJECT, + DB5_GLOBAL_OBJECT_NAME, DB5HDR_HFLAGS_HIDDEN_OBJECT, NULL, NULL, + DB5_MAJORTYPE_ATTRIBUTE_ONLY, 0, + DB5_ZZZ_UNCOMPRESSED, DB5_ZZZ_UNCOMPRESSED); + + dp = db_diradd(dbip, DB5_GLOBAL_OBJECT_NAME, -1L, 0, 0, (genptr_t)&minor_type); + dp->d_major_type = DB5_MAJORTYPE_ATTRIBUTE_ONLY; + if (db_put_external(&global, dp, dbip) < 0) { + bu_log("db5_update_ident() unable to create replacement %s object!\n", DB5_GLOBAL_OBJECT_NAME); + bu_free_external(&global); + return -1; + } + bu_free_external(&global); + } + + bu_vls_init(&units); + bu_vls_printf(&units, "%.25e", local2mm); + + bu_avs_init(&avs, 4, "db5_update_ident"); + bu_avs_add(&avs, "title", title); + bu_avs_add(&avs, "units", bu_vls_addr(&units)); + + ret = db5_update_attributes(dp, &avs, dbip); + bu_vls_free(&units); + bu_avs_free(&avs); + + /* protect from loosing memory and from freeing what we are + about to dup */ + if (dbip->dbi_title) { + old_title = dbip->dbi_title; + } + dbip->dbi_title = bu_strdup(title); + if (old_title) { + bu_free(old_title, "replaced dbi_title with new"); + } + + return ret; +} + + +/** + * D B 5 _ F W R I T E _ I D E N T + * + * Create a header for a v5 database. + * + * This routine has the same calling sequence as db_fwrite_ident() + * which makes a v4 database header. + * + * In the v5 database, two database objects must be created to match + * the semantics of what was in the v4 header: + * + * First, a database header object. + * + * Second, create a specially named attribute-only object which + * contains the attributes "title=" and "units=". + * + * This routine should only be used by db_create(). Everyone else + * should use db5_update_ident(). + * + * Returns - + * 0 Success + * -1 Fatal Error + */ +int +db5_fwrite_ident(FILE *fp, const char *title, double local2mm) +{ + struct bu_attribute_value_set avs; + struct bu_vls units; + struct bu_external out; + struct bu_external attr; + int result; + + if (local2mm <= 0) { + bu_log("db5_fwrite_ident(%s, %g) local2mm <= 0\n", + title, local2mm); + return -1; + } + + /* First, write the header object */ + db5_export_object3(&out, DB5HDR_HFLAGS_DLI_HEADER_OBJECT, + NULL, 0, NULL, NULL, + DB5_MAJORTYPE_RESERVED, 0, + DB5_ZZZ_UNCOMPRESSED, DB5_ZZZ_UNCOMPRESSED); + + result = bu_fwrite_external(fp, &out); + bu_free_external(&out); + if (result < 0) { + return -1; + } + + /* Second, create the attribute-only object */ + bu_vls_init(&units); + bu_vls_printf(&units, "%.25e", local2mm); + + bu_avs_init(&avs, 4, "db5_fwrite_ident"); + bu_avs_add(&avs, "title", title); + bu_avs_add(&avs, "units", bu_vls_addr(&units)); + + db5_export_attributes(&attr, &avs); + db5_export_object3(&out, DB5HDR_HFLAGS_DLI_APPLICATION_DATA_OBJECT, + DB5_GLOBAL_OBJECT_NAME, DB5HDR_HFLAGS_HIDDEN_OBJECT, &attr, NULL, + DB5_MAJORTYPE_ATTRIBUTE_ONLY, 0, + DB5_ZZZ_UNCOMPRESSED, DB5_ZZZ_UNCOMPRESSED); + + result = bu_fwrite_external(fp, &out); + bu_free_external(&out); + bu_free_external(&attr); + bu_avs_free(&avs); + bu_vls_free(&units); + if (result < 0) { + return -1; + } + + return 0; +} + + +/* + * Local Variables: + * tab-width: 8 + * mode: C + * indent-tabs-mode: t + * c-file-style: "stroustrup" + * End: + * ex: shiftwidth=4 tabstop=8 + */ Property changes on: brlcad/trunk/src/librt/attributes.c ___________________________________________________________________ Added: svn:mime-type + text/plain Added: svn:eol-style + native Modified: brlcad/trunk/src/librt/db5_io.c =================================================================== --- brlcad/trunk/src/librt/db5_io.c 2010-03-02 17:56:27 UTC (rev 37846) +++ brlcad/trunk/src/librt/db5_io.c 2010-03-02 18:19:42 UTC (rev 37847) @@ -40,81 +40,83 @@ /** - * D B 5 _ H E A D E R _ I S _ V A L I D + * D B 5 _ H E A D E R _ I S _ V A L I D * - * Verify that this is a valid header for a BRL-CAD v5 database. + * Verify that this is a valid header for a BRL-CAD v5 database. * - * Returns - - * 0 Not valid v5 header - * 1 Valid v5 header + * Returns - + * 0 Not valid v5 header + * 1 Valid v5 header */ int db5_header_is_valid(const unsigned char *hp) { const struct db5_ondisk_header *odp = (const struct db5_ondisk_header *)hp; - if ( odp->db5h_magic1 != DB5HDR_MAGIC1 ) return 0; - if ( hp[7] != DB5HDR_MAGIC2 ) return 0; + if (odp->db5h_magic1 != DB5HDR_MAGIC1) return 0; + if (hp[7] != DB5HDR_MAGIC2) return 0; /* hflags */ - if ( (odp->db5h_hflags & DB5HDR_HFLAGS_DLI_MASK) != DB5HDR_HFLAGS_DLI_HEADER_OBJECT ) + if ((odp->db5h_hflags & DB5HDR_HFLAGS_DLI_MASK) != DB5HDR_HFLAGS_DLI_HEADER_OBJECT) return 0; - if ( (odp->db5h_hflags & DB5HDR_HFLAGS_NAME_PRESENT) ) return 0; - if ( ((odp->db5h_hflags & DB5HDR_HFLAGS_OBJECT_WIDTH_MASK) >> DB5HDR_HFLAGS_OBJECT_WIDTH_SHIFT) - != DB5HDR_WIDTHCODE_8BIT ) return 0; + if ((odp->db5h_hflags & DB5HDR_HFLAGS_NAME_PRESENT)) return 0; + if (((odp->db5h_hflags & DB5HDR_HFLAGS_OBJECT_WIDTH_MASK) >> DB5HDR_HFLAGS_OBJECT_WIDTH_SHIFT) + != DB5HDR_WIDTHCODE_8BIT) return 0; /* aflags */ - if ( (odp->db5h_aflags & DB5HDR_AFLAGS_ZZZ_MASK) != DB5_ZZZ_UNCOMPRESSED ) return 0; - if ( odp->db5h_aflags & DB5HDR_AFLAGS_PRESENT ) return 0; - if ( ((odp->db5h_aflags & DB5HDR_AFLAGS_WIDTH_MASK) >> DB5HDR_AFLAGS_WIDTH_SHIFT) - != DB5HDR_WIDTHCODE_8BIT ) return 0; + if ((odp->db5h_aflags & DB5HDR_AFLAGS_ZZZ_MASK) != DB5_ZZZ_UNCOMPRESSED) return 0; + if (odp->db5h_aflags & DB5HDR_AFLAGS_PRESENT) return 0; + if (((odp->db5h_aflags & DB5HDR_AFLAGS_WIDTH_MASK) >> DB5HDR_AFLAGS_WIDTH_SHIFT) + != DB5HDR_WIDTHCODE_8BIT) return 0; /* bflags */ - if ( (odp->db5h_bflags & DB5HDR_BFLAGS_ZZZ_MASK) != DB5_ZZZ_UNCOMPRESSED ) return 0; - if ( odp->db5h_bflags & DB5HDR_BFLAGS_PRESENT ) return 0; - if ( ((odp->db5h_bflags & DB5HDR_BFLAGS_WIDTH_MASK) >> DB5HDR_BFLAGS_WIDTH_SHIFT) - != DB5HDR_WIDTHCODE_8BIT ) return 0; + if ((odp->db5h_bflags & DB5HDR_BFLAGS_ZZZ_MASK) != DB5_ZZZ_UNCOMPRESSED) return 0; + if (odp->db5h_bflags & DB5HDR_BFLAGS_PRESENT) return 0; + if (((odp->db5h_bflags & DB5HDR_BFLAGS_WIDTH_MASK) >> DB5HDR_BFLAGS_WIDTH_SHIFT) + != DB5HDR_WIDTHCODE_8BIT) return 0; /* major and minor type */ - if ( odp->db5h_major_type != DB5_MAJORTYPE_RESERVED ) return 0; - if ( odp->db5h_minor_type != 0 ) return 0; + if (odp->db5h_major_type != DB5_MAJORTYPE_RESERVED) return 0; + if (odp->db5h_minor_type != 0) return 0; /* Check length, known to be 8-bit. Header len=1 8-byte chunk. */ - if ( hp[6] != 1 ) return 0; + if (hp[6] != 1) return 0; return 1; /* valid */ } + /** - * D B 5 _ S E L E C T _ L E N G T H _ E N C O D I N G + * D B 5 _ S E L E C T _ L E N G T H _ E N C O D I N G * - * Given a number to encode, decide which is the smallest encoding format - * which will contain it. + * Given a number to encode, decide which is the smallest encoding + * format which will contain it. */ int db5_select_length_encoding(long int len) { - if ( len <= 255 ) return DB5HDR_WIDTHCODE_8BIT; - if ( len <= 65535 ) return DB5HDR_WIDTHCODE_16BIT; - if ( len < 0x7ffffffe ) return DB5HDR_WIDTHCODE_32BIT; + if (len <= 255) return DB5HDR_WIDTHCODE_8BIT; + if (len <= 65535) return DB5HDR_WIDTHCODE_16BIT; + if (len < 0x7ffffffe) return DB5HDR_WIDTHCODE_32BIT; return DB5HDR_WIDTHCODE_64BIT; } + /** - * D B 5 _ D E C O D E _ L E N G T H + * D B 5 _ D E C O D E _ L E N G T H * - * Given a variable-width length field in network order (XDR), - * store it in *lenp. + * Given a variable-width length field in network order (XDR), store + * it in *lenp. * - * This routine processes unsigned values. + * This routine processes unsigned values. * - * Returns - - * The number of bytes of input that were decoded. + * Returns - + * The number of bytes of input that were decoded. */ int db5_decode_length(size_t *lenp, const unsigned char *cp, int format) { - switch ( format ) { + switch (format) { case DB5HDR_WIDTHCODE_8BIT: *lenp = (*cp); return 1; @@ -126,7 +128,7 @@ return 4; case DB5HDR_WIDTHCODE_64BIT: #if defined(IRIX64) - if ( sizeof(long) >= 8 ) { + if (sizeof(long) >= 8) { *lenp = BU_GLONGLONG(cp); return 8; } @@ -137,34 +139,35 @@ return 0; } + /** - * D B 5 _ D E C O D E _ S I G N E D + * D B 5 _ D E C O D E _ S I G N E D * - * Given a variable-width length field in network order (XDR), - * store it in *lenp. + * Given a variable-width length field in network order (XDR), store + * it in *lenp. * - * This routine processes signed values. + * This routine processes signed values. * - * Returns - - * The number of bytes of input that were decoded. + * Returns - + * The number of bytes of input that were decoded. */ int db5_decode_signed(size_t *lenp, const unsigned char *cp, int format) { - switch ( format ) { + switch (format) { case DB5HDR_WIDTHCODE_8BIT: - if ( (*lenp = (*cp)) & 0x80 ) *lenp |= (-1L ^ 0xFF); + if ((*lenp = (*cp)) & 0x80) *lenp |= (-1L ^ 0xFF); return 1; case DB5HDR_WIDTHCODE_16BIT: - if ( (*lenp = BU_GSHORT(cp)) & 0x8000 ) *lenp |= (-1L ^ 0xFFFF); + if ((*lenp = BU_GSHORT(cp)) & 0x8000) *lenp |= (-1L ^ 0xFFFF); return 2; case DB5HDR_WIDTHCODE_32BIT: - if ( (*lenp = BU_GLONG(cp)) & 0x80000000 ) + if ((*lenp = BU_GLONG(cp)) & 0x80000000) *lenp |= (-1L ^ 0xFFFFFFFF); return 4; case DB5HDR_WIDTHCODE_64BIT: #if defined(IRIX64) - if ( sizeof(long) >= 8 ) { + if (sizeof(long) >= 8) { *lenp = BU_GLONGLONG(cp); return 8; } @@ -175,29 +178,30 @@ return 0; } + /** - * D B 5 _ E N C O D E _ L E N G T H + * D B 5 _ E N C O D E _ L E N G T H * - * Given a value and a variable-width format spec, - * store it in network order (XDR). + * Given a value and a variable-width format spec, store it in network + * order (XDR). * - * Returns - - * pointer to next available byte. + * Returns - + * pointer to next available byte. */ unsigned char * db5_encode_length( - unsigned char *cp, - long val, - int format) + unsigned char *cp, + long val, + int format) { - switch ( format ) { + switch (format) { case DB5HDR_WIDTHCODE_8BIT: *cp = val & 0xFF; return cp+1; case DB5HDR_WIDTHCODE_16BIT: - return bu_pshort( cp, (short)val ); + return bu_pshort(cp, (short)val); case DB5HDR_WIDTHCODE_32BIT: - return bu_plong( cp, val ); + return bu_plong(cp, val); case DB5HDR_WIDTHCODE_64BIT: #if defined(IRIX64) #endif @@ -207,20 +211,21 @@ return 0; } + /** - * D B 5 _ C R A C K _ D I S K _ H E A D E R + * D B 5 _ C R A C K _ D I S K _ H E A D E R * - * Returns - - * 0 on success - * -1 on error + * Returns - + * 0 on success + * -1 on error */ int db5_crack_disk_header(struct db5_raw_internal *rip, const unsigned char *cp) { - if ( cp[0] != DB5HDR_MAGIC1 ) { + if (cp[0] != DB5HDR_MAGIC1) { bu_log("db5_crack_disk_header() bad magic1 -- database has become corrupted\n expected x%x, got x%x\n", DB5HDR_MAGIC1, cp[0]); - if ( cp[0] == 'I' ) { + if (cp[0] == 'I') { bu_log ("Concatenation of different database versions detected.\n"); bu_log ("Run 'dbupgrade' on all databases before concatenation (cat command).\n"); } @@ -252,8 +257,8 @@ rip->minor_type = cp[5]; if (RT_G_DEBUG&DEBUG_DB) bu_log("db5_crack_disk_header()\n\ - h_dli=%d, h_object_width=%d, h_name_present=%d, h_name_width=%d,\n\ - a_width=%d, a_present=%d, a_zzz=%d,\n\ + h_dli=%d, h_object_width=%d, h_name_present=%d, h_name_width=%d, \n\ + a_width=%d, a_present=%d, a_zzz=%d, \n\ b_width=%d, b_present=%d, b_zzz=%d, major=%d, minor=%d\n", rip->h_dli, rip->h_object_width, @@ -266,66 +271,67 @@ rip->b_present, rip->b_zzz, rip->major_type, - rip->minor_type ); + rip->minor_type); return 0; } + /** - * D B 5 _ G E T _ R A W _ I N T E R N A L _ P T R + * D B 5 _ G E T _ R A W _ I N T E R N A L _ P T R * - * Returns - - * on success, pointer to first unused byte - * NULL, on error + * Returns - + * on success, pointer to first unused byte + * NULL, on error */ const unsigned char * -db5_get_raw_internal_ptr( struct db5_raw_internal *rip, const unsigned char *ip) +db5_get_raw_internal_ptr(struct db5_raw_internal *rip, const unsigned char *ip) { - const unsigned char *cp = ip; + const unsigned char *cp = ip; - if ( db5_crack_disk_header( rip, cp ) < 0 ) return NULL; + if (db5_crack_disk_header(rip, cp) < 0) return NULL; cp += sizeof(struct db5_ondisk_header); - cp += db5_decode_length( &rip->object_length, cp, rip->h_object_width ); + cp += db5_decode_length(&rip->object_length, cp, rip->h_object_width); rip->object_length <<= 3; /* cvt 8-byte chunks to byte count */ - if ( (size_t)rip->object_length < sizeof(struct db5_ondisk_header) ) { + if ((size_t)rip->object_length < sizeof(struct db5_ondisk_header)) { bu_log("db5_get_raw_internal_ptr(): object_length=%ld is too short, database is corrupted\n", rip->object_length); return NULL; } /* Verify trailing magic number */ - if ( ip[rip->object_length-1] != DB5HDR_MAGIC2 ) { + if (ip[rip->object_length-1] != DB5HDR_MAGIC2) { bu_log("db5_get_raw_internal_ptr() bad magic2 -- database has become corrupted.\n expected x%x, got x%x\n", - DB5HDR_MAGIC2, ip[rip->object_length-1] ); + DB5HDR_MAGIC2, ip[rip->object_length-1]); return NULL; } - BU_INIT_EXTERNAL( &rip->name ); - BU_INIT_EXTERNAL( &rip->body ); - BU_INIT_EXTERNAL( &rip->attributes ); + BU_INIT_EXTERNAL(&rip->name); + BU_INIT_EXTERNAL(&rip->body); + BU_INIT_EXTERNAL(&rip->attributes); /* Grab name, if present */ - if ( rip->h_name_present ) { - cp += db5_decode_length( &rip->name.ext_nbytes, - cp, rip->h_name_width ); + if (rip->h_name_present) { + cp += db5_decode_length(&rip->name.ext_nbytes, + cp, rip->h_name_width); rip->name.ext_buf = (genptr_t)cp; /* discard const */ cp += rip->name.ext_nbytes; } /* Point to attributes, if present */ - if ( rip->a_present ) { - cp += db5_decode_length( &rip->attributes.ext_nbytes, - cp, rip->a_width ); + if (rip->a_present) { + cp += db5_decode_length(&rip->attributes.ext_nbytes, + cp, rip->a_width); rip->attributes.ext_buf = (genptr_t)cp; /* discard const */ cp += rip->attributes.ext_nbytes; } /* Point to body, if present */ - if ( rip->b_present ) { - cp += db5_decode_length( &rip->body.ext_nbytes, - cp, rip->b_width ); + if (rip->b_present) { + cp += db5_decode_length(&rip->body.ext_nbytes, + cp, rip->b_width); rip->body.ext_buf = (genptr_t)cp; /* discard const */ cp += rip->body.ext_nbytes; } @@ -335,34 +341,35 @@ return ip + rip->object_length; } + /** - * D B 5 _ G E T _ R A W _ I N T E R N A L _ F P + * D B 5 _ G E T _ R A W _ I N T E R N A L _ F P * - * Returns - - * 0 on success - * -1 on EOF - * -2 on error + * Returns - + * 0 on success + * -1 on EOF + * -2 on error */ int db5_get_raw_internal_fp(struct db5_raw_internal *rip, FILE *fp) { - struct db5_ondisk_header header; - unsigned char lenbuf[8]; - int count = 0; - int used; - size_t want, got; - unsigned char *cp; + struct db5_ondisk_header header; + unsigned char lenbuf[8]; + int count = 0; + int used; + size_t want, got; + unsigned char *cp; - if ( fread( (unsigned char *)&header, sizeof header, 1, fp ) != 1 ) { - if ( feof(fp) ) return -1; + if (fread((unsigned char *)&header, sizeof header, 1, fp) != 1) { + if (feof(fp)) return -1; bu_log("db5_get_raw_internal_fp(): fread header error\n"); return -2; } - if ( db5_crack_disk_header( rip, (unsigned char *)&header ) < 0 ) + if (db5_crack_disk_header(rip, (unsigned char *)&header) < 0) return -2; used = sizeof(header); - switch ( rip->h_object_width ) { + switch (rip->h_object_width) { case DB5HDR_WIDTHCODE_8BIT: count = 1; break; @@ -375,65 +382,65 @@ case DB5HDR_WIDTHCODE_64BIT: count = 8; } - if ( fread( lenbuf, count, 1, fp ) != 1 ) { + if (fread(lenbuf, count, 1, fp) != 1) { bu_log("db5_get_raw_internal_fp(): fread lenbuf error\n"); return -2; } - used += db5_decode_length( &rip->object_length, lenbuf, rip->h_object_width ); + used += db5_decode_length(&rip->object_length, lenbuf, rip->h_object_width); rip->object_length <<= 3; /* cvt 8-byte chunks to byte count */ - if ( (size_t)rip->object_length < sizeof(struct db5_ondisk_header) ) { + if ((size_t)rip->object_length < sizeof(struct db5_ondisk_header)) { bu_log("db5_get_raw_internal_fp(): object_length=%ld is too short, database is corrupted\n", rip->object_length); return -1; } /* Now that we finally know how large the object is, get it all */ - rip->buf = (unsigned char *)bu_malloc( rip->object_length, "raw v5 object" ); + rip->buf = (unsigned char *)bu_malloc(rip->object_length, "raw v5 object"); *((struct db5_ondisk_header *)rip->buf) = header; /* struct copy */ memcpy(rip->buf+sizeof(header), lenbuf, count); cp = rip->buf+used; want = rip->object_length-used; - BU_ASSERT_LONG( want, >, 0 ); - if ( (got = fread( cp, 1, want, fp )) != want ) { + BU_ASSERT_LONG(want, >, 0); + if ((got = fread(cp, 1, want, fp)) != want) { bu_log("db5_get_raw_internal_fp(), want=%ld, got=%ld, database is too short\n", - want, got ); + want, got); return -2; } /* Verify trailing magic number */ - if ( rip->buf[rip->object_length-1] != DB5HDR_MAGIC2 ) { + if (rip->buf[rip->object_length-1] != DB5HDR_MAGIC2) { bu_log("db5_get_raw_internal_fp() bad magic2 -- database has become corrupted.\n expected x%x, got x%x\n", - DB5HDR_MAGIC2, rip->buf[rip->object_length-1] ); + DB5HDR_MAGIC2, rip->buf[rip->object_length-1]); return -2; } - BU_INIT_EXTERNAL( &rip->name ); - BU_INIT_EXTERNAL( &rip->body ); - BU_INIT_EXTERNAL( &rip->attributes ); + BU_INIT_EXTERNAL(&rip->name); + BU_INIT_EXTERNAL(&rip->body); + BU_INIT_EXTERNAL(&rip->attributes); /* Grab name, if present */ - if ( rip->h_name_present ) { - cp += db5_decode_length( &rip->name.ext_nbytes, - cp, rip->h_name_width ); + if (rip->h_name_present) { + cp += db5_decode_length(&rip->name.ext_nbytes, + cp, rip->h_name_width); rip->name.ext_buf = (genptr_t)cp; /* discard const */ cp += rip->name.ext_nbytes; } /* Point to attributes, if present */ - if ( rip->a_present ) { - cp += db5_decode_length( &rip->attributes.ext_nbytes, - cp, rip->a_width ); + if (rip->a_present) { + cp += db5_decode_length(&rip->attributes.ext_nbytes, + cp, rip->a_width); rip->attributes.ext_buf = (genptr_t)cp; /* discard const */ cp += rip->attributes.ext_nbytes; } /* Point to body, if present */ - if ( rip->b_present ) { - cp += db5_decode_length( &rip->body.ext_nbytes, - cp, rip->b_width ); + if (rip->b_present) { + cp += db5_decode_length(&rip->body.ext_nbytes, + cp, rip->b_width); rip->body.ext_buf = (genptr_t)cp; /* discard const */ cp += rip->body.ext_nbytes; } @@ -441,13 +448,14 @@ return 0; /* success */ } + /** - * D B 5 _ E X P O R T _ O B J E C T 3 + * D B 5 _ E X P O R T _ O B J E C T 3 * - * A routine for merging together the three optional - * parts of an object into the final on-disk format. - * Results in extra data copies, but serves as a starting point for testing. - * Any of name, attrib, and body may be null. + * A routine for merging together the three optional parts of an + * object into the final on-disk format. Results in extra data + * copies, but serves as a starting point for testing. Any of name, + * attrib, and body may be null. */ void db5_export_object3( @@ -460,24 +468,24 @@ int major, int minor, int a_zzz, - int b_zzz ) + int b_zzz) { struct db5_ondisk_header *odp; - register unsigned char *cp; - long namelen = 0; - size_t need; - int h_width, n_width, a_width, b_width; - long togo; + register unsigned char *cp; + long namelen = 0; + size_t need; + int h_width, n_width, a_width, b_width; + long togo; /* - * First, compute an upper bound on the size buffer needed. - * Over-estimate on the length fields just to keep it simple. + * First, compute an upper bound on the size buffer needed. + * Over-estimate on the length fields just to keep it simple. */ need = sizeof(struct db5_ondisk_header); need += 8; /* for object_length */ - if ( name ) { + if (name) { namelen = (long)strlen(name) + 1; /* includes null */ - if ( namelen > 1 ) { + if (namelen > 1) { n_width = db5_select_length_encoding(namelen); need += namelen + db5_enc_len[n_width]; } else { @@ -488,9 +496,9 @@ } else { n_width = 0; } - if ( attrib ) { + if (attrib) { BU_CK_EXTERNAL(attrib); - if ( attrib->ext_nbytes > 0 ) { + if (attrib->ext_nbytes > 0) { a_width = db5_select_length_encoding(attrib->ext_nbytes); need += attrib->ext_nbytes + db5_enc_len[a_width]; } else { @@ -500,9 +508,9 @@ } else { a_width = 0; } - if ( body ) { + if (body) { BU_CK_EXTERNAL(body); - if ( body->ext_nbytes > 0 ) { + if (body->ext_nbytes > 0) { b_width = db5_select_length_encoding(body->ext_nbytes); need += body->ext_nbytes + db5_enc_len[b_width]; } else { @@ -516,11 +524,11 @@ /* Allocate the buffer for the combined external representation */ out->ext_magic = BU_EXTERNAL_MAGIC; - out->ext_buf = bu_malloc( need, "external object3" ); + out->ext_buf = bu_malloc(need, "external object3"); out->ext_nbytes = need; /* will be trimmed, below */ /* Determine encoding for the header length field */ - h_width = db5_select_length_encoding( (need+7)>>3 ); + h_width = db5_select_length_encoding((need+7)>>3); /* prepare combined external object */ odp = (struct db5_ondisk_header *)out->ext_buf; @@ -529,26 +537,26 @@ /* hflags */ odp->db5h_hflags = (h_width << DB5HDR_HFLAGS_OBJECT_WIDTH_SHIFT) | (dli & DB5HDR_HFLAGS_DLI_MASK); - if ( name ) { + if (name) { odp->db5h_hflags |= DB5HDR_HFLAGS_NAME_PRESENT | (n_width << DB5HDR_HFLAGS_NAME_WIDTH_SHIFT); } - if ( hidden ) { + if (hidden) { odp->db5h_hflags |= DB5HDR_HFLAGS_HIDDEN_OBJECT; } /* aflags */ odp->db5h_aflags = a_width << DB5HDR_AFLAGS_WIDTH_SHIFT; - if ( attrib ) odp->db5h_aflags |= DB5HDR_AFLAGS_PRESENT; + if (attrib) odp->db5h_aflags |= DB5HDR_AFLAGS_PRESENT; odp->db5h_aflags |= a_zzz & DB5HDR_AFLAGS_ZZZ_MASK; /* bflags */ odp->db5h_bflags = b_width << DB5HDR_BFLAGS_WIDTH_SHIFT; - if ( body ) odp->db5h_bflags |= DB5HDR_BFLAGS_PRESENT; + if (body) odp->db5h_bflags |= DB5HDR_BFLAGS_PRESENT; odp->db5h_bflags |= b_zzz & DB5HDR_BFLAGS_ZZZ_MASK; - if ( a_zzz || b_zzz ) bu_bomb("db5_export_object3: compression not supported yet\n"); + if (a_zzz || b_zzz) bu_bomb("db5_export_object3: compression not supported yet\n"); /* Object_Type */ odp->db5h_major_type = major; @@ -556,76 +564,77 @@ /* Build up the rest of the record */ cp = ((unsigned char *)out->ext_buf) + sizeof(struct db5_ondisk_header); - cp = db5_encode_length( cp, 7L, h_width ); /* will be replaced below */ + cp = db5_encode_length(cp, 7L, h_width); /* will be replaced below */ - if ( name ) { - cp = db5_encode_length( cp, namelen, n_width ); + if (name) { + cp = db5_encode_length(cp, namelen, n_width); memcpy(cp, name, namelen); /* includes null */ cp += namelen; } - if ( attrib ) { + if (attrib) { /* minimum buffer length is a one byte attribute name, followed by a NULL name termination, * followed by no bytes (for an empty value), followed by a NULL value termination, * followed by a NULL attribute-value termination. Minimum is 4 bytes */ - BU_ASSERT_PTR( attrib->ext_nbytes, >=, 4 ); - cp = db5_encode_length( cp, attrib->ext_nbytes, a_width ); + BU_ASSERT_PTR(attrib->ext_nbytes, >=, 4); + cp = db5_encode_length(cp, attrib->ext_nbytes, a_width); memcpy(cp, attrib->ext_buf, attrib->ext_nbytes); cp += attrib->ext_nbytes; } - if ( body ) { - cp = db5_encode_length( cp, body->ext_nbytes, b_width ); + if (body) { + cp = db5_encode_length(cp, body->ext_nbytes, b_width); memcpy(cp, body->ext_buf, body->ext_nbytes); cp += body->ext_nbytes; } togo = cp - ((unsigned char *)out->ext_buf) + 1; togo &= 7; - if ( togo != 0 ) { + if (togo != 0) { togo = 8 - togo; - while ( togo-- > 0 ) *cp++ = '\0'; + while (togo-- > 0) *cp++ = '\0'; } *cp++ = DB5HDR_MAGIC2; /* Verify multiple of 8 */ togo = cp - ((unsigned char *)out->ext_buf); - BU_ASSERT_LONG( togo&7, ==, 0 ); + BU_ASSERT_LONG(togo&7, ==, 0); /* Finally, go back to the header and write the actual object length */ cp = ((unsigned char *)out->ext_buf) + sizeof(struct db5_ondisk_header); - cp = db5_encode_length( cp, togo>>3, h_width ); + cp = db5_encode_length(cp, togo>>3, h_width); out->ext_nbytes = togo; - BU_ASSERT_LONG( out->ext_nbytes, >=, 8 ); + BU_ASSERT_LONG(out->ext_nbytes, >=, 8); } + /** - * D B 5 _ M A K E _ F R E E _ O B J E C T _ H D R + * D B 5 _ M A K E _ F R E E _ O B J E C T _ H D R * - * Make only the front (header) portion of a free object. - * This is used when operating on very large contiguous free objects - * in the database (e.g. 50 MBytes). + * Make only the front (header) portion of a free object. This is + * used when operating on very large contiguous free objects in the + * database (e.g. 50 MBytes). */ void -db5_make_free_object_hdr( struct bu_external *ep, size_t length ) +db5_make_free_object_hdr(struct bu_external *ep, size_t length) { struct db5_ondisk_header *odp; - int h_width; - unsigned char *cp; + int h_width; + unsigned char *cp; BU_CK_EXTERNAL(ep); - BU_ASSERT_SIZE_T( length, >=, 8 ); - BU_ASSERT_SIZE_T( length&7, ==, 0 ); + BU_ASSERT_SIZE_T(length, >=, 8); + BU_ASSERT_SIZE_T(length&7, ==, 0); /* Reserve enough space to hold any free header, even w/64-bit len */ ep->ext_nbytes = 8+8; - ep->ext_buf = bu_calloc( 1, ep->ext_nbytes, "db5_make_free_object_hdr" ); + ep->ext_buf = bu_calloc(1, ep->ext_nbytes, "db5_make_free_object_hdr"); /* Determine encoding for the header length field */ - h_width = db5_select_length_encoding( length>>3 ); + h_width = db5_select_length_encoding(length>>3); /* prepare header of external object */ odp = (struct db5_ondisk_header *)ep->ext_buf; @@ -634,32 +643,33 @@ DB5HDR_HFLAGS_DLI_FREE_STORAGE; cp = ((unsigned char *)ep->ext_buf) + sizeof(struct db5_ondisk_header); - cp = db5_encode_length( cp, length>>3, h_width ); + cp = db5_encode_length(cp, length>>3, h_width); } + /** - * D B 5 _ M A K E _ F R E E _ O B J E C T + * D B 5 _ M A K E _ F R E E _ O B J E C T * - * Make a complete, zero-filled, free object. - * Note that free objects can sometimes get quite large. + * Make a complete, zero-filled, free object. Note that free objects + * can sometimes get quite large. */ void -db5_make_free_object( struct bu_external *ep, size_t length ) +db5_make_free_object(struct bu_external *ep, size_t length) { struct db5_ondisk_header *odp; - int h_width; - unsigned char *cp; + int h_width; + unsigned char *cp; BU_CK_EXTERNAL(ep); - BU_ASSERT_SIZE_T( length, >=, 8 ); - BU_ASSERT_SIZE_T( length&7, ==, 0 ); + BU_ASSERT_SIZE_T(length, >=, 8); + BU_ASSERT_SIZE_T(length&7, ==, 0); - ep->ext_buf = bu_calloc( 1, length, "db5_make_free_object" ); + ep->ext_buf = bu_calloc(1, length, "db5_make_free_object"); ep->ext_nbytes = length; /* Determine encoding for the header length field */ - h_width = db5_select_length_encoding( length>>3 ); + h_width = db5_select_length_encoding(length>>3); /* prepare combined external object */ odp = (struct db5_ondisk_header *)ep->ext_buf; @@ -668,553 +678,34 @@ DB5HDR_HFLAGS_DLI_FREE_STORAGE; cp = ((unsigned char *)ep->ext_buf) + sizeof(struct db5_ondisk_header); - cp = db5_encode_length( cp, length>>3, h_width ); + cp = db5_encode_length(cp, length>>3, h_width); cp = ((unsigned char *)ep->ext_buf) + length-1; *cp = DB5HDR_MAGIC2; } -/** - * D B 5 _ I M P O R T _ A T T R I B U T E S - * - * Convert the on-disk encoding into a handy easy-to-use - * bu_attribute_value_set structure. - * Take advantage of the readonly_min/readonly_max capability - * so that we don't have to bu_strdup() each string, but can - * simply point to it in the provided buffer *ap. - * Important implication: don't free *ap until you're done with this avs. - * - * The upshot of this is that bu_avs_add() and bu_avs_remove() can - * be safely used with this *avs. - * - * Returns - - * >0 count of attributes successfully imported - * -1 Error, mal-formed input - */ -int -db5_import_attributes( struct bu_attribute_value_set *avs, const struct bu_external *ap ) -{ - const char *cp; - const char *ep; - int count = 0; - BU_CK_EXTERNAL(ap); - - BU_ASSERT_LONG( ap->ext_nbytes, >=, 4 ); - - /* First pass -- count number of attributes */ - cp = (const char *)ap->ext_buf; - ep = (const char *)ap->ext_buf+ap->ext_nbytes; - - /* Null "name" string indicates end of attribute list */ - while ( *cp != '\0' ) { - if ( cp >= ep ) { - bu_log("db5_import_attributes() ran off end of buffer, database is probably corrupted\n"); - return -1; - } - cp += strlen(cp)+1; /* value */ - cp += strlen(cp)+1; /* next name */ - count++; - } - /* Ensure we're exactly at the end */ - BU_ASSERT_PTR( cp+1, ==, ep ); - - /* not really needed for AVS_ADD since bu_avs_add will - * incrementally allocate as it needs it. but one alloc is - * better than many in case there are many attributes. - */ - bu_avs_init( avs, count, "db5_import_attributes" ); - - /* Second pass -- populate attributes. Peek inside struct for non AVS_ADD. */ - -/* Use AVS_ADD to copy the values from the external buffer instead of - * using them directly without copying. This presumes ap will not get - * free'd before we're done with the avs. Preference should be to - * leave AVS_ADD undefined for performance reasons. - */ -#define AVS_ADD 1 - -#if AVS_ADD - cp = (const char *)ap->ext_buf; - while ( *cp != '\0' ) { - const char *name = cp; /* name */ - cp += strlen(cp)+1; /* value */ - bu_avs_add( avs, name, cp ); - cp += strlen(cp)+1; /* next name */ - } -#else - /* Conserve malloc/free activity -- use strings in input buffer */ - /* Signal region of memory that input comes from */ - cp = (const char *)ap->ext_buf; - app = avs->avp; - while ( *cp != '\0' ) { - app->name = cp; /* name */ - cp += strlen(cp)+1; - app->value = cp; /* value */ - cp += strlen(cp)+1; - app++; - avs->count++; - } - - /* expand the readonly section if necessary */ - if ( (!avs->readonly_min) || ((genptr_t)avs->readonly_min > (genptr_t)ap->ext_buf) ) { - avs->readonly_min = (genptr_t)ap->ext_buf; - } - if ( (!avs->readonly_max) || ((genptr_t)avs->readonly_max < (genptr_t)(avs->readonly_min + ap->ext_nbytes)) ) { - avs->readonly_max = (genptr_t)avs->readonly_min + ap->ext_nbytes; - } -#endif - - BU_ASSERT_PTR( cp+1, ==, ep ); - BU_ASSERT_LONG( avs->count, <=, avs->max ); - BU_ASSERT_LONG( (size_t)avs->count, ==, (size_t)count ); - - if (bu_debug & BU_DEBUG_AVS) { - bu_avs_print(avs, "db5_import_attributes"); - } - return avs->count; -} - /** - * D B 5 _ E X P O R T _ A T T R I B U T E S + * R T _ D B _ C V T _ T O _ E X T E R N A L 5 * - * Encode the attribute-value pair information into the external - * on-disk format. + * The attributes are taken from ip->idb_avs * - * The on-disk encoding is: + * If present, convert attributes to on-disk format. This must happen + * after exporting the body, in case the ft_export5() method happened + * to extend the attribute set. Combinations are one "solid" which + * does this. * - * name1 NULL value1 NULL ... nameN NULL valueN NULL NULL + * The internal representation is NOT freed, that's the caller's job. * - * 'ext' is initialized on behalf of the caller. - */ -void -db5_export_attributes( struct bu_external *ext, const struct bu_attribute_value_set *avs ) -{ - size_t need = 0; - const struct bu_attribute_value_pair *avpp; - char *cp; - size_t i; - - BU_CK_AVS( avs ); - BU_INIT_EXTERNAL(ext); - - if (avs->count <= 0) { - return; - } - - if (bu_debug & BU_DEBUG_AVS) { - bu_avs_print(avs, "db5_export_attributes"); - } - - /* First pass -- determine how much space is required */ - need = 0; - avpp = avs->avp; - for ( i = 0; i < (size_t)avs->count; i++, avpp++ ) { - if (avpp->name) { - need += (int)strlen(avpp->name) + 1; /* include room for NULL */ - } else { - need += 1; - } - if (avpp->value) { - need += (int)strlen(avpp->value) + 1; /* include room for NULL */ - } else { - need += 1; - } - } - /* include final null */ - need += 1; - - if ( need <= 1 ) { - /* nothing to do */ - return; - } - - ext->ext_nbytes = need; - ext->ext_buf = bu_calloc(1, need, "external attributes"); - - /* Second pass -- store in external form */ - cp = (char *)ext->ext_buf; - avpp = avs->avp; - for (i = 0; i < avs->count; i++, avpp++) { - int len; - - if (avpp->name) { - len = (int)strlen(avpp->name); - memcpy(cp, avpp->name, len); - cp += len + 1; - } - *cp = '\0'; /* pad null */ - - if (avpp->value) { - len = (int)strlen(avpp->value); - memcpy(cp, avpp->value, strlen(avpp->value)); - cp += len + 1; - } - *cp = '\0'; /* pad null */ - } - *(cp++) = '\0'; /* final null */ - - /* sanity check */ - need = cp - ((char *)ext->ext_buf); - BU_ASSERT_LONG( need, ==, ext->ext_nbytes ); -} - - -/** - * D B 5 _ R E P L A C E _ A T T R I B U T E S + * The 'ext' pointer is accepted in uninitialized form, and an + * initialized structure is always returned, so that the caller may + * free it even when an error return is given. * - * Replace the attributes of a given database object. - * For efficiency, this is done without looking at the object body at all. - * - * Contents of the bu_attribute_value_set are freed, but not the struct itself. - * - * Returns - - * 0 on success - * <0 on error - */ -int -db5_replace_attributes( struct directory *dp, struct bu_attribute_value_set *avsp, struct db_i *dbip ) -{ - struct bu_external ext; - struct db5_raw_internal raw; - struct bu_external attr; - struct bu_external ext2; - int ret; - - RT_CK_DIR(dp); - BU_CK_AVS(avsp); - RT_CK_DBI(dbip); - - if (RT_G_DEBUG&DEBUG_DB) { - bu_log("db5_replace_attributes(%s) dbip=x%x\n", - dp->d_namep, dbip ); - bu_avs_print( avsp, "new attributes" ); - } - - if ( dbip->dbi_read_only ) { - bu_log("db5_replace_attributes(%s): READ-ONLY file\n", - dbip->dbi_filename); - return -1; - } - - BU_ASSERT_LONG( dbip->dbi_version, ==, 5 ); - - if ( db_get_external( &ext, dp, dbip ) < 0 ) - return -2; /* FAIL */ - - if (db5_get_raw_internal_ptr(&raw, ext.ext_buf) == NULL) { - bu_log("db5_replace_attributes(%s): import failure\n", - dp->d_namep ); - bu_free_external( &ext ); - return -3; - } - - db5_export_attributes( &attr, avsp ); - BU_INIT_EXTERNAL(&ext2); - db5_export_object3( &ext2, - raw.h_dli, - dp->d_namep, - raw.h_name_hidden, - &attr, - &raw.body, - raw.major_type, raw.minor_type, - raw.a_zzz, raw.b_zzz ); - - /* Write it */ - ret = db_put_external5( &ext2, dp, dbip ); - if ( ret < 0 ) bu_log("db5_replace_attributes(%s): db_put_external5() failure\n", - dp->d_namep ); - - bu_free_external( &attr ); - bu_free_external( &ext2 ); - bu_free_external( &ext ); /* 'raw' is now invalid */ - bu_avs_free( avsp ); - - return ret; -} - -/** - * D B 5 _ U P D A T E _ A T T R I B U T E S - * - * Update an arbitrary number of attributes on a given database object. - * For efficiency, this is done without looking at the object body at all. - * - * Contents of the bu_attribute_value_set are freed, but not the struct itself. - * - * Returns - - * 0 on success - * <0 on error - */ -int -db5_update_attributes( struct directory *dp, struct bu_attribute_value_set *avsp, struct db_i *dbip ) -{ - struct bu_external ext; - struct db5_raw_internal raw; - struct bu_attribute_value_set old_avs; - struct bu_external attr; - struct bu_external ext2; - int ret; - - RT_CK_DIR(dp); - BU_CK_AVS(avsp); - RT_CK_DBI(dbip); - - if (RT_G_DEBUG&DEBUG_DB) { - bu_log("db5_update_attributes(%s) dbip=x%x\n", - dp->d_namep, dbip ); - bu_avs_print( avsp, "new attributes" ); - } - - if ( dbip->dbi_read_only ) { - bu_log("db5_update_attributes(%s): READ-ONLY file\n", - dbip->dbi_filename); - return -1; - } - - BU_ASSERT_LONG( dbip->dbi_version, ==, 5 ); - - if ( db_get_external( &ext, dp, dbip ) < 0 ) - return -2; /* FAIL */ - - if (db5_get_raw_internal_ptr(&raw, ext.ext_buf) == NULL) { - bu_log("db5_update_attributes(%s): import failure\n", - dp->d_namep ); - bu_free_external( &ext ); - return -3; - } - - /* db5_import_attributes will allocate space */ - bu_avs_init_empty( &old_avs ); - - if ( raw.attributes.ext_buf ) { - if ( db5_import_attributes( &old_avs, &raw.attributes ) < 0 ) { - bu_log("db5_update_attributes(%s): mal-formed attributes in database\n", - dp->d_namep ); - bu_avs_free( &old_avs ); - bu_free_external( &ext ); - return -8; - } - } - - bu_avs_merge( &old_avs, avsp ); - - db5_export_attributes( &attr, &old_avs ); - BU_INIT_EXTERNAL(&ext2); - db5_export_object3( &ext2, - raw.h_dli, - dp->d_namep, - raw.h_name_hidden, - &attr, - &raw.body, - raw.major_type, raw.minor_type, - raw.a_zzz, raw.b_zzz ); - - /* Write it */ - ret = db_put_external5( &ext2, dp, dbip ); - if ( ret < 0 ) { - bu_log("db5_update_attributes(%s): db_put_external5() failure\n", dp->d_namep ); - } - - bu_free_external( &attr ); - bu_free_external( &ext2 ); - bu_free_external( &ext ); /* 'raw' is now invalid */ - bu_avs_free( &old_avs ); - bu_avs_free( avsp ); - - return ret; -} - -/** - * D B 5 _ U P D A T E _ A T T R I B U T E - * - * A convenience routine to update the value of a single attribute. - * - * Returns - - * 0 on success - * <0 on error - */ -int -db5_update_attribute( const char *obj_name, const char *name, const char *value, struct db_i *dbip ) -{ - struct directory *dp; - struct bu_attribute_value_set avs; - - RT_CK_DBI(dbip); - if ( (dp = db_lookup( dbip, obj_name, LOOKUP_NOISY )) == DIR_NULL ) - return -1; - - bu_avs_init( &avs, 2, "db5_update_attribute" ); - bu_avs_add( &avs, name, value ); - - return db5_update_attributes( dp, &avs, dbip ); -} - -/** - * D B 5 _ U P D A T E _ I D E N T - * - * Update the _GLOBAL object, which in v5 serves the place of the - * "ident" header record in v4 as the place to stash global information. - * Since every database will have one of these things, - * it's no problem to update it. - * * Returns - - * 0 Success - * -1 Fatal Error + * 0 OK + * -1 FAIL */ -int db5_update_ident( struct db_i *dbip, const char *title, double local2mm ) -{ - struct bu_attribute_value_set avs; - struct directory *dp; - struct bu_vls units; - int ret; - char *old_title = NULL; - - RT_CK_DBI(dbip); - - if ( (dp = db_lookup( dbip, DB5_GLOBAL_OBJECT_NAME, LOOKUP_QUIET )) == DIR_NULL ) { - struct bu_external global; - unsigned char minor_type=0; - - bu_log("db5_update_ident() WARNING: %s object is missing, creating new one.\nYou may have lost important global state when you deleted this object.\n", - DB5_GLOBAL_OBJECT_NAME ); - - /* OK, make one. It will be empty to start with, updated below. */ - db5_export_object3( &global, - DB5HDR_HFLAGS_DLI_APPLICATION_DATA_OBJECT, - DB5_GLOBAL_OBJECT_NAME, DB5HDR_HFLAGS_HIDDEN_OBJECT, NULL, NULL, - DB5_MAJORTYPE_ATTRIBUTE_ONLY, 0, - DB5_ZZZ_UNCOMPRESSED, DB5_ZZZ_UNCOMPRESSED ); - - dp = db_diradd( dbip, DB5_GLOBAL_OBJECT_NAME, -1L, 0, 0, (genptr_t)&minor_type); - dp->d_major_type = DB5_MAJORTYPE_ATTRIBUTE_ONLY; - if ( db_put_external( &global, dp, dbip ) < 0 ) { - bu_log("db5_update_ident() unable to create replacement %s object!\n", DB5_GLOBAL_OBJECT_NAME ); - bu_free_external(&global); - return -1; - } - bu_free_external(&global); - } - - bu_vls_init( &units ); - bu_vls_printf( &units, "%.25e", local2mm ); - - bu_avs_init( &avs, 4, "db5_update_ident" ); - bu_avs_add( &avs, "title", title ); - bu_avs_add( &avs, "units", bu_vls_addr(&units) ); - - ret = db5_update_attributes( dp, &avs, dbip ); - bu_vls_free( &units ); - bu_avs_free( &avs ); - - /* protect from loosing memory and from freeing what we are - about to dup */ - if (dbip->dbi_title) { - old_title = dbip->dbi_title; - } - dbip->dbi_title = bu_strdup(title); - if (old_title) { - bu_free(old_title, "replaced dbi_title with new"); - } - - return ret; -} - -/** - * D B 5 _ F W R I T E _ I D E N T - * - * Create a header for a v5 database. - * This routine has the same calling sequence as db_fwrite_ident() - * which makes a v4 database header. - * - * In the v5 database, two database objects must be created to - * match the semantics of what was in the v4 header: - * - * First, a database header object. - * - * Second, create a specially named attribute-only object which - * contains the attributes "title=" and "units=". - * - * This routine should only be used by db_create(). - * Everyone else should use db5_update_ident(). - * - * Returns - - * 0 Success - * -1 Fatal Error - */ int -db5_fwrite_ident(FILE *fp, const char *title, double local2mm) -{ - struct bu_attribute_value_set avs; - struct bu_vls units; - struct bu_external out; - struct bu_external attr; - int result; - - if ( local2mm <= 0 ) { - bu_log("db5_fwrite_ident(%s, %g) local2mm <= 0\n", - title, local2mm ); - return -1; - } - - /* First, write the header object */ - db5_export_object3( &out, DB5HDR_HFLAGS_DLI_HEADER_OBJECT, - NULL, 0, NULL, NULL, - DB5_MAJORTYPE_RESERVED, 0, - DB5_ZZZ_UNCOMPRESSED, DB5_ZZZ_UNCOMPRESSED ); - - result = bu_fwrite_external( fp, &out ); - bu_free_external( &out ); - if (result < 0) { - return -1; - } - - /* Second, create the attribute-only object */ - bu_vls_init( &units ); - bu_vls_printf( &units, "%.25e", local2mm ); - - bu_avs_init( &avs, 4, "db5_fwrite_ident" ); - bu_avs_add( &avs, "title", title ); - bu_avs_add( &avs, "units", bu_vls_addr(&units) ); - - db5_export_attributes( &attr, &avs ); - db5_export_object3( &out, DB5HDR_HFLAGS_DLI_APPLICATION_DATA_OBJECT, - DB5_GLOBAL_OBJECT_NAME, DB5HDR_HFLAGS_HIDDEN_OBJECT, &attr, NULL, - DB5_MAJORTYPE_ATTRIBUTE_ONLY, 0, - DB5_ZZZ_UNCOMPRESSED, DB5_ZZZ_UNCOMPRESSED ); - - result = bu_fwrite_external( fp, &out ); - bu_free_external( &out ); - bu_free_external( &attr ); - bu_avs_free( &avs ); - bu_vls_free( &units ); - if (result < 0) { - return -1; - } - - return 0; -} - -/** - * R T _ D B _ C V T _ T O _ E X T E R N A L 5 - * - * The attributes are taken from ip->idb_avs - * - * If present, convert attributes to on-disk format. - * This must happen after exporting the body, in case the - * ft_export5() method happened to extend the attribute set. - * Combinations are one "solid" which does this. - * - * The internal representation is NOT freed, that's the caller's job. - * - * The 'ext' pointer is accepted in uninitialized form, and - * an initialized structure is always returned, so that - * the caller may free it even when an error return is given. - * - * Returns - - * 0 OK - * -1 FAIL - */ -int rt_db_cvt_to_external5( struct bu_external *ext, const char *name, @@ -1224,15 +715,15 @@ struct resource *resp, const int major) { - struct bu_external attributes; - struct bu_external body; - int minor; + struct bu_external attributes; + struct bu_external body; + int minor; int ret; - RT_CK_DB_INTERNAL( ip ); + RT_CK_DB_INTERNAL(ip); if (dbip) RT_CK_DBI(dbip); /* may be null */ RT_CK_RESOURCE(resp); - BU_INIT_EXTERNAL( &body ); + BU_INIT_EXTERNAL(&body); minor = ip->idb_type; /* XXX not necessarily v5 numbers. */ @@ -1244,54 +735,55 @@ if (ret < 0) { bu_log("rt_db_cvt_to_external5(%s): ft_export5 failure\n", name); - bu_free_external( &body ); + bu_free_external(&body); BU_INIT_EXTERNAL(ext); return -1; /* FAIL */ } - BU_CK_EXTERNAL( &body ); + BU_CK_EXTERNAL(&body); /* If present, convert attributes to on-disk format. */ - if ( ip->idb_avs.magic == BU_AVS_MAGIC ) { - db5_export_attributes( &attributes, &ip->idb_avs ); - BU_CK_EXTERNAL( &attributes ); + if (ip->idb_avs.magic == BU_AVS_MAGIC) { + db5_export_attributes(&attributes, &ip->idb_avs); + BU_CK_EXTERNAL(&attributes); } else { BU_INIT_EXTERNAL(&attributes); } - db5_export_object3( ext, DB5HDR_HFLAGS_DLI_APPLICATION_DATA_OBJECT, - name, 0, &attributes, &body, - major, minor, - DB5_ZZZ_UNCOMPRESSED, DB5_ZZZ_UNCOMPRESSED ); - BU_CK_EXTERNAL( ext ); - bu_free_external( &body ); - bu_free_external( &attributes ); + db5_export_object3(ext, DB5HDR_HFLAGS_DLI_APPLICATION_DATA_OBJECT, + name, 0, &attributes, &body, + major, minor, + DB5_ZZZ_UNCOMPRESSED, DB5_ZZZ_UNCOMPRESSED); + BU_CK_EXTERNAL(ext); + bu_free_external(&body); + bu_free_external(&attributes); return 0; /* OK */ } + /* - * D B _ W R A P _ V 5 _ E X T E R N A L + * D B _ W R A P _ V 5 _ E X T E R N A L * - * Modify name of external object, if necessary. + * Modify name of external object, if necessary. */ int -db_wrap_v5_external( struct bu_external *ep, const char *name ) +db_wr... [truncated message content] |
From: <br...@us...> - 2010-03-02 18:20:34
|
Revision: 37848 http://brlcad.svn.sourceforge.net/brlcad/?rev=37848&view=rev Author: brlcad Date: 2010-03-02 18:20:27 +0000 (Tue, 02 Mar 2010) Log Message: ----------- ws indent style consistency cleanup Modified Paths: -------------- brlcad/trunk/src/librt/binunif/binunif.c brlcad/trunk/src/librt/comb/comb.c brlcad/trunk/src/librt/comb/comb_mirror.c brlcad/trunk/src/librt/comb/db_comb.c brlcad/trunk/src/librt/db_io.c Modified: brlcad/trunk/src/librt/binunif/binunif.c =================================================================== --- brlcad/trunk/src/librt/binunif/binunif.c 2010-03-02 18:19:42 UTC (rev 37847) +++ brlcad/trunk/src/librt/binunif/binunif.c 2010-03-02 18:20:27 UTC (rev 37848) @@ -17,15 +17,15 @@ * License along with this file; see the file named COPYING for more * information. */ -/** @addtogroup db5 */ +/** @addtogroup db5 */ /** @{ */ /** @file binary_obj.c * - * Routines for writing binary objects to a BRL-CAD database - * Assumes that some of the structure of such databases are known - * by the calling routines. + * Routines for writing binary objects to a BRL-CAD database + * Assumes that some of the structure of such databases are known + * by the calling routines. * - * Return codes of 0 are OK, -1 signal an error. + * Return codes of 0 are OK, -1 signal an error. * */ /** @} */ @@ -68,24 +68,24 @@ struct directory *dp; int ret; - if ( (item_length=db5_type_sizeof_h_binu( minor_type ) ) <= 0 ) { - bu_log( "Unrecognized minor type!\n" ); + if ((item_length=db5_type_sizeof_h_binu(minor_type)) <= 0) { + bu_log("Unrecognized minor type!\n"); return -1; } - if ( stat( file_name, &st ) ) { - bu_log( "Cannot stat input file(%s)", file_name ); + if (stat(file_name, &st)) { + bu_log("Cannot stat input file(%s)", file_name); return -1; } - if ( (bu_fd=bu_open_mapped_file( file_name, NULL)) == NULL ) { - bu_log( "Cannot open input file(%s) for reading", - file_name ); + if ((bu_fd=bu_open_mapped_file(file_name, NULL)) == NULL) { + bu_log("Cannot open input file(%s) for reading", + file_name); return -1; } /* create the rt_binunif internal form */ - BU_GETSTRUCT( bip, rt_binunif_internal ); + BU_GETSTRUCT(bip, rt_binunif_internal); bip->magic = RT_BINUNIF_INTERNAL_MAGIC; bip->type = minor_type; @@ -107,13 +107,13 @@ /* just copy the bytes */ bip->count = (long)num_items; - bip->u.int8 = (char *)bu_malloc( obj_length, "binary uniform object" ); + bip->u.int8 = (char *)bu_malloc(obj_length, "binary uniform object"); memcpy(bip->u.int8, bu_fd->buf, obj_length); - bu_close_mapped_file( bu_fd ); + bu_close_mapped_file(bu_fd); /* create the rt_internal form */ - RT_INIT_DB_INTERNAL( &intern ); + RT_INIT_DB_INTERNAL(&intern); intern.idb_major_type = major_type; intern.idb_minor_type = minor_type; intern.idb_ptr = (genptr_t)bip; @@ -125,19 +125,19 @@ ret = intern.idb_meth->ft_export5(&body, &intern, 1.0, wdbp->dbip, wdbp->wdb_resp); } if (ret != 0) { - bu_log( "Error while attemptimg to export %s\n", obj_name ); + bu_log("Error while attemptimg to export %s\n", obj_name); rt_db_free_internal(&intern); return -1; } /* create entire external form */ - db5_export_object3( &bin_ext, DB5HDR_HFLAGS_DLI_APPLICATION_DATA_OBJECT, - obj_name, 0, NULL, &body, - intern.idb_major_type, intern.idb_minor_type, - DB5_ZZZ_UNCOMPRESSED, DB5_ZZZ_UNCOMPRESSED ); + db5_export_object3(&bin_ext, DB5HDR_HFLAGS_DLI_APPLICATION_DATA_OBJECT, + obj_name, 0, NULL, &body, + intern.idb_major_type, intern.idb_minor_type, + DB5_ZZZ_UNCOMPRESSED, DB5_ZZZ_UNCOMPRESSED); rt_db_free_internal(&intern); - bu_free_external( &body ); + bu_free_external(&body); /* make sure the database directory is initialized */ if (wdbp->dbip->dbi_eof == RT_DIR_PHONY_ADDR) { @@ -148,27 +148,28 @@ } /* add this (phony until written) object to the directory */ - if ( (dp=db_diradd5( wdbp->dbip, obj_name, -1, major_type, - minor_type, 0, 0, NULL )) == DIR_NULL ) { - bu_log( "Error while attemptimg to add new name (%s) to the database", - obj_name ); - bu_free_external( &bin_ext ); + if ((dp=db_diradd5(wdbp->dbip, obj_name, -1, major_type, + minor_type, 0, 0, NULL)) == DIR_NULL) { + bu_log("Error while attemptimg to add new name (%s) to the database", + obj_name); + bu_free_external(&bin_ext); return -1; } /* and write it to the database */ - if ( db_put_external5( &bin_ext, dp, wdbp->dbip ) ) { - bu_log( "Error while adding new binary object (%s) to the database", - obj_name ); - bu_free_external( &bin_ext ); + if (db_put_external5(&bin_ext, dp, wdbp->dbip)) { + bu_log("Error while adding new binary object (%s) to the database", + obj_name); + bu_free_external(&bin_ext); return -1; } - bu_free_external( &bin_ext ); + bu_free_external(&bin_ext); return 0; } + /* * Local Variables: * mode: C Modified: brlcad/trunk/src/librt/comb/comb.c =================================================================== --- brlcad/trunk/src/librt/comb/comb.c 2010-03-02 18:19:42 UTC (rev 37847) +++ brlcad/trunk/src/librt/comb/comb.c 2010-03-02 18:20:27 UTC (rev 37848) @@ -55,44 +55,44 @@ struct db_tree_counter_state { - long magic; - long n_mat; /* # leaves with non-identity matricies */ - long n_leaf; /* # leaf nodes */ - long n_oper; /* # operator nodes */ - long leafbytes; /* # bytes for name section */ - int non_union_seen; /* boolean, 1 = non-unions seen */ + long magic; + long n_mat; /* # leaves with non-identity matricies */ + long n_leaf; /* # leaf nodes */ + long n_oper; /* # operator nodes */ + long leafbytes; /* # bytes for name section */ + int non_union_seen; /* boolean, 1 = non-unions seen */ }; -#define DB_TREE_COUNTER_STATE_MAGIC 0x64546373 /* dTcs */ -#define DB_CK_TREE_COUNTER_STATE(_p) BU_CKMAG(_p, DB_TREE_COUNTER_STATE_MAGIC, "db_tree_counter_state"); +#define DB_TREE_COUNTER_STATE_MAGIC 0x64546373 /* dTcs */ +#define DB_CK_TREE_COUNTER_STATE(_p) BU_CKMAG(_p, DB_TREE_COUNTER_STATE_MAGIC, "db_tree_counter_state"); /** * D B _ T R E E _ C O U N T E R * - * Count number of non-identity matricies, - * number of leaf nodes, number of operator nodes, etc. + * Count number of non-identity matricies, number of leaf nodes, + * number of operator nodes, etc. * - * Returns - - * maximum depth of stack needed to unpack this tree, if serialized. + * Returns - maximum depth of stack needed to unpack this tree, if + * serialized. * - * Notes - - * We over-estimate the size of the width fields used for - * holding the matrix subscripts. - * The caller is responsible for correcting by saying: - * tcsp->leafbytes -= tcsp->n_leaf * (8 - db5_enc_len[wid]); + * Notes - We over-estimate the size of the width fields used for + * holding the matrix subscripts. The caller is responsible for + * correcting by saying: + * + * tcsp->leafbytes -= tcsp->n_leaf * (8 - db5_enc_len[wid]); */ long -db_tree_counter( const union tree *tp, struct db_tree_counter_state *tcsp ) +db_tree_counter(const union tree *tp, struct db_tree_counter_state *tcsp) { - long ldepth, rdepth; + long ldepth, rdepth; RT_CK_TREE(tp); DB_CK_TREE_COUNTER_STATE(tcsp); - switch ( tp->tr_op ) { + switch (tp->tr_op) { case OP_DB_LEAF: tcsp->n_leaf++; - if ( tp->tr_l.tl_mat && !bn_mat_is_identity(tp->tr_l.tl_mat) ) tcsp->n_mat++; + if (tp->tr_l.tl_mat && !bn_mat_is_identity(tp->tr_l.tl_mat)) tcsp->n_mat++; /* Over-estimate storage requirement for matrix # */ tcsp->leafbytes += (long)strlen(tp->tr_l.tl_name) + 1 + 8; return 1; @@ -101,14 +101,14 @@ /* Unary ops */ tcsp->n_oper++; tcsp->non_union_seen = 1; - return 1 + db_tree_counter( tp->tr_b.tb_left, tcsp ); + return 1 + db_tree_counter(tp->tr_b.tb_left, tcsp); case OP_UNION: /* This node is known to be a binary op */ tcsp->n_oper++; - ldepth = db_tree_counter( tp->tr_b.tb_left, tcsp ); - rdepth = db_tree_counter( tp->tr_b.tb_right, tcsp ); - if ( ldepth > rdepth ) return ldepth; + ldepth = db_tree_counter(tp->tr_b.tb_left, tcsp); + rdepth = db_tree_counter(tp->tr_b.tb_right, tcsp); + if (ldepth > rdepth) return ldepth; return rdepth; case OP_INTERSECT: @@ -117,9 +117,9 @@ /* This node is known to be a binary op */ tcsp->n_oper++; tcsp->non_union_seen = 1; - ldepth = db_tree_counter( tp->tr_b.tb_left, tcsp ); - rdepth = db_tree_counter( tp->tr_b.tb_right, tcsp ); - if ( ldepth > rdepth ) return ldepth; + ldepth = db_tree_counter(tp->tr_b.tb_left, tcsp); + rdepth = db_tree_counter(tp->tr_b.tb_right, tcsp); + if (ldepth > rdepth) return ldepth; return rdepth; default: @@ -131,6 +131,7 @@ return 0; } + #define DB5COMB_TOKEN_LEAF 1 #define DB5COMB_TOKEN_UNION 2 #define DB5COMB_TOKEN_INTERSECT 3 @@ -138,17 +139,17 @@ #define DB5COMB_TOKEN_XOR 5 #define DB5COMB_TOKEN_NOT 6 -struct rt_comb_v5_serialize_state { - long magic; - long mat_num; /* current matrix number */ - long nmat; /* # matricies, total */ - unsigned char *matp; - unsigned char *leafp; - unsigned char *exprp; - int wid; +struct rt_comb_v5_serialize_state { + long magic; + long mat_num; /* current matrix number */ + long nmat; /* # matricies, total */ + unsigned char *matp; + unsigned char *leafp; + unsigned char *exprp; + int wid; }; -#define RT_COMB_V5_SERIALIZE_STATE_MAGIC 0x43357373 /* C5ss */ -#define RT_CK_COMB_V5_SERIALIZE_STATE(_p) BU_CKMAG(_p, RT_COMB_V5_SERIALIZE_STATE_MAGIC, "rt_comb_v5_serialize_state") +#define RT_COMB_V5_SERIALIZE_STATE_MAGIC 0x43357373 /* C5ss */ +#define RT_CK_COMB_V5_SERIALIZE_STATE(_p) BU_CKMAG(_p, RT_COMB_V5_SERIALIZE_STATE_MAGIC, "rt_comb_v5_serialize_state") /** @@ -159,16 +160,16 @@ */ void rt_comb_v5_serialize( - const union tree *tp, - struct rt_comb_v5_serialize_state *ssp) + const union tree *tp, + struct rt_comb_v5_serialize_state *ssp) { size_t n; - int mi; + int mi; RT_CK_TREE(tp); RT_CK_COMB_V5_SERIALIZE_STATE(ssp); - switch ( tp->tr_op ) { + switch (tp->tr_op) { case OP_DB_LEAF: /* * Encoding of the leaf: A null-terminated name string, @@ -178,59 +179,59 @@ memcpy(ssp->leafp, tp->tr_l.tl_name, n); ssp->leafp += n; - if ( tp->tr_l.tl_mat && !bn_mat_is_identity(tp->tr_l.tl_mat) ) + if (tp->tr_l.tl_mat && !bn_mat_is_identity(tp->tr_l.tl_mat)) mi = ssp->mat_num++; else mi = -1; - BU_ASSERT_LONG( mi, <, ssp->nmat ); - ssp->leafp = db5_encode_length( ssp->leafp, mi, ssp->wid ); + BU_ASSERT_LONG(mi, <, ssp->nmat); + ssp->leafp = db5_encode_length(ssp->leafp, mi, ssp->wid); /* Encoding of the matrix */ - if ( mi > -1 ) { - htond( ssp->matp, - (const unsigned char *)tp->tr_l.tl_mat, - ELEMENTS_PER_MAT ); + if (mi > -1) { + htond(ssp->matp, + (const unsigned char *)tp->tr_l.tl_mat, + ELEMENTS_PER_MAT); ssp->matp += ELEMENTS_PER_MAT * SIZEOF_NETWORK_DOUBLE; } /* Encoding of the "leaf" operator */ - if ( ssp->exprp ) + if (ssp->exprp) *ssp->exprp++ = DB5COMB_TOKEN_LEAF; return; case OP_NOT: /* Unary ops */ - rt_comb_v5_serialize( tp->tr_b.tb_left, ssp ); - if ( ssp->exprp ) + rt_comb_v5_serialize(tp->tr_b.tb_left, ssp); + if (ssp->exprp) *ssp->exprp++ = DB5COMB_TOKEN_NOT; return; case OP_UNION: /* This node is known to be a binary op */ - rt_comb_v5_serialize( tp->tr_b.tb_left, ssp ); - rt_comb_v5_serialize( tp->tr_b.tb_right, ssp ); - if ( ssp->exprp ) + rt_comb_v5_serialize(tp->tr_b.tb_left, ssp); + rt_comb_v5_serialize(tp->tr_b.tb_right, ssp); + if (ssp->exprp) *ssp->exprp++ = DB5COMB_TOKEN_UNION; return; case OP_INTERSECT: /* This node is known to be a binary op */ - rt_comb_v5_serialize( tp->tr_b.tb_left, ssp ); - rt_comb_v5_serialize( tp->tr_b.tb_right, ssp ); - if ( ssp->exprp ) + rt_comb_v5_serialize(tp->tr_b.tb_left, ssp); + rt_comb_v5_serialize(tp->tr_b.tb_right, ssp); + if (ssp->exprp) *ssp->exprp++ = DB5COMB_TOKEN_INTERSECT; return; case OP_SUBTRACT: /* This node is known to be a binary op */ - rt_comb_v5_serialize( tp->tr_b.tb_left, ssp ); - rt_comb_v5_serialize( tp->tr_b.tb_right, ssp ); - if ( ssp->exprp ) + rt_comb_v5_serialize(tp->tr_b.tb_left, ssp); + rt_comb_v5_serialize(tp->tr_b.tb_right, ssp); + if (ssp->exprp) *ssp->exprp++ = DB5COMB_TOKEN_SUBTRACT; return; case OP_XOR: /* This node is known to be a binary op */ - rt_comb_v5_serialize( tp->tr_b.tb_left, ssp ); - rt_comb_v5_serialize( tp->tr_b.tb_right, ssp ); - if ( ssp->exprp ) + rt_comb_v5_serialize(tp->tr_b.tb_left, ssp); + rt_comb_v5_serialize(tp->tr_b.tb_right, ssp); + if (ssp->exprp) *ssp->exprp++ = DB5COMB_TOKEN_XOR; return; @@ -246,29 +247,29 @@ */ int rt_comb_export5( - struct bu_external *ep, - const struct rt_db_internal *ip, - double local2mm __attribute__((unused)), - const struct db_i *dbip, - struct resource *resp) + struct bu_external *ep, + const struct rt_db_internal *ip, + double local2mm __attribute__((unused)), + const struct db_i *dbip, + struct resource *resp) { - struct rt_comb_internal *comb; - struct db_tree_counter_state tcs; - struct rt_comb_v5_serialize_state ss; - long max_stack_depth; - long need; - int rpn_len = 0; /* # items in RPN expression */ - int wid; - unsigned char *cp; - unsigned char *leafp_end; + struct rt_comb_internal *comb; + struct db_tree_counter_state tcs; + struct rt_comb_v5_serialize_state ss; + long max_stack_depth; + long need; + int rpn_len = 0; /* # items in RPN expression */ + int wid; + unsigned char *cp; + unsigned char *leafp_end; struct bu_attribute_value_set *avsp; - struct bu_vls value; + struct bu_vls value; - RT_CK_DB_INTERNAL( ip ); + RT_CK_DB_INTERNAL(ip); RT_CK_RESOURCE(resp); if (dbip) RT_CK_DBI(dbip); - if ( ip->idb_type != ID_COMBINATION ) bu_bomb("rt_comb_export5() type not ID_COMBINATION"); + if (ip->idb_type != ID_COMBINATION) bu_bomb("rt_comb_export5() type not ID_COMBINATION"); comb = (struct rt_comb_internal *)ip->idb_ptr; RT_CK_COMB(comb); @@ -277,12 +278,12 @@ */ memset((char *)&tcs, 0, sizeof(tcs)); tcs.magic = DB_TREE_COUNTER_STATE_MAGIC; - if ( comb->tree ) - max_stack_depth = db_tree_counter( comb->tree, &tcs ); + if (comb->tree) + max_stack_depth = db_tree_counter(comb->tree, &tcs); else max_stack_depth = 0; /* some combinations have no tree */ - if ( tcs.non_union_seen ) { + if (tcs.non_union_seen) { /* RPN expression needs one byte for each leaf or operator node */ rpn_len = tcs.n_leaf + tcs.n_oper; } else { @@ -291,7 +292,7 @@ wid = db5_select_length_encoding( tcs.n_mat | tcs.n_leaf | tcs.leafbytes | - rpn_len | max_stack_depth ); + rpn_len | max_stack_depth); /* Apply correction factor to tcs.leafbytes now that we know * 'wid'. Ignore the slight chance that a smaller 'wid' might now @@ -312,16 +313,16 @@ BU_INIT_EXTERNAL(ep); ep->ext_nbytes = need; - ep->ext_buf = bu_calloc( 1, need, "rt_comb_export5 ext_buf" ); + ep->ext_buf = bu_calloc(1, need, "rt_comb_export5 ext_buf"); /* Build combination's on-disk header section */ cp = (unsigned char *)ep->ext_buf; *cp++ = wid; - cp = db5_encode_length( cp, tcs.n_mat, wid ); - cp = db5_encode_length( cp, tcs.n_leaf, wid ); - cp = db5_encode_length( cp, tcs.leafbytes, wid ); - cp = db5_encode_length( cp, rpn_len, wid ); - cp = db5_encode_length( cp, max_stack_depth, wid ); + cp = db5_encode_length(cp, tcs.n_mat, wid); + cp = db5_encode_length(cp, tcs.n_leaf, wid); + cp = db5_encode_length(cp, tcs.leafbytes, wid); + cp = db5_encode_length(cp, rpn_len, wid); + cp = db5_encode_length(cp, max_stack_depth, wid); /* * The output format has three sections: @@ -340,32 +341,32 @@ ss.matp = cp; ss.leafp = cp + tcs.n_mat * (ELEMENTS_PER_MAT * SIZEOF_NETWORK_DOUBLE); leafp_end = ss.leafp + tcs.leafbytes; - if ( rpn_len ) + if (rpn_len) ss.exprp = leafp_end; else ss.exprp = NULL; - if ( comb->tree ) - rt_comb_v5_serialize( comb->tree, &ss ); + if (comb->tree) + rt_comb_v5_serialize(comb->tree, &ss); - BU_ASSERT_LONG( ss.mat_num, ==, tcs.n_mat ); - BU_ASSERT_PTR( ss.matp, ==, cp + tcs.n_mat * (ELEMENTS_PER_MAT * SIZEOF_NETWORK_DOUBLE) ); - BU_ASSERT_PTR( ss.leafp, ==, leafp_end ); - if ( rpn_len ) - BU_ASSERT_PTR( ss.exprp, <=, ((unsigned char *)ep->ext_buf) + ep->ext_nbytes ); + BU_ASSERT_LONG(ss.mat_num, ==, tcs.n_mat); + BU_ASSERT_PTR(ss.matp, ==, cp + tcs.n_mat * (ELEMENTS_PER_MAT * SIZEOF_NETWORK_DOUBLE)); + BU_ASSERT_PTR(ss.leafp, ==, leafp_end); + if (rpn_len) + BU_ASSERT_PTR(ss.exprp, <=, ((unsigned char *)ep->ext_buf) + ep->ext_nbytes); /* Encode all the other stuff as attributes. */ - bu_vls_init( &value ); + bu_vls_init(&value); /* WARNING: We remove const from the ip pointer!!! */ avsp = (struct bu_attribute_value_set *)&ip->idb_avs; - if ( avsp->magic != BU_AVS_MAGIC ) - bu_avs_init( avsp, 32, "rt_comb v5 attributes" ); - if ( comb->region_flag ) { + if (avsp->magic != BU_AVS_MAGIC) + bu_avs_init(avsp, 32, "rt_comb v5 attributes"); + if (comb->region_flag) { /* Presence of this attribute means this comb is a region. * Current code values are 0, 1, and 2; all are regions. See * raytrace.h for meanings of different values */ - bu_vls_trunc( &value, 0 ); + bu_vls_trunc(&value, 0); switch (comb->is_fastgen) { case REGION_FASTGEN_PLATE: bu_vls_printf(&value, "P"); @@ -378,58 +379,58 @@ bu_vls_printf(&value, "R"); break; } - bu_avs_add_vls( avsp, "region", &value ); + bu_avs_add_vls(avsp, "region", &value); } else - bu_avs_remove( avsp, "region" ); + bu_avs_remove(avsp, "region"); - if ( comb->inherit ) - bu_avs_add( avsp, "inherit", "1" ); + if (comb->inherit) + bu_avs_add(avsp, "inherit", "1"); else - bu_avs_remove( avsp, "inherit" ); + bu_avs_remove(avsp, "inherit"); - if ( comb->rgb_valid ) { - bu_vls_trunc( &value, 0 ); - bu_vls_printf( &value, "%d/%d/%d", V3ARGS(comb->rgb) ); - bu_avs_add_vls( avsp, "rgb", &value ); + if (comb->rgb_valid) { + bu_vls_trunc(&value, 0); + bu_vls_printf(&value, "%d/%d/%d", V3ARGS(comb->rgb)); + bu_avs_add_vls(avsp, "rgb", &value); } else - bu_avs_remove( avsp, "rgb" ); + bu_avs_remove(avsp, "rgb"); /* optical shader string goes in an attribute */ - if ( bu_vls_strlen( &comb->shader ) > 0 ) - bu_avs_add_vls( avsp, "oshader", &comb->shader ); + if (bu_vls_strlen(&comb->shader) > 0) + bu_avs_add_vls(avsp, "oshader", &comb->shader); else - bu_avs_remove( avsp, "oshader" ); + bu_avs_remove(avsp, "oshader"); /* GIFT compatability */ - if ( comb->region_id != 0 ) { - bu_vls_trunc( &value, 0 ); - bu_vls_printf( &value, "%d", comb->region_id ); - bu_avs_add_vls( avsp, "region_id", &value ); + if (comb->region_id != 0) { + bu_vls_trunc(&value, 0); + bu_vls_printf(&value, "%d", comb->region_id); + bu_avs_add_vls(avsp, "region_id", &value); } else - bu_avs_remove( avsp, "region_id" ); + bu_avs_remove(avsp, "region_id"); - if ( comb->aircode != 0 ) { - bu_vls_trunc( &value, 0 ); - bu_vls_printf( &value, "%d", comb->aircode ); - bu_avs_add_vls( avsp, "aircode", &value ); + if (comb->aircode != 0) { + bu_vls_trunc(&value, 0); + bu_vls_printf(&value, "%d", comb->aircode); + bu_avs_add_vls(avsp, "aircode", &value); } else - bu_avs_remove( avsp, "aircode" ); + bu_avs_remove(avsp, "aircode"); - if ( comb->GIFTmater != 0 ) { - bu_vls_trunc( &value, 0 ); - bu_vls_printf( &value, "%d", comb->GIFTmater ); - bu_avs_add_vls( avsp, "material_id", &value ); + if (comb->GIFTmater != 0) { + bu_vls_trunc(&value, 0); + bu_vls_printf(&value, "%d", comb->GIFTmater); + bu_avs_add_vls(avsp, "material_id", &value); } else - bu_avs_remove( avsp, "material_id" ); + bu_avs_remove(avsp, "material_id"); - if ( comb->los != 0 ) { - bu_vls_trunc( &value, 0 ); - bu_vls_printf( &value, "%d", comb->los ); - bu_avs_add_vls( avsp, "los", &value ); + if (comb->los != 0) { + bu_vls_trunc(&value, 0); + bu_vls_printf(&value, "%d", comb->los); + bu_avs_add_vls(avsp, "los", &value); } else - bu_avs_remove( avsp, "los" ); + bu_avs_remove(avsp, "los"); - bu_vls_free( &value ); + bu_vls_free(&value); return 0; /* OK */ } @@ -446,28 +447,28 @@ * ip->idb_avs, we get the attributes from there. * * Returns - - * 0 OK - * -1 FAIL + * 0 OK + * -1 FAIL */ int rt_comb_import5(struct rt_db_internal *ip, const struct bu_external *ep, const mat_t mat, const struct db_i *dbip, struct resource *resp) { - struct rt_comb_internal *comb; - unsigned char *cp; - int wid; - size_t nmat, nleaf, rpn_len, max_stack_depth; - size_t leafbytes; - unsigned char *matp; - unsigned char *leafp; - unsigned char *leafp_end; - unsigned char *exprp; -#define MAX_V5_STACK 8000 - union tree *stack[MAX_V5_STACK]; - union tree **sp; /* stack pointer */ - const char *ap; - size_t ius; + struct rt_comb_internal *comb; + unsigned char *cp; + int wid; + size_t nmat, nleaf, rpn_len, max_stack_depth; + size_t leafbytes; + unsigned char *matp; + unsigned char *leafp; + unsigned char *leafp_end; + unsigned char *exprp; +#define MAX_V5_STACK 8000 + union tree *stack[MAX_V5_STACK]; + union tree **sp; /* stack pointer */ + const char *ap; + size_t ius; - RT_CK_DB_INTERNAL( ip ); + RT_CK_DB_INTERNAL(ip); BU_CK_EXTERNAL(ep); RT_CK_DBI(dbip); RT_CK_RESOURCE(resp); @@ -475,139 +476,139 @@ ip->idb_major_type = DB5_MAJORTYPE_BRLCAD; ip->idb_type = ID_COMBINATION; ip->idb_meth = &rt_functab[ID_COMBINATION]; - BU_GETSTRUCT( comb, rt_comb_internal ); + BU_GETSTRUCT(comb, rt_comb_internal); ip->idb_ptr = (genptr_t)comb; comb->magic = RT_COMB_MAGIC; - bu_vls_init( &comb->shader ); - bu_vls_init( &comb->material ); + bu_vls_init(&comb->shader); + bu_vls_init(&comb->material); comb->temperature = -1; cp = ep->ext_buf; wid = *cp++; - cp += db5_decode_length( &nmat, cp, wid ); - cp += db5_decode_length( &nleaf, cp, wid ); - cp += db5_decode_length( &leafbytes, cp, wid ); - cp += db5_decode_length( &rpn_len, cp, wid ); - cp += db5_decode_length( &max_stack_depth, cp, wid ); + cp += db5_decode_length(&nmat, cp, wid); + cp += db5_decode_length(&nleaf, cp, wid); + cp += db5_decode_length(&leafbytes, cp, wid); + cp += db5_decode_length(&rpn_len, cp, wid); + cp += db5_decode_length(&max_stack_depth, cp, wid); matp = cp; leafp = cp + nmat * (ELEMENTS_PER_MAT * SIZEOF_NETWORK_DOUBLE); exprp = leafp + leafbytes; leafp_end = exprp; - if ( rpn_len == 0 ) { + if (rpn_len == 0) { ssize_t is; /* This tree is all union operators, import it as a balanced tree */ struct bu_ptbl *tbl1, *tbl2; - tbl1 = (struct bu_ptbl *)bu_malloc( sizeof( struct bu_ptbl ), "rt_comb_import5: tbl1" ); - tbl2 = (struct bu_ptbl *)bu_malloc( sizeof( struct bu_ptbl ), "rt_comb_import5: tbl2" ); + tbl1 = (struct bu_ptbl *)bu_malloc(sizeof(struct bu_ptbl), "rt_comb_import5: tbl1"); + tbl2 = (struct bu_ptbl *)bu_malloc(sizeof(struct bu_ptbl), "rt_comb_import5: tbl2"); /* insert all the leaf nodes into a bu_ptbl */ - bu_ptbl_init( tbl1, nleaf, "rt_comb_import5: tbl" ); - for (is = nleaf-1; is >= 0; is-- ) { - union tree *tp; - size_t mi; + bu_ptbl_init(tbl1, nleaf, "rt_comb_import5: tbl"); + for (is = nleaf-1; is >= 0; is--) { + union tree *tp; + size_t mi; - RT_GET_TREE( tp, resp ); + RT_GET_TREE(tp, resp); tp->tr_l.magic = RT_TREE_MAGIC; tp->tr_l.tl_op = OP_DB_LEAF; - tp->tr_l.tl_name = bu_strdup( (const char *)leafp ); - leafp += strlen( (const char *)leafp) + 1; + tp->tr_l.tl_name = bu_strdup((const char *)leafp); + leafp += strlen((const char *)leafp) + 1; /* Get matrix index */ mi = 4095; /* sanity */ - leafp += db5_decode_signed( &mi, leafp, wid ); + leafp += db5_decode_signed(&mi, leafp, wid); - if ( (ssize_t)mi < 0 ) { + if ((ssize_t)mi < 0) { /* Signal identity matrix */ - if ( !mat || bn_mat_is_identity( mat ) ) { + if (!mat || bn_mat_is_identity(mat)) { tp->tr_l.tl_mat = (matp_t)NULL; } else - tp->tr_l.tl_mat = bn_mat_dup( mat ); + tp->tr_l.tl_mat = bn_mat_dup(mat); } else { mat_t diskmat; /* Unpack indicated matrix mi */ - BU_ASSERT_LONG( mi, <, nmat ); - ntohd( (unsigned char *)diskmat, - &matp[mi*ELEMENTS_PER_MAT*SIZEOF_NETWORK_DOUBLE], - ELEMENTS_PER_MAT); - if ( !mat || bn_mat_is_identity( mat ) ) { - tp->tr_l.tl_mat = bn_mat_dup( diskmat ); + BU_ASSERT_LONG(mi, <, nmat); + ntohd((unsigned char *)diskmat, + &matp[mi*ELEMENTS_PER_MAT*SIZEOF_NETWORK_DOUBLE], + ELEMENTS_PER_MAT); + if (!mat || bn_mat_is_identity(mat)) { + tp->tr_l.tl_mat = bn_mat_dup(diskmat); } else { tp->tr_l.tl_mat = (matp_t)bu_malloc( sizeof(mat_t), "v5comb mat"); - bn_mat_mul( tp->tr_l.tl_mat, mat, diskmat ); - if ( bn_mat_is_identity( tp->tr_l.tl_mat ) ) { - bu_free( (char *)tp->tr_l.tl_mat, "tl_mat"); + bn_mat_mul(tp->tr_l.tl_mat, mat, diskmat); + if (bn_mat_is_identity(tp->tr_l.tl_mat)) { + bu_free((char *)tp->tr_l.tl_mat, "tl_mat"); tp->tr_l.tl_mat = (matp_t)NULL; } } } - bu_ptbl_ins( tbl1, (long *)tp ); + bu_ptbl_ins(tbl1, (long *)tp); } /* use a second bu_ptbl to help build a balanced tree - * 1 - pick off pairs of pointers from tbl1 - * 2 - make a small tree thats unions the pair - * 3 - insert that tree into tbl2 - * 4 - insert any leftover pointer from tbl1 into tbl2 - * 5 - swap tbl1 and tbl2 - * 6 - truncate tbl2 and go to step 1 + * 1 - pick off pairs of pointers from tbl1 + * 2 - make a small tree thats unions the pair + * 3 - insert that tree into tbl2 + * 4 - insert any leftover pointer from tbl1 into tbl2 + * 5 - swap tbl1 and tbl2 + * 6 - truncate tbl2 and go to step 1 * stop when tbl2 has less than 2 members */ - bu_ptbl_init( tbl2, (BU_PTBL_LEN( tbl1) + 1)/2, "rt_comb_import5: tbl1" ); - while ( 1 ) { + bu_ptbl_init(tbl2, (BU_PTBL_LEN(tbl1) + 1)/2, "rt_comb_import5: tbl1"); + while (1) { struct bu_ptbl *tmp; - for ( is=0; is<BU_PTBL_LEN( tbl1 ); is += 2 ) { + for (is=0; is<BU_PTBL_LEN(tbl1); is += 2) { union tree *tp1, *tp2, *unionp; int j; j = is + 1; - tp1 = (union tree *)BU_PTBL_GET( tbl1, is ); - if ( j < BU_PTBL_LEN( tbl1 ) ) { - tp2 = (union tree *)BU_PTBL_GET( tbl1, j ); + tp1 = (union tree *)BU_PTBL_GET(tbl1, is); + if (j < BU_PTBL_LEN(tbl1)) { + tp2 = (union tree *)BU_PTBL_GET(tbl1, j); } else { tp2 = (union tree *)NULL; } - if ( tp2 ) { - RT_GET_TREE( unionp, resp ); + if (tp2) { + RT_GET_TREE(unionp, resp); unionp->tr_b.magic = RT_TREE_MAGIC; unionp->tr_b.tb_op = OP_UNION; unionp->tr_b.tb_left = tp1; unionp->tr_b.tb_right = tp2; - bu_ptbl_ins( tbl2, (long *)unionp ); + bu_ptbl_ins(tbl2, (long *)unionp); } else { - bu_ptbl_ins( tbl2, (long *)tp1 ); + bu_ptbl_ins(tbl2, (long *)tp1); } } - if ( BU_PTBL_LEN( tbl2 ) == 0 ) { + if (BU_PTBL_LEN(tbl2) == 0) { comb->tree = (union tree *)NULL; - bu_ptbl_free( tbl1 ); - bu_ptbl_free( tbl2 ); - bu_free( (char *)tbl1, "rt_comb_import5: tbl1" ); - bu_free( (char *)tbl2, "rt_comb_import5: tbl2" ); + bu_ptbl_free(tbl1); + bu_ptbl_free(tbl2); + bu_free((char *)tbl1, "rt_comb_import5: tbl1"); + bu_free((char *)tbl2, "rt_comb_import5: tbl2"); break; - } else if ( BU_PTBL_LEN( tbl2 ) == 1 ) { - comb->tree = (union tree *)BU_PTBL_GET( tbl2, 0 ); - bu_ptbl_free( tbl1 ); - bu_ptbl_free( tbl2 ); - bu_free( (char *)tbl1, "rt_comb_import5: tbl1" ); - bu_free( (char *)tbl2, "rt_comb_import5: tbl2" ); + } else if (BU_PTBL_LEN(tbl2) == 1) { + comb->tree = (union tree *)BU_PTBL_GET(tbl2, 0); + bu_ptbl_free(tbl1); + bu_ptbl_free(tbl2); + bu_free((char *)tbl1, "rt_comb_import5: tbl1"); + bu_free((char *)tbl2, "rt_comb_import5: tbl2"); break; } tmp = tbl2; tbl2 = tbl1; tbl1 = tmp; - bu_ptbl_trunc( tbl2, 0 ); + bu_ptbl_trunc(tbl2, 0); } - BU_ASSERT_PTR( leafp, ==, leafp_end ); + BU_ASSERT_PTR(leafp, ==, leafp_end); goto finish; } @@ -615,52 +616,52 @@ * Bring the RPN expression back from the disk, populating leaves * and matricies in the order they are encountered. */ - if ( max_stack_depth > MAX_V5_STACK ) { + if (max_stack_depth > MAX_V5_STACK) { bu_log("Combination needs stack depth %d, only have %d, aborted\n", max_stack_depth, MAX_V5_STACK); return -1; } sp = &stack[0]; - for ( ius=0; ius < rpn_len; ius++, exprp++ ) { - union tree *tp; - size_t mi; + for (ius=0; ius < rpn_len; ius++, exprp++) { + union tree *tp; + size_t mi; - RT_GET_TREE( tp, resp ); + RT_GET_TREE(tp, resp); tp->tr_b.magic = RT_TREE_MAGIC; - switch ( *exprp ) { + switch (*exprp) { case DB5COMB_TOKEN_LEAF: tp->tr_l.tl_op = OP_DB_LEAF; - tp->tr_l.tl_name = bu_strdup( (const char *)leafp ); - leafp += strlen( (const char *)leafp) + 1; + tp->tr_l.tl_name = bu_strdup((const char *)leafp); + leafp += strlen((const char *)leafp) + 1; /* Get matrix index */ mi = 4095; /* sanity */ - leafp += db5_decode_signed( &mi, leafp, wid ); + leafp += db5_decode_signed(&mi, leafp, wid); - if ( (ssize_t)mi < 0 ) { + if ((ssize_t)mi < 0) { /* Signal identity matrix */ - if ( !mat || bn_mat_is_identity( mat ) ) { + if (!mat || bn_mat_is_identity(mat)) { tp->tr_l.tl_mat = (matp_t)NULL; } else - tp->tr_l.tl_mat = bn_mat_dup( mat ); + tp->tr_l.tl_mat = bn_mat_dup(mat); } else { mat_t diskmat; /* Unpack indicated matrix mi */ - BU_ASSERT_LONG( mi, <, nmat ); - ntohd( (unsigned char *)diskmat, - &matp[mi*ELEMENTS_PER_MAT*SIZEOF_NETWORK_DOUBLE], - ELEMENTS_PER_MAT); - if ( !mat || bn_mat_is_identity( mat ) ) { - tp->tr_l.tl_mat = bn_mat_dup( diskmat ); + BU_ASSERT_LONG(mi, <, nmat); + ntohd((unsigned char *)diskmat, + &matp[mi*ELEMENTS_PER_MAT*SIZEOF_NETWORK_DOUBLE], + ELEMENTS_PER_MAT); + if (!mat || bn_mat_is_identity(mat)) { + tp->tr_l.tl_mat = bn_mat_dup(diskmat); } else { tp->tr_l.tl_mat = (matp_t)bu_malloc( sizeof(mat_t), "v5comb mat"); - bn_mat_mul( tp->tr_l.tl_mat, mat, diskmat ); - if ( bn_mat_is_identity( tp->tr_l.tl_mat ) ) { - bu_free( (char *)tp->tr_l.tl_mat, "tl_mat"); + bn_mat_mul(tp->tr_l.tl_mat, mat, diskmat); + if (bn_mat_is_identity(tp->tr_l.tl_mat)) { + bu_free((char *)tp->tr_l.tl_mat, "tl_mat"); tp->tr_l.tl_mat = (matp_t)NULL; } } @@ -677,7 +678,7 @@ RT_CK_TREE(tp->tr_b.tb_right); tp->tr_b.tb_left = *--sp; RT_CK_TREE(tp->tr_b.tb_left); - switch ( *exprp ) { + switch (*exprp) { case DB5COMB_TOKEN_UNION: tp->tr_b.tb_op = OP_UNION; break; @@ -709,32 +710,32 @@ /* Push this node on the stack */ *sp++ = tp; } - BU_ASSERT_PTR( leafp, ==, leafp_end ); + BU_ASSERT_PTR(leafp, ==, leafp_end); /* There should only be one thing left on the stack, the result */ - BU_ASSERT_PTR( sp, ==, &stack[1] ); + BU_ASSERT_PTR(sp, ==, &stack[1]); comb->tree = stack[0]; RT_CK_TREE(comb->tree); - finish: - if ( ip->idb_avs.magic != BU_AVS_MAGIC ) return 0; /* OK */ +finish: + if (ip->idb_avs.magic != BU_AVS_MAGIC) return 0; /* OK */ /* Unpack the attributes */ comb->rgb_valid = 0; - if ( (ap = bu_avs_get( &ip->idb_avs, "rgb" )) != NULL ) { - int ibuf[3]; - if ( sscanf( ap, "%d/%d/%d", ibuf, ibuf+1, ibuf+2 ) == 3 ) { - VMOVE( comb->rgb, ibuf ); + if ((ap = bu_avs_get(&ip->idb_avs, "rgb")) != NULL) { + int ibuf[3]; + if (sscanf(ap, "%d/%d/%d", ibuf, ibuf+1, ibuf+2) == 3) { + VMOVE(comb->rgb, ibuf); comb->rgb_valid = 1; } else { bu_log("unable to parse 'rgb' attribute '%s'\n", ap); } } - if ( (ap = bu_avs_get( &ip->idb_avs, "inherit" )) != NULL ) { - comb->inherit = atoi( ap ); + if ((ap = bu_avs_get(&ip->idb_avs, "inherit")) != NULL) { + comb->inherit = atoi(ap); } - if ( (ap = bu_avs_get( &ip->idb_avs, "region" )) != NULL ) { + if ((ap = bu_avs_get(&ip->idb_avs, "region")) != NULL) { /* Presence of this attribute implies it is a region */ comb->region_flag = 1; @@ -758,21 +759,21 @@ } /* get the other GIFT "region" attributes */ - if ( (ap = bu_avs_get( &ip->idb_avs, "region_id" )) != NULL ) { - comb->region_id = atoi( ap ); + if ((ap = bu_avs_get(&ip->idb_avs, "region_id")) != NULL) { + comb->region_id = atoi(ap); } - if ( (ap = bu_avs_get( &ip->idb_avs, "aircode" )) != NULL ) { - comb->aircode = atoi( ap ); + if ((ap = bu_avs_get(&ip->idb_avs, "aircode")) != NULL) { + comb->aircode = atoi(ap); } - if ( (ap = bu_avs_get( &ip->idb_avs, "material_id" )) != NULL ) { - comb->GIFTmater = atoi( ap ); + if ((ap = bu_avs_get(&ip->idb_avs, "material_id")) != NULL) { + comb->GIFTmater = atoi(ap); } - if ( (ap = bu_avs_get( &ip->idb_avs, "los" )) != NULL ) { - comb->los = atoi( ap ); + if ((ap = bu_avs_get(&ip->idb_avs, "los")) != NULL) { + comb->los = atoi(ap); } } - if ( (ap = bu_avs_get( &ip->idb_avs, "oshader" )) != NULL ) { - bu_vls_strcat( &comb->shader, ap ); + if ((ap = bu_avs_get(&ip->idb_avs, "oshader")) != NULL) { + bu_vls_strcat(&comb->shader, ap); } return 0; /* OK */ Modified: brlcad/trunk/src/librt/comb/comb_mirror.c =================================================================== --- brlcad/trunk/src/librt/comb/comb_mirror.c 2010-03-02 18:19:42 UTC (rev 37847) +++ brlcad/trunk/src/librt/comb/comb_mirror.c 2010-03-02 18:20:27 UTC (rev 37848) @@ -88,6 +88,7 @@ return 0; } + /* * Local Variables: * tab-width: 8 Modified: brlcad/trunk/src/librt/comb/db_comb.c =================================================================== --- brlcad/trunk/src/librt/comb/db_comb.c 2010-03-02 18:19:42 UTC (rev 37847) +++ brlcad/trunk/src/librt/comb/db_comb.c 2010-03-02 18:20:27 UTC (rev 37848) @@ -770,7 +770,7 @@ case OP_XOR: if (!indented) bu_vls_spaces(vls, 2*lvl); bu_vls_strcat(vls, "^ "); - bin: + bin: db_tree_describe(vls, tp->tr_b.tb_left, 1, lvl+1, mm2local); db_tree_describe(vls, tp->tr_b.tb_right, 0, lvl+1, mm2local); return; @@ -787,7 +787,7 @@ case OP_XNOP: if (!indented) bu_vls_spaces(vls, 2*lvl); bu_vls_strcat(vls, "X "); - unary: + unary: db_tree_describe(vls, tp->tr_b.tb_left, 1, lvl+1, mm2local); return; @@ -920,6 +920,7 @@ return 0; } + /*==================== END g_comb.c / table.c interface ========== */ /** @@ -940,6 +941,7 @@ NAMEMOVE(name, rec->s.s_name); } + /* Some export support routines */ /** @@ -1095,6 +1097,7 @@ return(curtree); } + /** * D B _ M K G I F T _ T R E E */ Modified: brlcad/trunk/src/librt/db_io.c =================================================================== --- brlcad/trunk/src/librt/db_io.c 2010-03-02 18:19:42 UTC (rev 37847) +++ brlcad/trunk/src/librt/db_io.c 2010-03-02 18:20:27 UTC (rev 37848) @@ -46,13 +46,13 @@ * syscall semaphores, stdio-only machines, and in-memory buffering. * * Returns - - * 0 OK - * -1 FAILURE + * 0 OK + * -1 FAILURE */ HIDDEN int db_read(const struct db_i *dbip, genptr_t addr, size_t count, size_t offset) - /* byte count */ - /* byte offset from start of file */ +/* byte count */ +/* byte offset from start of file */ { size_t got; @@ -106,8 +106,8 @@ * This is in external v4 format. * * Returns - - * union record * - OK - * (union record *)0 - FAILURE + * union record * - OK + * (union record *)0 - FAILURE */ union record * db_getmrec(const struct db_i *dbip, const struct directory *dp) @@ -153,8 +153,8 @@ * this entry. * * Returns - - * 0 OK - * -1 FAILURE + * 0 OK + * -1 FAILURE */ int db_get(const struct db_i *dbip, const struct directory *dp, union record *where, int offset, int len) @@ -201,8 +201,8 @@ * buffering. * * Returns - - * 0 OK - * -1 FAILURE + * 0 OK + * -1 FAILURE */ /* should be HIDDEN */ int @@ -254,8 +254,8 @@ * entry. * * Returns - - * 0 OK - * -1 FAILURE + * 0 OK + * -1 FAILURE */ size_t db_put(struct db_i *dbip, const struct directory *dp, union record *where, size_t offset, size_t len) @@ -306,8 +306,8 @@ * bu_free_external(ep); * * Returns - - * -1 error - * 0 success + * -1 error + * 0 success */ int db_get_external(register struct bu_external *ep, const struct directory *dp, const struct db_i *dbip) @@ -360,8 +360,8 @@ * copy them. * * Returns - - * -1 error - * 0 success + * -1 error + * 0 success */ int db_put_external(struct bu_external *ep, struct directory *dp, struct db_i *dbip) @@ -432,8 +432,8 @@ * contain the desired name. The 'ep' parameter cannot be const. * * Returns - - * <0 error - * 0 OK + * <0 error + * 0 OK * * NOTE: Callers of this should be using wdb_export_external() * instead. @@ -466,6 +466,7 @@ bu_free_external(ep); } + /** @} */ /* * Local Variables: This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <br...@us...> - 2010-03-02 21:09:42
|
Revision: 37858 http://brlcad.svn.sourceforge.net/brlcad/?rev=37858&view=rev Author: brlcad Date: 2010-03-02 21:09:35 +0000 (Tue, 02 Mar 2010) Log Message: ----------- oops, revert back to r37654 .. didn't intend to commit the roots change until next minor release. Modified Paths: -------------- brlcad/trunk/src/librt/Makefile.am brlcad/trunk/src/librt/roots.c Modified: brlcad/trunk/src/librt/Makefile.am =================================================================== --- brlcad/trunk/src/librt/Makefile.am 2010-03-02 20:17:33 UTC (rev 37857) +++ brlcad/trunk/src/librt/Makefile.am 2010-03-02 21:09:35 UTC (rev 37858) @@ -21,7 +21,6 @@ ${TCL_CPPFLAGS} \ ${BREP_CPPFLAGS} -# must fix roots.c exact floating point comparison AM_CFLAGS = ${STRICT_FLAGS} noinst_PROGRAMS = \ Modified: brlcad/trunk/src/librt/roots.c =================================================================== --- brlcad/trunk/src/librt/roots.c 2010-03-02 20:17:33 UTC (rev 37857) +++ brlcad/trunk/src/librt/roots.c 2010-03-02 21:09:35 UTC (rev 37858) @@ -44,9 +44,6 @@ /** * R T _ P O L Y _ E V A L _ W _ 2 D E R I V A T I V E S * - * Reverses the order of coefficients to conform to new convention - * Subsequently calls bn_poly_eval_w_2derivatives located in libbn/poly.c - * which in effect performs the following. * Evaluates p(Z), p'(Z), and p''(Z) for any Z (real or complex). * Given an equation of the form: * @@ -70,20 +67,30 @@ /* outputs */ { register int n; - bn_poly_t equation; - equation.dgr = eqn->dgr; - for (n=0; n<=eqn->dgr; n++) { - equation.cf[n] = eqn->cf[eqn->dgr - n]; + register int m; + + bn_cx_cons(b, eqn->cf[0], 0.0); + *c = *b; + *d = *c; + + for (n=1; (m = eqn->dgr - n) >= 0; ++n) { + bn_cx_mul(b, cZ); + b->re += eqn->cf[n]; + if (m > 0) { + bn_cx_mul(c, cZ); + bn_cx_add(c, b); + } + if (m > 1) { + bn_cx_mul(d, cZ); + bn_cx_add(d, c); + } } - bn_poly_eval_w_2derivatives(cZ, &equation, b, c, d); } /** * R T _ P O L Y _ F I N D R O O T * - * Calls bn_poly_findroot located in libbn/poly.c - * which in effect performs the following. * Calculates one root of a polynomial (p(Z)) using Laguerre's * method. This is an iterative technique which has very good global * convergence properties. The formulas for this method are @@ -103,18 +110,86 @@ register bn_complex_t *nxZ, /* initial guess for root */ const char *str) { - register int n; - n = bn_poly_findroot(eqn, nxZ, str); - return n; + bn_complex_t p0, p1, p2; /* evaluated polynomial+derivatives */ + bn_complex_t p1_H; /* p1 - H, temporary */ + bn_complex_t cZ, cH; /* 'Z' and H(Z) in comment */ + bn_complex_t T; /* temporary for making H */ + fastf_t diff=0.0; /* test values for convergence */ + fastf_t b=0.0; /* floating temps */ + int n; + register int i; /* iteration counter */ + + for (i=0; i < 100; i++) { + cZ = *nxZ; + rt_poly_eval_w_2derivatives(&cZ, eqn, &p0, &p1, &p2); + + /* Compute H for Laguerre's method. */ + n = eqn->dgr-1; + bn_cx_mul2(&cH, &p1, &p1); + bn_cx_scal(&cH, (double)(n*n)); + bn_cx_mul2(&T, &p2, &p0); + bn_cx_scal(&T, (double)(eqn->dgr*n)); + bn_cx_sub(&cH, &T); + + /* Calculate the next iteration for Laguerre's method. + * Test to see whether addition or subtraction gives the + * larger denominator for the next 'Z', and use the + * appropriate value in the formula. + */ + bn_cx_sqrt(&cH, &cH); + p1_H = p1; + bn_cx_sub(&p1_H, &cH); + bn_cx_add(&p1, &cH); /* p1 <== p1+H */ + bn_cx_scal(&p0, (double)(eqn->dgr)); + if (bn_cx_amplsq(&p1_H) > bn_cx_amplsq(&p1)) { + bn_cx_div(&p0, &p1_H); + bn_cx_sub(nxZ, &p0); + } else { + bn_cx_div(&p0, &p1); + bn_cx_sub(nxZ, &p0); + } + + /* Use proportional convergence test to allow very small + * roots and avoid wasting time on large roots. + * The original version used bn_cx_ampl(), which requires + * a square root. Using bn_cx_amplsq() saves lots of cycles, + * but changes loop termination conditions somewhat. + * + * diff is |p0|**2. nxZ = Z - p0. + * + * SGI XNS IRIS 3.5 compiler fails if following 2 assignments + * are imbedded in the IF statement, as before. + */ + b = bn_cx_amplsq(nxZ); + diff = bn_cx_amplsq(&p0); + + if (b < diff) + continue; + + if (NEAR_ZERO(diff, SMALL_FASTF)) + return(i); /* OK -- can't do better */ + + /* FIXME: figure out why SMALL_FASTF is too sensitive, why + * anything smaller than 1.0e-5 is too sensitive and causes + * eto off-by-many differences. + */ + if (diff > (b - diff) * 1.0e-5) + continue; + + return(i); /* OK */ + } + + /* If the thing hasn't converged yet, it probably won't. */ + bu_log("rt_poly_findroot: solving for %s didn't converge in %d iterations, b=%g, diff=%g\n", + str, i, b, diff); + bu_log("nxZ=%gR+%gI, p0=%gR+%gI\n", nxZ->re, nxZ->im, p0.re, p0.im); + return(-1); /* ERROR */ } /** * R T _ P O L Y _ C H E C K R O O T S * - * Reverses the order of coefficients to conform to new convention - * Calls bn_poly_ceckroots located in libbn/poly.c - * which in effect performs the following. * Evaluates p(Z) for any Z (real or complex). In this case, test all * "nroots" entries of roots[] to ensure that they are roots (zeros) * of this polynomial. @@ -136,35 +211,82 @@ int rt_poly_checkroots(register bn_poly_t *eqn, bn_complex_t *roots, register int nroots) { - int n; - bn_poly_t equation; - equation.dgr = eqn->dgr; - for (n=0; n<=eqn->dgr/2; n++) { - equation.cf[n] = eqn->cf[eqn->dgr - n]; + register fastf_t er, ei; /* "epoly" */ + register fastf_t zr, zi; /* Z value to evaluate at */ + register int n; + int m; + + for (m=0; m < nroots; ++m) { + /* Select value of Z to evaluate at */ + zr = bn_cx_real(&roots[m]); + zi = bn_cx_imag(&roots[m]); + + /* Initialize */ + er = eqn->cf[0]; + /* ei = 0.0; */ + + /* n=1 step. Broken out because ei = 0.0 */ + ei = er*zi; /* must come before er= */ + er = er*zr + eqn->cf[1]; + + /* Remaining steps */ + for (n=2; n <= eqn->dgr; ++n) { + register fastf_t tr, ti; /* temps */ + tr = er*zr - ei*zi + eqn->cf[n]; + ti = er*zi + ei*zr; + er = tr; + ei = ti; + } + if (fabs(er) > 1.0e-5 || fabs(ei) > 1.0e-5) + return 1; /* FAIL */ } - n = bn_poly_checkroots(&equation, roots, nroots); - return n; + /* Evaluating polynomial for all Z values gives zero */ + return 0; /* OK */ } /** * R T _ P O L Y _ D E F L A T E * - * Calls bn_poly_deflate located in libbn/poly.c * Deflates a polynomial by a given root. */ void rt_poly_deflate(register bn_poly_t *oldP, register bn_complex_t *root) { - bn_poly_deflate(oldP, root); + bn_poly_t divisor = bn_Zero_poly; + bn_poly_t rem = bn_Zero_poly; + + /* Make a polynomial out of the given root: Linear for a real + * root, Quadratic for a complex root (since they come in con- + * jugate pairs). + */ + if (NEAR_ZERO(root->im, SMALL)) { + /* root is real */ + divisor.dgr = 1; + divisor.cf[0] = 1; + divisor.cf[1] = - root->re; + } else { + /* root is complex */ + divisor.dgr = 2; + divisor.cf[0] = 1; + divisor.cf[1] = -2 * root->re; + divisor.cf[2] = bn_cx_amplsq(root); + } + + /* Use synthetic division to find the quotient (new polynomial) + * and the remainder (should be zero if the root was really a + * root). + */ + bn_poly_synthetic_division(oldP, &rem, oldP, &divisor); } /** * R T _ P O L Y _ R O O T S * - * Reverses the order of coefficients to conform to new convention - * Calls bn_poly_roots located in libbn/poly.c + * WARNING: The polynomial given as input is destroyed by this + * routine. The caller must save it if it is important! + * * NOTE : This routine is written for polynomials with real * coefficients ONLY. To use with complex coefficients, the Complex * Math library should be used throughout. Some changes in the @@ -176,12 +298,86 @@ const char *name) /* name of the primitive being checked */ { register int n; /* number of roots found */ - bn_poly_t equation; - equation.dgr = eqn->dgr; - for (n=0; n<=eqn->dgr; n++) { - equation.cf[n] = eqn->cf[eqn->dgr - n]; + fastf_t factor; /* scaling factor for copy */ + + /* Remove leading coefficients which are too close to zero, + * to prevent the polynomial factoring from blowing up, below. + */ + while (NEAR_ZERO(eqn->cf[0], SMALL)) { + for (n=0; n <= eqn->dgr; n++) { + eqn->cf[n] = eqn->cf[n+1]; + } + if (--eqn->dgr <= 0) + return 0; } - n = bn_poly_roots(&equation, roots, name); + + /* Factor the polynomial so the first coefficient is one + * for ease of handling. + */ + factor = 1.0 / eqn->cf[0]; + (void) bn_poly_scale(eqn, factor); + n = 0; /* Number of roots found */ + + /* A trailing coefficient of zero indicates that zero + * is a root of the equation. + */ + while (NEAR_ZERO(eqn->cf[eqn->dgr], SMALL)) { + roots[n].re = roots[n].im = 0.0; + --eqn->dgr; + ++n; + } + + while (eqn->dgr > 2) { + if (eqn->dgr == 4) { + if (bn_poly_quartic_roots(&roots[n], eqn)) { + if (rt_poly_checkroots(eqn, &roots[n], 4) == 0) { + return(n+4); + } + } + } else if (eqn->dgr == 3) { + if (bn_poly_cubic_roots(&roots[n], eqn)) { + if (rt_poly_checkroots(eqn, &roots[n], 3) == 0) { + return (n+3); + } + } + } + + /* + * Set initial guess for root to almost zero. + * This method requires a small nudge off the real axis. + */ + bn_cx_cons(&roots[n], 0.0, SMALL); + if ((rt_poly_findroot(eqn, &roots[n], name)) < 0) + return(n); /* return those we found, anyways */ + + if (fabs(roots[n].im) > 1.0e-5* fabs(roots[n].re)) { + /* If root is complex, its complex conjugate is + * also a root since complex roots come in con- + * jugate pairs when all coefficients are real. + */ + ++n; + roots[n] = roots[n-1]; + bn_cx_conj(&roots[n]); + } else { + /* Change 'practically real' to real */ + roots[n].im = 0.0; + } + + rt_poly_deflate(eqn, &roots[n]); + ++n; + } + + /* For polynomials of lower degree, iterative techniques + * are an inefficient way to find the roots. + */ + if (eqn->dgr == 1) { + roots[n].re = -(eqn->cf[1]); + roots[n].im = 0.0; + ++n; + } else if (eqn->dgr == 2) { + bn_poly_quadratic_roots(&roots[n], eqn); + n += 2; + } return n; } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |