Thread: [brlcad-commits] SF.net SVN: brlcad:[32654] brlcad/trunk/src/librt
Open Source Solid Modeling CAD
Brought to you by:
brlcad
From: <joh...@us...> - 2008-09-17 00:54:49
|
Revision: 32654 http://brlcad.svn.sourceforge.net/brlcad/?rev=32654&view=rev Author: johnranderson Date: 2008-09-17 00:54:59 +0000 (Wed, 17 Sep 2008) Log Message: ----------- Implemented rt_dsp_tess() Modified Paths: -------------- brlcad/trunk/src/librt/primitives/dsp/dsp.c brlcad/trunk/src/librt/table.c Modified: brlcad/trunk/src/librt/primitives/dsp/dsp.c =================================================================== --- brlcad/trunk/src/librt/primitives/dsp/dsp.c 2008-09-16 12:12:57 UTC (rev 32653) +++ brlcad/trunk/src/librt/primitives/dsp/dsp.c 2008-09-17 00:54:59 UTC (rev 32654) @@ -50,7 +50,7 @@ * */ -#include "common.h" +#include "raytrace.h" #include <stddef.h> #include <stdio.h> @@ -60,10 +60,8 @@ #include "bio.h" #include "vmath.h" +#include "rtgeom.h" #include "db.h" -#include "nmg.h" -#include "rtgeom.h" -#include "raytrace.h" #include "plot3.h" @@ -3376,16 +3374,289 @@ int rt_dsp_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_dsp_internal *dsp_ip; + struct rt_dsp_internal *dsp_ip; + struct shell *s; + int xlim; + int ylim; + int x, y; + point_t pt[4]; + point_t tmp_pt; + int base_vert_count; + struct vertex **base_verts; + struct vertex **verts[3]; + struct faceuse *fu; + struct vertex **strip1Verts; + struct vertex **strip2Verts; + int i; + int base_vert_no; if (RT_G_DEBUG & DEBUG_HF) bu_log("rt_dsp_tess()\n"); + /* do a bunch of checks to make sure all is well */ + RT_CK_DB_INTERNAL(ip); dsp_ip = (struct rt_dsp_internal *)ip->idb_ptr; RT_DSP_CK_MAGIC(dsp_ip); - return(-1); + *r = nmg_mrsv( m ); /* Make region, empty shell, vertex */ + s = BU_LIST_FIRST(shell, &(*r)->s_hd); + + switch( dsp_ip->dsp_datasrc ) { + case RT_DSP_SRC_FILE: + case RT_DSP_SRC_V4_FILE: + if (!dsp_ip->dsp_mp) { + bu_log("WARNING: Cannot find data file for displacement map (DSP)\n"); + if (bu_vls_addr(&dsp_ip->dsp_name)) { + bu_log(" DSP data file [%s] not found or empty\n", bu_vls_addr(&dsp_ip->dsp_name)); + } else { + bu_log(" DSP data file not found or not specified\n"); + } + return -1; + } + BU_CK_MAPPED_FILE(dsp_ip->dsp_mp); + break; + case RT_DSP_SRC_OBJ: + if (!dsp_ip->dsp_bip) { + bu_log("WARNING: Cannot find data object for displacement map (DSP)\n"); + if (bu_vls_addr(&dsp_ip->dsp_name)) { + bu_log(" DSP data object [%s] not found or empty\n", bu_vls_addr(&dsp_ip->dsp_name)); + } else { + bu_log(" DSP data object not found or not specified\n"); + } + return -1; + } + RT_CK_DB_INTERNAL(dsp_ip->dsp_bip); + RT_CK_BINUNIF(dsp_ip->dsp_bip->idb_ptr); + break; + } + + + xlim = dsp_ip->dsp_xcnt - 1; + ylim = dsp_ip->dsp_ycnt - 1; + + /* Base_verts will contain the vertices for the base face ordered + * correctly to create the base face. + * Cannot simply use the four corners, because that would not + * create a valid NMG. + * base_verts[0] is at (0,0) + * base_verts[ylim] is at (0,ylim) + * base_verts[ylim+xlim] is at (xlim,ylim) + * base_verts[2*ylim+xlim] is at (xlim,0) + * base_verts[2*ylim+2*xlim-x] is at (x,0) + * + * strip1Verts and strip2Verts are temporary storage for vertices + * along the top of the dsp. For each strip of triangles at a given + * x value, strip1Verts[y] is the vertex at (x,y,h) and strip2Verts[y] + * is the vertex at (x+1,y,h), where h is the DSP value at that point. + * After each strip of faces is created, strip2Verts is copied to strip1Verts + * and strip2Verts is set to all NULLs. + */ + + /* malloc space for the vertices */ + base_vert_count = 2*xlim + 2*ylim; + base_verts = bu_calloc(base_vert_count, sizeof( struct vertex *), "base verts"); + strip1Verts = bu_calloc(ylim+1, sizeof( struct vertex *), "strip1Verts"); + strip2Verts = bu_calloc(ylim+1, sizeof( struct vertex *), "strip2Verts"); + + /* make faces along x=0 plane */ + for(y=1 ; y<=ylim ; y++) { + verts[0] = &base_verts[y-1]; + verts[1] = &strip1Verts[y-1]; + verts[2] = &strip1Verts[y]; + fu = nmg_cmface(s, verts, 3); + if (y == 1) { + VSET(tmp_pt, 0, 0, DSP(dsp_ip, 0, 0)); + MAT4X3PNT(pt[0], dsp_ip->dsp_stom, tmp_pt); + nmg_vertex_gv(strip1Verts[0], pt[0]); + VSET(tmp_pt, 0, 0, 0); + MAT4X3PNT(pt[0], dsp_ip->dsp_stom, tmp_pt); + nmg_vertex_gv(base_verts[0], pt[0]); + } + VSET(tmp_pt, 0, y, DSP(dsp_ip, 0, y)); + MAT4X3PNT(pt[0], dsp_ip->dsp_stom, tmp_pt); + nmg_vertex_gv(strip1Verts[y], pt[0]); + if (nmg_fu_planeeqn(fu, tol) < 0) { + bu_log( "Failed to make x=0 face at y=%d\n", y ); + bu_free(base_verts, "base verts"); + bu_free(strip1Verts, "strip 1 verts"); + bu_free(strip2Verts, "strip 2 verts"); + return -1; /* FAIL */ + } + verts[0] = &base_verts[y-1]; + verts[1] = &strip1Verts[y]; + verts[2] = &base_verts[y]; + fu = nmg_cmface(s, verts, 3); + VSET(tmp_pt, 0, y, 0); + MAT4X3PNT(pt[0], dsp_ip->dsp_stom, tmp_pt); + nmg_vertex_gv(base_verts[y], pt[0]); + if (nmg_fu_planeeqn(fu, tol) < 0) { + bu_log( "Failed to make x=0 face at y=%d\n", y ); + bu_free(base_verts, "base verts"); + bu_free(strip1Verts, "strip 1 verts"); + bu_free(strip2Verts, "strip 2 verts"); + return -1; /* FAIL */ + } + } + + /* make each strip of triangles. Make two triangles for each + * cell (x,y)<->(x+1,y+1). Also make the vertical faces at y=0 and y=ylim. + */ + for(x=0 ; x<xlim ; x++) { + /* make the faces at y=0 for this strip */ + if(x == 0) { + base_vert_no = 0; + } else { + base_vert_no = 2*(ylim + xlim) - x; + } + + verts[0] = &base_verts[base_vert_no]; + verts[1] = &strip2Verts[0]; + verts[2] = &strip1Verts[0]; + fu = nmg_cmface(s, verts, 3); + VSET(tmp_pt, x+1, 0, DSP(dsp_ip, x+1, 0)); + MAT4X3PNT(pt[0], dsp_ip->dsp_stom, tmp_pt); + nmg_vertex_gv(strip2Verts[0], pt[0]); + if (nmg_fu_planeeqn(fu, tol) < 0) { + bu_log( "Failed to make first face at x=%d, y=%d\n", x, 0 ); + bu_free(base_verts, "base verts"); + bu_free(strip1Verts, "strip 1 verts"); + bu_free(strip2Verts, "strip 2 verts"); + return -1; /* FAIL */ + } + + if( base_vert_no == 0 ) { + base_vert_no = 2*(ylim+xlim)-1; + } else { + base_vert_no--; + } + verts[1] = &base_verts[base_vert_no]; + verts[2] = &strip2Verts[0]; + fu = nmg_cmface(s, verts, 3); + VSET(tmp_pt, x+1, 0, 0); + MAT4X3PNT(pt[0], dsp_ip->dsp_stom, tmp_pt); + nmg_vertex_gv(base_verts[base_vert_no], pt[0]); + if (nmg_fu_planeeqn(fu, tol) < 0) { + bu_log( "Failed to make first face at x=%d, y=%d\n", x, 0 ); + bu_free(base_verts, "base verts"); + bu_free(strip1Verts, "strip 1 verts"); + bu_free(strip2Verts, "strip 2 verts"); + return -1; /* FAIL */ + } + + /* make the top faces for this strip */ + for(y=0 ; y<ylim ; y++) { + verts[0] = &strip1Verts[y]; + verts[1] = &strip2Verts[y]; + verts[2] = &strip2Verts[y+1]; + fu = nmg_cmface(s, verts, 3); + VSET(tmp_pt, x+1, y+1, DSP(dsp_ip, x+1, y+1)); + MAT4X3PNT(pt[0], dsp_ip->dsp_stom, tmp_pt); + nmg_vertex_gv(strip2Verts[y+1], pt[0]); + if (nmg_fu_planeeqn(fu, tol) < 0) { + bu_log( "Failed to make first top face at x=%d, y=%d\n", x, y ); + bu_free(base_verts, "base verts"); + bu_free(strip1Verts, "strip 1 verts"); + bu_free(strip2Verts, "strip 2 verts"); + return -1; /* FAIL */ + } + + verts[1] = &strip2Verts[y+1]; + verts[2] = &strip1Verts[y+1]; + fu = nmg_cmface(s, verts, 3); + if (nmg_fu_planeeqn(fu, tol) < 0) { + bu_log( "Failed to make second top face at x=%d, y=%d\n", x, y ); + bu_free(base_verts, "base verts"); + bu_free(strip1Verts, "strip 1 verts"); + bu_free(strip2Verts, "strip 2 verts"); + return -1; /* FAIL */ + } + } + + /* make the faces at the y=ylim plane for this strip */ + verts[0] = &strip1Verts[ylim]; + verts[1] = &strip2Verts[ylim]; + verts[2] = &base_verts[ylim+x+1]; + fu = nmg_cmface(s, verts, 3); + VSET(tmp_pt, x+1, ylim, 0); + MAT4X3PNT(pt[0], dsp_ip->dsp_stom, tmp_pt); + nmg_vertex_gv(base_verts[ylim+x+1], pt[0]); + if (nmg_fu_planeeqn(fu, tol) < 0) { + bu_log( "Failed to make first face at x=%d, y=ylim\n", x ); + bu_free(base_verts, "base verts"); + bu_free(strip1Verts, "strip 1 verts"); + bu_free(strip2Verts, "strip 2 verts"); + return -1; /* FAIL */ + } + + verts[0] = &base_verts[ylim+x+1]; + verts[1] = &base_verts[ylim+x]; + verts[2] = &strip1Verts[ylim]; + fu = nmg_cmface(s, verts, 3); + if (nmg_fu_planeeqn(fu, tol) < 0) { + bu_log( "Failed to make first face at x=%d, y=ylim\n", x ); + bu_free(base_verts, "base verts"); + bu_free(strip1Verts, "strip 1 verts"); + bu_free(strip2Verts, "strip 2 verts"); + return -1; /* FAIL */ + } + + /* copy strip2 to strip1, set strip2 to all NULLs */ + for(y=0 ; y<=ylim ; y++) { + strip1Verts[y] = strip2Verts[y]; + strip2Verts[y] = (struct vertex *)NULL; + } + } + + /* make faces at x=xlim plane */ + for(y=0 ; y<ylim ; y++) { + base_vert_no = 2*ylim+xlim-y; + verts[0] = &base_verts[base_vert_no]; + verts[1] = &base_verts[base_vert_no-1]; + verts[2] = &strip1Verts[y]; + fu = nmg_cmface(s, verts, 3); + if(y != ylim-1) { + VSET(tmp_pt, xlim, y+1, 0); + MAT4X3PNT(pt[0], dsp_ip->dsp_stom, tmp_pt); + nmg_vertex_gv(base_verts[base_vert_no-1], pt[0]); + } + if (nmg_fu_planeeqn(fu, tol) < 0) { + bu_log( "Failed to make first face at x=xlim, y=%d\n", y ); + bu_free(base_verts, "base verts"); + bu_free(strip1Verts, "strip 1 verts"); + bu_free(strip2Verts, "strip 2 verts"); + return -1; /* FAIL */ + } + + verts[0] = &strip1Verts[y]; + verts[1] = &base_verts[base_vert_no-1]; + verts[2] = &strip1Verts[y+1]; + fu = nmg_cmface(s, verts, 3); + if (nmg_fu_planeeqn(fu, tol) < 0) { + bu_log( "Failed to make first face at x=xlim, y=%d\n", y ); + bu_free(base_verts, "base verts"); + bu_free(strip1Verts, "strip 1 verts"); + bu_free(strip2Verts, "strip 2 verts"); + return -1; /* FAIL */ + } + } + + + /* make the base face */ + fu = nmg_cface(s, base_verts, base_vert_count); + if (nmg_fu_planeeqn(fu, tol) < 0) { + bu_log("Failed to make base face\n"); + bu_free(base_verts, "base verts"); + bu_free(strip1Verts, "strip 1 verts"); + bu_free(strip2Verts, "strip 2 verts"); + return -1; /* FAIL */ + } + + bu_free(base_verts, "base verts"); + bu_free(strip1Verts, "strip 1 verts"); + bu_free(strip2Verts, "strip 2 verts"); + + return(0); } Modified: brlcad/trunk/src/librt/table.c =================================================================== --- brlcad/trunk/src/librt/table.c 2008-09-16 12:12:57 UTC (rev 32653) +++ brlcad/trunk/src/librt/table.c 2008-09-17 00:54:59 UTC (rev 32654) @@ -803,7 +803,7 @@ rt_dsp_prep, rt_dsp_shot, rt_dsp_print, rt_dsp_norm, rt_nul_piece_shot, rt_nul_piece_hitsegs, rt_dsp_uv, rt_dsp_curve, rt_dsp_class, rt_dsp_free, - rt_dsp_plot, rt_vstub, rt_nul_tess, rt_nul_tnurb, + rt_dsp_plot, rt_vstub, rt_dsp_tess, rt_nul_tnurb, rt_dsp_import5, rt_dsp_export5, rt_dsp_import, rt_dsp_export, rt_dsp_ifree, rt_dsp_describe, rt_dsp_xform, rt_dsp_parse, This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <br...@us...> - 2008-09-25 02:34:58
|
Revision: 32752 http://brlcad.svn.sourceforge.net/brlcad/?rev=32752&view=rev Author: brlcad Date: 2008-09-25 02:34:46 +0000 (Thu, 25 Sep 2008) Log Message: ----------- use RT_DIR_PHONY_ADDR instead of -1L on d_addr Modified Paths: -------------- brlcad/trunk/src/librt/db5_alloc.c brlcad/trunk/src/librt/db5_io.c brlcad/trunk/src/librt/db_alloc.c brlcad/trunk/src/librt/db_io.c Modified: brlcad/trunk/src/librt/db5_alloc.c =================================================================== --- brlcad/trunk/src/librt/db5_alloc.c 2008-09-25 02:26:41 UTC (rev 32751) +++ brlcad/trunk/src/librt/db5_alloc.c 2008-09-25 02:34:46 UTC (rev 32752) @@ -144,11 +144,11 @@ BU_ASSERT_LONG( ep->ext_nbytes&7, ==, 0 ); - if ( dp->d_addr != -1L && ep->ext_nbytes == dp->d_len ) { + if ( dp->d_addr != RT_DIR_PHONY_ADDR && ep->ext_nbytes == dp->d_len ) { if (RT_G_DEBUG&DEBUG_DB) bu_log("db5_realloc(%s) current allocation is exactly right.\n", dp->d_namep); return 0; } - if ( dp->d_addr == -1L ) BU_ASSERT_LONG( dp->d_len, ==, 0 ); + if ( dp->d_addr == RT_DIR_PHONY_ADDR ) BU_ASSERT_LONG( dp->d_len, ==, 0 ); baseaddr = dp->d_addr; baselen = dp->d_len; @@ -194,12 +194,12 @@ /* The object is getting larger... */ /* Start by zapping existing database object into a free object */ - if ( dp->d_addr != -1L ) { + if ( dp->d_addr != RT_DIR_PHONY_ADDR ) { if (RT_G_DEBUG&DEBUG_DB) bu_log("db5_realloc(%s) releasing storage at x%x, len=%d\n", dp->d_namep, dp->d_addr, dp->d_len); rt_memfree( &(dbip->dbi_freep), dp->d_len, dp->d_addr ); if ( db5_write_free( dbip, dp, dp->d_len ) < 0 ) return -1; - baseaddr = dp->d_addr = -1L; /* sanity */ + baseaddr = dp->d_addr = RT_DIR_PHONY_ADDR; /* sanity */ } /* Modified: brlcad/trunk/src/librt/db5_io.c =================================================================== --- brlcad/trunk/src/librt/db5_io.c 2008-09-25 02:26:41 UTC (rev 32751) +++ brlcad/trunk/src/librt/db5_io.c 2008-09-25 02:34:46 UTC (rev 32752) @@ -1367,7 +1367,7 @@ } /* Second, obtain storage for final object */ - if ( ep->ext_nbytes != dp->d_len || dp->d_addr == -1L ) { + if ( ep->ext_nbytes != dp->d_len || dp->d_addr == RT_DIR_PHONY_ADDR ) { if ( db5_realloc( dbip, dp, ep ) < 0 ) { bu_log("db_put_external(%s) db_realloc5() failed\n", dp->d_namep); return -5; @@ -1426,7 +1426,7 @@ } BU_CK_EXTERNAL( &ext ); - if ( ext.ext_nbytes != dp->d_len || dp->d_addr == -1L ) { + 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; Modified: brlcad/trunk/src/librt/db_alloc.c =================================================================== --- brlcad/trunk/src/librt/db_alloc.c 2008-09-25 02:26:41 UTC (rev 32751) +++ brlcad/trunk/src/librt/db_alloc.c 2008-09-25 02:34:46 UTC (rev 32752) @@ -158,7 +158,7 @@ } dp->d_len = 0; - dp->d_addr = -1; + dp->d_addr = RT_DIR_PHONY_ADDR; return i; } Modified: brlcad/trunk/src/librt/db_io.c =================================================================== --- brlcad/trunk/src/librt/db_io.c 2008-09-25 02:26:41 UTC (rev 32751) +++ brlcad/trunk/src/librt/db_io.c 2008-09-25 02:34:46 UTC (rev 32752) @@ -380,7 +380,7 @@ ngran = (ep->ext_nbytes+sizeof(union record)-1)/sizeof(union record); if ( ngran != dp->d_len ) { - if ( dp->d_addr != -1L ) { + if ( dp->d_addr != RT_DIR_PHONY_ADDR ) { if ( db_delete( dbip, dp ) < 0 ) return -2; } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <br...@us...> - 2008-09-25 02:56:51
|
Revision: 32753 http://brlcad.svn.sourceforge.net/brlcad/?rev=32753&view=rev Author: brlcad Date: 2008-09-25 02:56:48 +0000 (Thu, 25 Sep 2008) Log Message: ----------- fix the problem that daniel ran into with the db_dump snippet he sent to the brlcad-users list. his program opened an inmem and dumped it to disk, but was crashing during the dump. there were several problems I found (after 10 freaking hours of debugging and testing...), one being a bug in wdb_export_external() that was 8 years old. the routine erroneously allowed a disk dp to be marked as an inmem dp. that caused a crash since the (union sharing) datastores for the two are rather different. the second more innocuous problem was db_sync() not checking that there is no fp to flush/sync or call fileno on (which is called during db_close(). his program now works as expected. Modified Paths: -------------- brlcad/trunk/src/librt/db_open.c brlcad/trunk/src/librt/wdb.c Modified: brlcad/trunk/src/librt/db_open.c =================================================================== --- brlcad/trunk/src/librt/db_open.c 2008-09-25 02:34:46 UTC (rev 32752) +++ brlcad/trunk/src/librt/db_open.c 2008-09-25 02:56:48 UTC (rev 32753) @@ -436,6 +436,10 @@ bu_semaphore_acquire(BU_SEM_SYSCALL); + /* make sure we have something to do */ + if (!dbip->dbi_fp) + return; + /* flush the file */ (void)fflush(dbip->dbi_fp); Modified: brlcad/trunk/src/librt/wdb.c =================================================================== --- brlcad/trunk/src/librt/wdb.c 2008-09-25 02:34:46 UTC (rev 32752) +++ brlcad/trunk/src/librt/wdb.c 2008-09-25 02:56:48 UTC (rev 32753) @@ -196,7 +196,11 @@ return -3; } } - dp->d_flags = (dp->d_flags & ~7) | flags; + /* keep the caller's flags, except we don't want to + * pretend a disk dp is an inmem dp. the data is + * read/written differently for both. + */ + dp->d_flags = (dp->d_flags & ~7) | (flags & ~(RT_DIR_INMEM)); if ( db_put_external( ep, dp, wdbp->dbip ) < 0 ) { bu_log("wdb_export_external(%s): db_put_external error\n", name ); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <br...@us...> - 2009-03-30 15:43:21
|
Revision: 34106 http://brlcad.svn.sourceforge.net/brlcad/?rev=34106&view=rev Author: brlcad Date: 2009-03-30 15:43:14 +0000 (Mon, 30 Mar 2009) Log Message: ----------- apparently don't need to include nmg.h, not using nmg routines/structures. Modified Paths: -------------- brlcad/trunk/src/librt/bezier_2d_isect.c brlcad/trunk/src/librt/comb.c brlcad/trunk/src/librt/cut.c brlcad/trunk/src/librt/db5_bin.c brlcad/trunk/src/librt/db5_types.c Modified: brlcad/trunk/src/librt/bezier_2d_isect.c =================================================================== --- brlcad/trunk/src/librt/bezier_2d_isect.c 2009-03-30 15:33:43 UTC (rev 34105) +++ brlcad/trunk/src/librt/bezier_2d_isect.c 2009-03-30 15:43:14 UTC (rev 34106) @@ -38,7 +38,6 @@ #include "bio.h" #include "vmath.h" -#include "nmg.h" #include "raytrace.h" #include "nurb.h" Modified: brlcad/trunk/src/librt/comb.c =================================================================== --- brlcad/trunk/src/librt/comb.c 2009-03-30 15:33:43 UTC (rev 34105) +++ brlcad/trunk/src/librt/comb.c 2009-03-30 15:43:14 UTC (rev 34106) @@ -36,7 +36,6 @@ #include "bu.h" #include "vmath.h" #include "bn.h" -#include "nmg.h" #include "rtgeom.h" #include "raytrace.h" Modified: brlcad/trunk/src/librt/cut.c =================================================================== --- brlcad/trunk/src/librt/cut.c 2009-03-30 15:33:43 UTC (rev 34105) +++ brlcad/trunk/src/librt/cut.c 2009-03-30 15:43:14 UTC (rev 34106) @@ -45,7 +45,6 @@ #include "vmath.h" #include "raytrace.h" -#include "nmg.h" #include "plot3.h" Modified: brlcad/trunk/src/librt/db5_bin.c =================================================================== --- brlcad/trunk/src/librt/db5_bin.c 2009-03-30 15:33:43 UTC (rev 34105) +++ brlcad/trunk/src/librt/db5_bin.c 2009-03-30 15:43:14 UTC (rev 34106) @@ -38,7 +38,6 @@ #include "bu.h" #include "vmath.h" #include "db5.h" -#include "nmg.h" #include "rtgeom.h" #include "raytrace.h" #include "nurb.h" Modified: brlcad/trunk/src/librt/db5_types.c =================================================================== --- brlcad/trunk/src/librt/db5_types.c 2009-03-30 15:33:43 UTC (rev 34105) +++ brlcad/trunk/src/librt/db5_types.c 2009-03-30 15:43:14 UTC (rev 34106) @@ -23,9 +23,6 @@ * * Map between Major_Types/Minor_Types and ASCII strings * - * Author - - * Paul J. Tanenbaum - * */ #include "common.h" @@ -38,7 +35,6 @@ #include "bu.h" #include "vmath.h" #include "db5.h" -#include "nmg.h" #include "raytrace.h" struct db5_type { This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <br...@us...> - 2009-04-13 15:13:44
|
Revision: 34201 http://brlcad.svn.sourceforge.net/brlcad/?rev=34201&view=rev Author: brlcad Date: 2009-04-13 15:13:40 +0000 (Mon, 13 Apr 2009) Log Message: ----------- move table.c into the primitives directory as first step towards refactoring the API in order to hide the table itself. let primitives contain logic that is solid-specific Modified Paths: -------------- brlcad/trunk/src/librt/Makefile.am Added Paths: ----------- brlcad/trunk/src/librt/primitives/table.c Removed Paths: ------------- brlcad/trunk/src/librt/table.c Modified: brlcad/trunk/src/librt/Makefile.am =================================================================== --- brlcad/trunk/src/librt/Makefile.am 2009-04-13 15:07:43 UTC (rev 34200) +++ brlcad/trunk/src/librt/Makefile.am 2009-04-13 15:13:40 UTC (rev 34201) @@ -149,15 +149,15 @@ primitives/sph/sph.c \ primitives/submodel/submodel.c \ primitives/superell/superell.c \ + primitives/table.c \ + primitives/tgc/tgc.c \ primitives/tor/tor.c \ - primitives/tgc/tgc.c \ primitives/vol/vol.c \ regionfix.c \ roots.c \ shoot.c \ spectrum.c \ storage.c \ - table.c \ tcl.c \ timer42.c \ transform.c \ Copied: brlcad/trunk/src/librt/primitives/table.c (from rev 34199, brlcad/trunk/src/librt/table.c) =================================================================== --- brlcad/trunk/src/librt/primitives/table.c (rev 0) +++ brlcad/trunk/src/librt/primitives/table.c 2009-04-13 15:13:40 UTC (rev 34201) @@ -0,0 +1,1408 @@ +/* T A B L E . C + * BRL-CAD + * + * Copyright (c) 1989-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 g_ */ +/** @{ */ +/** @file table.c + * + * Tables for the BRL-CAD Package ray-tracing library "librt". + * + */ +/** @} */ + +#include "common.h" + +#include <stdio.h> +#include <string.h> +#include <math.h> +#include "bio.h" + +#include "tcl.h" + +#include "bu.h" +#include "vmath.h" +#include "db.h" +#include "nmg.h" +#include "raytrace.h" +#include "rtgeom.h" + + +const struct bu_structparse rt_nul_parse[] = { + {""} +}; + +# define RT_DECLARE_INTERFACE(name) \ + BU_EXTERN(int rt_##name##_prep, (struct soltab *stp, \ + struct rt_db_internal *ip, struct rt_i *rtip )); \ + BU_EXTERN(int rt_##name##_shot, (struct soltab *stp, \ + register struct xray *rp, \ + struct application *ap, struct seg *seghead )); \ + BU_EXTERN(int rt_##name##_piece_shot, (\ + struct rt_piecestate *psp, \ + struct rt_piecelist *plp, \ + double dist_corr, \ + struct xray *rp, \ + struct application *ap, \ + struct seg *seghead )); \ + BU_EXTERN(void rt_##name##_piece_hitsegs, (\ + struct rt_piecestate *psp, \ + struct seg *seghead, \ + struct application *ap)); \ + BU_EXTERN(void rt_##name##_print, (const struct soltab *stp)); \ + BU_EXTERN(void rt_##name##_norm, (struct hit *hitp, \ + struct soltab *stp, struct xray *rp)); \ + BU_EXTERN(void rt_##name##_uv, (struct application *ap, \ + struct soltab *stp, struct hit *hitp, \ + struct uvcoord *uvp)); \ + BU_EXTERN(void rt_##name##_curve, (struct curvature *cvp, \ + struct hit *hitp, struct soltab *stp)); \ + BU_EXTERN(int rt_##name##_class, ()); \ + BU_EXTERN(void rt_##name##_free, (struct soltab *stp)); \ + BU_EXTERN(int rt_##name##_plot, (struct bu_list *vhead, \ + struct rt_db_internal *ip, \ + const struct rt_tess_tol *ttol, \ + const struct bn_tol *tol)); \ + BU_EXTERN(void rt_##name##_vshot, (struct soltab *stp[], \ + struct xray *rp[], \ + struct seg segp[], int n, struct application *ap )); \ + BU_EXTERN(int rt_##name##_tess, (struct nmgregion **r, \ + struct model *m, struct rt_db_internal *ip, \ + const struct rt_tess_tol *ttol, \ + const struct bn_tol *tol)); \ + BU_EXTERN(int rt_##name##_tnurb, (struct nmgregion **r, \ + struct model *m, struct rt_db_internal *ip, \ + const struct bn_tol *tol)); \ + BU_EXTERN(int rt_##name##_import5, (struct rt_db_internal *ip, \ + const struct bu_external *ep, const mat_t mat, \ + const struct db_i *dbip, struct resource *resp, const int minor_type )); \ + BU_EXTERN(int rt_##name##_export5, (struct bu_external *ep, \ + const struct rt_db_internal *ip, \ + double local2mm, const struct db_i *dbip, \ + struct resource *resp, \ + const int minor_type)); \ + BU_EXTERN(int rt_##name##_import, (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##_export, (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, \ + struct resource *resp)); \ + 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(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)); \ + BU_EXTERN(int rt_##name##_params, (struct pc_pc_set *ps, \ + const struct rt_db_internal *ip)); \ + extern const struct bu_structparse rt_##name##_parse[]; + + +RT_DECLARE_INTERFACE(nul); + +#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_binexpm_xform rt_generic_xform +RT_DECLARE_INTERFACE(binexpm); +*/ + +#define rt_pnts_xform rt_generic_xform +RT_DECLARE_INTERFACE(pnts); + +#if OBJ_BREP +#define rt_brep_xform rt_generic_xform +RT_DECLARE_INTERFACE(brep); +#endif + + +/* from 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, + const int minor_type)); + +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, + const int minor_type)); + +/* from db5_bin.c */ +BU_EXTERN(int rt_binexpm_import5, (struct rt_db_internal * ip, + const struct bu_external *ep, + const mat_t mat, + const struct db_i *dbip, + struct resource *resp, + const int minor_type)); +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, + const int minor_type)); +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, + const int minor_type)); + +BU_EXTERN(int rt_binexpm_export5, (struct bu_external *ep, + const struct rt_db_internal *ip, + double local2mm, + const struct db_i *dbip, + struct resource *resp, + const int minor_type)); + +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, + const int minor_type)); + +BU_EXTERN(void rt_binunif_ifree, (struct rt_db_internal *ip, + struct resource *resp)); +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, + double diameter ) ); +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, + struct resource *resp ) ); + +/* from tcl.c */ +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, + struct resource *resp)); +BU_EXTERN(int rt_comb_form, (struct bu_vls *log, const struct rt_functab *ftp)); +BU_EXTERN(void rt_comb_make, (const struct rt_functab *ftp, + struct rt_db_internal *intern, double diameter)); + +/* 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, + struct resource *)); +BU_EXTERN(int rt_parsetab_form, (struct bu_vls *log, const struct rt_functab *ftp)); +BU_EXTERN(void rt_generic_make, (const struct rt_functab *ftp, + struct rt_db_internal *intern, double diameter)); + +/* EBM solid */ +BU_EXTERN(int rt_ebm_get, (struct bu_vls *log, + const struct rt_db_internal *intern, const char *attr)); +BU_EXTERN(int rt_ebm_adjust, (struct bu_vls *log, + struct rt_db_internal *intern, int argc, char **argv, + struct resource *resp)); +BU_EXTERN(int rt_ebm_form, (struct bu_vls *log, const struct rt_functab *ftp)); +BU_EXTERN(void rt_ebm_make, (const struct rt_functab *, struct rt_db_internal *, + double /*diameter*/)); + +/* ARBN solid */ +BU_EXTERN(int rt_arbn_get, (struct bu_vls *log, + const struct rt_db_internal *intern, const char *attr)); +BU_EXTERN(int rt_arbn_adjust, (struct bu_vls *log, + struct rt_db_internal *intern, int argc, char **argv, + struct resource *resp)); + +/* ARS solid */ +BU_EXTERN(int rt_ars_get, (struct bu_vls *log, + const struct rt_db_internal *intern, const char *attr)); +BU_EXTERN(int rt_ars_adjust, (struct bu_vls *log, + struct rt_db_internal *intern, int argc, char **argv, + struct resource *resp)); + +/* DSP solid */ +extern int rt_dsp_get(struct bu_vls *log, + const struct rt_db_internal *intern, + const char *attr); + +extern int rt_dsp_adjust(struct bu_vls *log, + struct rt_db_internal *intern, + int argc, + char **argv, + struct resource *resp); +BU_EXTERN(void rt_dsp_make, (const struct rt_functab *, struct rt_db_internal *, + double /*diameter*/)); + +/* PIPE solid */ +BU_EXTERN(int rt_pipe_get, (struct bu_vls *log, + const struct rt_db_internal *intern, const char *attr)); +BU_EXTERN(int rt_pipe_adjust, (struct bu_vls *log, + struct rt_db_internal *intern, int argc, char **argv, + struct resource *resp)); + +/* BSPLINE solid */ +BU_EXTERN(int rt_nurb_get, (struct bu_vls *log, + const struct rt_db_internal *intern, const char *attr)); +BU_EXTERN(int rt_nurb_adjust, (struct bu_vls *log, + struct rt_db_internal *intern, int argc, char **argv, + struct resource *resp)); + +/* NMG solid */ +BU_EXTERN(int rt_nmg_get, (struct bu_vls *log, + const struct rt_db_internal *intern, const char *attr)); +BU_EXTERN(int rt_nmg_adjust, (struct bu_vls *log, + struct rt_db_internal *intern, int argc, char **argv, + struct resource *resp)); +BU_EXTERN(void rt_nmg_make, (const struct rt_functab *, struct rt_db_internal *, + double /*diameter*/)); + +/* BOT solid */ +BU_EXTERN(int rt_bot_get, (struct bu_vls *log, + const struct rt_db_internal *intern, const char *attr)); +BU_EXTERN(int rt_bot_adjust, (struct bu_vls *log, + struct rt_db_internal *intern, int argc, char **argv, + struct resource *resp)); +BU_EXTERN(int rt_bot_form, (struct bu_vls *log, const struct rt_functab *ftp)); + +/* SKETCH */ +BU_EXTERN(int rt_sketch_get, (struct bu_vls *log, + const struct rt_db_internal *intern, const char *attr)); +BU_EXTERN(int rt_sketch_adjust, (struct bu_vls *log, + struct rt_db_internal *intern, int argc, char **argv, + struct resource *resp)); +BU_EXTERN(int rt_sketch_form, (struct bu_vls *log, const struct rt_functab *ftp)); + +/* CLINE */ +BU_EXTERN(int rt_cline_get, (struct bu_vls *log, + const struct rt_db_internal *intern, const char *attr)); +BU_EXTERN(int rt_cline_adjust, (struct bu_vls *log, + struct rt_db_internal *intern, int argc, char **argv, + struct resource *resp)); +BU_EXTERN(int rt_cline_form, (struct bu_vls *log, const struct rt_functab *ftp)); + +/* EXTRUSION */ +BU_EXTERN(int rt_extrude_get, (struct bu_vls *log, + const struct rt_db_internal *intern, const char *attr)); +BU_EXTERN(int rt_extrude_adjust, (struct bu_vls *log, + struct rt_db_internal *intern, int argc, char **argv, + struct resource *resp)); +BU_EXTERN(int rt_extrude_form, (struct bu_vls *log, const struct rt_functab *ftp)); + +/* PNTS */ + +/* XXX from shoot.c / vshoot.c */ +BU_EXTERN(void rt_vstub, (struct soltab *stp[], struct xray *rp[], + struct seg segp[], int n, struct application *ap )); + +/* 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 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"); + return BRLCAD_ERROR; +} +int rt_nul_adjust(struct bu_vls *log, struct rt_db_internal *intern, int argc, char **argv, struct resource *resp) { + RT_CK_RESOURCE(resp); + bu_vls_printf(log, "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"); + return BRLCAD_ERROR; +} +void rt_nul_make(const struct rt_functab *ftp, struct rt_db_internal *intern, double diameter) { + bu_bomb("rt_nul_make invoked\n"); +} + +const struct rt_functab rt_functab[] = { + {RT_FUNCTAB_MAGIC, "ID_NULL", "NULL", + 0, /* 0: unused, for sanity checking. */ + rt_nul_prep, rt_nul_shot, rt_nul_print, rt_nul_norm, + rt_nul_piece_shot, rt_nul_piece_hitsegs, + rt_nul_uv, rt_nul_curve, rt_nul_class, rt_nul_free, + rt_nul_plot, rt_nul_vshot, rt_nul_tess, rt_nul_tnurb, + rt_nul_import5, rt_nul_export5, + rt_nul_import, rt_nul_export, rt_nul_ifree, + rt_nul_describe, rt_nul_xform, rt_nul_parse, + 0, 0, + rt_nul_get, rt_nul_adjust, rt_nul_form, + rt_nul_make, rt_nul_params, + }, + + {RT_FUNCTAB_MAGIC, "ID_TOR", "tor", + 1, /* 1 */ + rt_tor_prep, rt_tor_shot, rt_tor_print, rt_tor_norm, + rt_nul_piece_shot, rt_nul_piece_hitsegs, + rt_tor_uv, rt_tor_curve, rt_tor_class, rt_tor_free, + rt_tor_plot, rt_tor_vshot, rt_tor_tess, rt_nul_tnurb, + rt_tor_import5, rt_tor_export5, + rt_tor_import, rt_tor_export, rt_tor_ifree, + rt_tor_describe, rt_tor_xform, rt_tor_parse, + sizeof(struct rt_tor_internal), RT_TOR_INTERNAL_MAGIC, + rt_parsetab_get, rt_parsetab_adjust, rt_parsetab_form, + NULL, rt_tor_params, + }, + + {RT_FUNCTAB_MAGIC, "ID_TGC", "tgc", + 1, /* 2 */ + rt_tgc_prep, rt_tgc_shot, rt_tgc_print, rt_tgc_norm, + rt_nul_piece_shot, rt_nul_piece_hitsegs, + rt_tgc_uv, rt_tgc_curve, rt_tgc_class, rt_tgc_free, + rt_tgc_plot, rt_tgc_vshot, rt_tgc_tess, rt_tgc_tnurb, + rt_tgc_import5, rt_tgc_export5, + rt_tgc_import, rt_tgc_export, rt_tgc_ifree, + rt_tgc_describe, rt_tgc_xform, rt_tgc_parse, + sizeof(struct rt_tgc_internal), RT_TGC_INTERNAL_MAGIC, + rt_parsetab_get, rt_parsetab_adjust, rt_parsetab_form, + NULL, rt_tgc_params, + }, + + {RT_FUNCTAB_MAGIC, "ID_ELL", "ell", + 1, /* 3 */ + rt_ell_prep, rt_ell_shot, rt_ell_print, rt_ell_norm, + rt_nul_piece_shot, rt_nul_piece_hitsegs, + rt_ell_uv, rt_ell_curve, rt_ell_class, rt_ell_free, + rt_ell_plot, rt_ell_vshot, rt_ell_tess, rt_ell_tnurb, + rt_ell_import5, rt_ell_export5, + rt_ell_import, rt_ell_export, rt_ell_ifree, + rt_ell_describe, rt_ell_xform, rt_ell_parse, + sizeof(struct rt_ell_internal), RT_ELL_INTERNAL_MAGIC, + rt_parsetab_get, rt_parsetab_adjust, rt_parsetab_form, + NULL, rt_ell_params + }, + + {RT_FUNCTAB_MAGIC, "ID_ARB8", "arb8", + 0, /* 4 */ + rt_arb_prep, rt_arb_shot, rt_arb_print, rt_arb_norm, + rt_nul_piece_shot, rt_nul_piece_hitsegs, + rt_arb_uv, rt_arb_curve, rt_arb_class, rt_arb_free, + rt_arb_plot, rt_arb_vshot, rt_arb_tess, rt_arb_tnurb, + rt_arb_import5, rt_arb_export5, + rt_arb_import, rt_arb_export, rt_arb_ifree, + rt_arb_describe, rt_arb_xform, rt_arb_parse, + sizeof(struct rt_arb_internal), RT_ARB_INTERNAL_MAGIC, + rt_parsetab_get, rt_parsetab_adjust, rt_parsetab_form, + NULL, rt_arb_params, + }, + + {RT_FUNCTAB_MAGIC, "ID_ARS", "ars", + 1, /* 5 */ + rt_ars_prep, rt_bot_shot, rt_ars_print, rt_bot_norm, + rt_bot_piece_shot, rt_bot_piece_hitsegs, + rt_ars_uv, rt_bot_curve, rt_bot_class, rt_bot_free, + rt_ars_plot, rt_vstub, rt_ars_tess, rt_nul_tnurb, + rt_ars_import5, rt_ars_export5, + rt_ars_import, rt_ars_export, rt_ars_ifree, + rt_ars_describe, rt_ars_xform, NULL, + sizeof(struct rt_ars_internal), RT_ARS_INTERNAL_MAGIC, + rt_ars_get, rt_ars_adjust, rt_parsetab_form, + NULL, rt_ars_params, + }, + + {RT_FUNCTAB_MAGIC, "ID_HALF", "half", + 0, /* 6 */ + rt_hlf_prep, rt_hlf_shot, rt_hlf_print, rt_hlf_norm, + rt_nul_piece_shot, rt_nul_piece_hitsegs, + rt_hlf_uv, rt_hlf_curve, rt_hlf_class, rt_hlf_free, + rt_hlf_plot, rt_hlf_vshot, rt_hlf_tess, rt_nul_tnurb, + rt_hlf_import5, rt_hlf_export5, + rt_hlf_import, rt_hlf_export, rt_hlf_ifree, + rt_hlf_describe, rt_generic_xform, rt_hlf_parse, + sizeof(struct rt_half_internal), RT_HALF_INTERNAL_MAGIC, + rt_parsetab_get, rt_parsetab_adjust, rt_parsetab_form, + NULL, rt_hlf_params, + }, + + {RT_FUNCTAB_MAGIC, "ID_REC", "rec", + 1, /* 7 */ + rt_rec_prep, rt_rec_shot, rt_rec_print, rt_rec_norm, + rt_nul_piece_shot, rt_nul_piece_hitsegs, + rt_rec_uv, rt_rec_curve, rt_rec_class, rt_rec_free, + rt_tgc_plot, rt_rec_vshot, rt_tgc_tess, rt_nul_tnurb, + rt_tgc_import5, rt_tgc_export5, + rt_tgc_import, rt_tgc_export, rt_tgc_ifree, + rt_tgc_describe, rt_rec_xform, rt_tgc_parse, + sizeof(struct rt_tgc_internal), RT_TGC_INTERNAL_MAGIC, + rt_parsetab_get, rt_parsetab_adjust, rt_parsetab_form, + NULL, rt_rec_params, + }, + + {RT_FUNCTAB_MAGIC, "ID_POLY", "poly", + 1, /* 8 */ + rt_pg_prep, rt_pg_shot, rt_pg_print, rt_pg_norm, + rt_nul_piece_shot, rt_nul_piece_hitsegs, + rt_pg_uv, rt_pg_curve, rt_pg_class, rt_pg_free, + rt_pg_plot, rt_vstub, rt_pg_tess, rt_nul_tnurb, + rt_nul_import5, rt_nul_export5, + rt_pg_import, rt_pg_export, rt_pg_ifree, + rt_pg_describe, rt_pg_xform, NULL, + sizeof(struct rt_pg_internal), RT_PG_INTERNAL_MAGIC, + rt_parsetab_get, rt_parsetab_adjust, rt_parsetab_form, + NULL, rt_pg_params, + }, + + {RT_FUNCTAB_MAGIC, "ID_BSPLINE", "bspline", + 1, /* 9 */ + rt_nurb_prep, rt_nurb_shot, rt_nurb_print, rt_nurb_norm, + rt_nul_piece_shot, rt_nul_piece_hitsegs, + rt_nurb_uv, rt_nurb_curve, rt_nurb_class, rt_nurb_free, + rt_nurb_plot, rt_vstub, rt_nurb_tess, rt_nul_tnurb, + rt_nurb_import5, rt_nurb_export5, + rt_nurb_import, rt_nurb_export, rt_nurb_ifree, + rt_nurb_describe, rt_nurb_xform, NULL, + sizeof(struct rt_nurb_internal), RT_NURB_INTERNAL_MAGIC, + rt_nurb_get, rt_nurb_adjust, rt_parsetab_form, + NULL, rt_nurb_params, + }, + + {RT_FUNCTAB_MAGIC, "ID_SPH", "sph", + 0, /* 10 */ + rt_sph_prep, rt_sph_shot, rt_sph_print, rt_sph_norm, + rt_nul_piece_shot, rt_nul_piece_hitsegs, + rt_sph_uv, rt_sph_curve, rt_sph_class, rt_sph_free, + rt_ell_plot, rt_sph_vshot, rt_ell_tess, rt_ell_tnurb, + rt_ell_import5, rt_ell_export5, + rt_ell_import, rt_ell_export, rt_ell_ifree, + rt_ell_describe, rt_sph_xform, rt_ell_parse, + sizeof(struct rt_ell_internal), RT_ELL_INTERNAL_MAGIC, + rt_parsetab_get, rt_parsetab_adjust, rt_parsetab_form, + NULL, rt_sph_params + }, + + {RT_FUNCTAB_MAGIC, "ID_NMG", "nmg", + 1, /* 11 */ + rt_nmg_prep, rt_nmg_shot, rt_nmg_print, rt_nmg_norm, + rt_nul_piece_shot, rt_nul_piece_hitsegs, + rt_nmg_uv, rt_nmg_curve, rt_nmg_class, rt_nmg_free, + rt_nmg_plot, rt_nmg_vshot, rt_nmg_tess, rt_nul_tnurb, + rt_nmg_import5, rt_nmg_export5, + rt_nmg_import, rt_nmg_export, rt_nmg_ifree, + rt_nmg_describe, rt_nmg_xform, NULL, + sizeof(struct model), NMG_MODEL_MAGIC, + rt_nmg_get, rt_nmg_adjust, rt_parsetab_form, + rt_nmg_make, rt_nmg_params, + }, + + {RT_FUNCTAB_MAGIC, "ID_EBM", "ebm", + 1, /* 12 */ + rt_ebm_prep, rt_ebm_shot, rt_ebm_print, rt_ebm_norm, + rt_nul_piece_shot, rt_nul_piece_hitsegs, + rt_ebm_uv, rt_ebm_curve, rt_ebm_class, rt_ebm_free, + rt_ebm_plot, rt_vstub, rt_ebm_tess, rt_nul_tnurb, + rt_ebm_import5, rt_ebm_export5, + rt_ebm_import, rt_ebm_export, rt_ebm_ifree, + rt_ebm_describe, rt_ebm_xform, rt_ebm_parse, + sizeof(struct rt_ebm_internal), RT_EBM_INTERNAL_MAGIC, + rt_ebm_get, rt_ebm_adjust, rt_ebm_form, + rt_ebm_make, rt_ebm_params, + }, + + {RT_FUNCTAB_MAGIC, "ID_VOL", "vol", + 1, /* 13 */ + rt_vol_prep, rt_vol_shot, rt_vol_print, rt_vol_norm, + rt_nul_piece_shot, rt_nul_piece_hitsegs, + rt_vol_uv, rt_vol_curve, rt_vol_class, rt_vol_free, + rt_vol_plot, rt_vstub, rt_vol_tess, rt_nul_tnurb, + rt_vol_import5, rt_vol_export5, + rt_vol_import, rt_vol_export, rt_vol_ifree, + rt_vol_describe, rt_vol_xform, rt_vol_parse, + sizeof(struct rt_vol_internal), RT_VOL_INTERNAL_MAGIC, + rt_parsetab_get, rt_parsetab_adjust, rt_parsetab_form, + NULL, rt_vol_params, + }, + + {RT_FUNCTAB_MAGIC, "ID_ARBN", "arbn", + 0, /* 14 */ + rt_arbn_prep, rt_arbn_shot, rt_arbn_print, rt_arbn_norm, + rt_nul_piece_shot, rt_nul_piece_hitsegs, + rt_arbn_uv, rt_arbn_curve, rt_arbn_class, rt_arbn_free, + rt_arbn_plot, rt_arbn_vshot, rt_arbn_tess, rt_nul_tnurb, + rt_arbn_import5, rt_arbn_export5, + rt_arbn_import, rt_arbn_export, rt_arbn_ifree, + rt_arbn_describe, rt_arbn_xform, NULL, + sizeof(struct rt_arbn_internal), RT_ARBN_INTERNAL_MAGIC, + rt_arbn_get, rt_arbn_adjust, rt_parsetab_form, + NULL, rt_arbn_params, + }, + + {RT_FUNCTAB_MAGIC, "ID_PIPE", "pipe", + 1, /* 15 */ + rt_pipe_prep, rt_pipe_shot, rt_pipe_print, rt_pipe_norm, + rt_nul_piece_shot, rt_nul_piece_hitsegs, + rt_pipe_uv, rt_pipe_curve, rt_pipe_class, rt_pipe_free, + rt_pipe_plot, rt_pipe_vshot, rt_pipe_tess, rt_nul_tnurb, + rt_pipe_import5, rt_pipe_export5, + rt_pipe_import, rt_pipe_export, rt_pipe_ifree, + rt_pipe_describe, rt_pipe_xform, NULL, + sizeof(struct rt_pipe_internal), RT_PIPE_INTERNAL_MAGIC, + rt_pipe_get, + rt_pipe_adjust, + rt_parsetab_form, + NULL, rt_pipe_params, + }, + + {RT_FUNCTAB_MAGIC, "ID_PARTICLE", "part", + 0, /* 16 */ + rt_part_prep, rt_part_shot, rt_part_print, rt_part_norm, + rt_nul_piece_shot, rt_nul_piece_hitsegs, + rt_part_uv, rt_part_curve, rt_part_class, rt_part_free, + rt_part_plot, rt_part_vshot, rt_part_tess, rt_nul_tnurb, + rt_part_import5, rt_part_export5, + rt_part_import, rt_part_export, rt_part_ifree, + rt_part_describe, rt_part_xform, rt_part_parse, + sizeof(struct rt_part_internal), RT_PART_INTERNAL_MAGIC, + rt_parsetab_get, rt_parsetab_adjust, rt_parsetab_form, + NULL, rt_part_params, + }, + + {RT_FUNCTAB_MAGIC, "ID_RPC", "rpc", + 0, /* 17 */ + rt_rpc_prep, rt_rpc_shot, rt_rpc_print, rt_rpc_norm, + rt_nul_piece_shot, rt_nul_piece_hitsegs, + rt_rpc_uv, rt_rpc_curve, rt_rpc_class, rt_rpc_free, + rt_rpc_plot, rt_rpc_vshot, rt_rpc_tess, rt_nul_tnurb, + rt_rpc_import5, rt_rpc_export5, + rt_rpc_import, rt_rpc_export, rt_rpc_ifree, + rt_rpc_describe, rt_rpc_xform, rt_rpc_parse, + sizeof(struct rt_rpc_internal), RT_RPC_INTERNAL_MAGIC, + rt_parsetab_get, rt_parsetab_adjust, rt_parsetab_form, + NULL, rt_rpc_params, + }, + + {RT_FUNCTAB_MAGIC, "ID_RHC", "rhc", + 0, /* 18 */ + rt_rhc_prep, rt_rhc_shot, rt_rhc_print, rt_rhc_norm, + rt_nul_piece_shot, rt_nul_piece_hitsegs, + rt_rhc_uv, rt_rhc_curve, rt_rhc_class, rt_rhc_free, + rt_rhc_plot, rt_rhc_vshot, rt_rhc_tess, rt_nul_tnurb, + rt_rhc_import5, rt_rhc_export5, + rt_rhc_import, rt_rhc_export, rt_rhc_ifree, + rt_rhc_describe, rt_rhc_xform, rt_rhc_parse, + sizeof(struct rt_rhc_internal), RT_RHC_INTERNAL_MAGIC, + rt_parsetab_get, rt_parsetab_adjust, rt_parsetab_form, + NULL, rt_rhc_params, + }, + + {RT_FUNCTAB_MAGIC, "ID_EPA", "epa", + 0, /* 19 */ + rt_epa_prep, rt_epa_shot, rt_epa_print, rt_epa_norm, + rt_nul_piece_shot, rt_nul_piece_hitsegs, + rt_epa_uv, rt_epa_curve, rt_epa_class, rt_epa_free, + rt_epa_plot, rt_epa_vshot, rt_epa_tess, rt_nul_tnurb, + rt_epa_import5, rt_epa_export5, + rt_epa_import, rt_epa_export, rt_epa_ifree, + rt_epa_describe, rt_epa_xform, rt_epa_parse, + sizeof(struct rt_epa_internal), RT_EPA_INTERNAL_MAGIC, + rt_parsetab_get, rt_parsetab_adjust, rt_parsetab_form, + NULL, rt_epa_params, + }, + + {RT_FUNCTAB_MAGIC, "ID_EHY", "ehy", + 0, /* 20 */ + rt_ehy_prep, rt_ehy_shot, rt_ehy_print, rt_ehy_norm, + rt_nul_piece_shot, rt_nul_piece_hitsegs, + rt_ehy_uv, rt_ehy_curve, rt_ehy_class, rt_ehy_free, + rt_ehy_plot, rt_ehy_vshot, rt_ehy_tess, rt_nul_tnurb, + rt_ehy_import5, rt_ehy_export5, + rt_ehy_import, rt_ehy_export, rt_ehy_ifree, + rt_ehy_describe, rt_ehy_xform, rt_ehy_parse, + sizeof(struct rt_ehy_internal), RT_EHY_INTERNAL_MAGIC, + rt_parsetab_get, rt_parsetab_adjust, rt_parsetab_form, + NULL, rt_ehy_params, + }, + + {RT_FUNCTAB_MAGIC, "ID_ETO", "eto", + 1, /* 21 */ + rt_eto_prep, rt_eto_shot, rt_eto_print, rt_eto_norm, + rt_nul_piece_shot, rt_nul_piece_hitsegs, + rt_eto_uv, rt_eto_curve, rt_eto_class, rt_eto_free, + rt_eto_plot, rt_eto_vshot, rt_eto_tess, rt_nul_tnurb, + rt_eto_import5, rt_eto_export5, + rt_eto_import, rt_eto_export, rt_eto_ifree, + rt_eto_describe, rt_eto_xform, rt_eto_parse, + sizeof(struct rt_eto_internal), RT_ETO_INTERNAL_MAGIC, + rt_parsetab_get, rt_parsetab_adjust, rt_parsetab_form, + NULL, rt_eto_params, + }, + + {RT_FUNCTAB_MAGIC, "ID_GRIP", "grip", + 1, /* 22 */ + rt_grp_prep, rt_grp_shot, rt_grp_print, rt_grp_norm, + rt_nul_piece_shot, rt_nul_piece_hitsegs, + rt_grp_uv, rt_grp_curve, rt_grp_class, rt_grp_free, + rt_grp_plot, rt_grp_vshot, rt_grp_tess, rt_nul_tnurb, + rt_grp_import5, rt_grp_export5, + rt_grp_import, rt_grp_export, rt_grp_ifree, + rt_grp_describe, rt_grp_xform, rt_grp_parse, + sizeof(struct rt_grip_internal), RT_GRIP_INTERNAL_MAGIC, + rt_parsetab_get, rt_parsetab_adjust, rt_parsetab_form, + NULL, rt_grp_params, + }, + + {RT_FUNCTAB_MAGIC, "ID_JOINT", "joint", + 0, /* 23 -- XXX unimplemented */ + rt_nul_prep, rt_nul_shot, rt_nul_print, rt_nul_norm, + rt_nul_piece_shot, rt_nul_piece_hitsegs, + rt_nul_uv, rt_nul_curve, rt_nul_class, rt_nul_free, + rt_nul_plot, rt_nul_vshot, rt_nul_tess, rt_nul_tnurb, + rt_nul_import5, rt_nul_export5, + rt_nul_import, rt_nul_export, rt_nul_ifree, + rt_nul_describe, rt_nul_xform, NULL, + 0, 0, + rt_nul_get, rt_nul_adjust, rt_nul_form, + rt_nul_make, rt_nul_params, + }, + + {RT_FUNCTAB_MAGIC, "ID_HF", "hf", + 0, /* 24 */ + rt_hf_prep, rt_hf_shot, rt_hf_print, rt_hf_norm, + rt_nul_piece_shot, rt_nul_piece_hitsegs, + rt_hf_uv, rt_hf_curve, rt_hf_class, rt_hf_free, + rt_hf_plot, rt_vstub, rt_hf_tess, rt_nul_tnurb, + rt_hf_import5, rt_hf_export5, + rt_hf_import, rt_hf_export, rt_hf_ifree, + rt_hf_describe, rt_hf_xform, rt_hf_parse, + sizeof(struct rt_hf_internal), RT_HF_INTERNAL_MAGIC, + rt_parsetab_get, rt_parsetab_adjust, rt_parsetab_form, + NULL, rt_hf_params, + }, + + {RT_FUNCTAB_MAGIC, "ID_DSP", "dsp", + 1, /* 25 Displacement Map (alt. height field) */ + rt_dsp_prep, rt_dsp_shot, rt_dsp_print, rt_dsp_norm, + rt_nul_piece_shot, rt_nul_piece_hitsegs, + rt_dsp_uv, rt_dsp_curve, rt_dsp_class, rt_dsp_free, + rt_dsp_plot, rt_vstub, rt_dsp_tess, rt_nul_tnurb, + rt_dsp_import5, rt_dsp_export5, + rt_dsp_import, rt_dsp_export, rt_dsp_ifree, + rt_dsp_describe, rt_dsp_xform, rt_dsp_parse, + sizeof(struct rt_dsp_internal), RT_DSP_INTERNAL_MAGIC, + rt_dsp_get, rt_dsp_adjust, rt_nul_form, + rt_dsp_make, rt_dsp_params, + }, + + {RT_FUNCTAB_MAGIC, "ID_SKETCH", "sketch", + 0, /* 26 2D sketch */ + rt_sketch_prep, rt_sketch_shot, rt_sketch_print, rt_sketch_norm, + rt_nul_piece_shot, rt_nul_piece_hitsegs, + rt_sketch_uv, rt_sketch_curve, rt_sketch_class, rt_sketch_free, + rt_sketch_plot, rt_vstub, rt_nul_tess, rt_nul_tnurb, + rt_sketch_import5, rt_sketch_export5, + rt_sketch_import, rt_sketch_export, rt_sketch_ifree, + rt_sketch_describe, rt_sketch_xform, NULL, + sizeof(struct rt_sketch_internal), RT_SKETCH_INTERNAL_MAGIC, + rt_sketch_get, rt_sketch_adjust, rt_sketch_form, + NULL, rt_sketch_params, + }, + + {RT_FUNCTAB_MAGIC, "ID_EXTRUDE", "extrude", + 1, /* 27 Solid of extrusion */ + rt_extrude_prep, rt_extrude_shot, rt_extrude_print, rt_extrude_norm, + rt_nul_piece_shot, rt_nul_piece_hitsegs, + rt_extrude_uv, rt_extrude_curve, rt_extrude_class, rt_extrude_free, + rt_extrude_plot, rt_extrude_vshot, rt_extrude_tess, rt_nul_tnurb, + rt_extrude_import5, rt_extrude_export5, + rt_extrude_import, rt_extrude_export, rt_extrude_ifree, + rt_extrude_describe, rt_extrude_xform, NULL, + sizeof(struct rt_extrude_internal), RT_EXTRUDE_INTERNAL_MAGIC, + rt_extrude_get, rt_extrude_adjust, rt_extrude_form, + NULL, rt_extrude_params, + }, + + {RT_FUNCTAB_MAGIC, "ID_SUBMODEL", "submodel", + 1, /* 28 Instanced submodel */ + rt_submodel_prep, rt_submodel_shot, rt_submodel_print, rt_submodel_norm, + rt_nul_piece_shot, rt_nul_piece_hitsegs, + rt_submodel_uv, rt_submodel_curve, rt_submodel_class, rt_submodel_free, + rt_submodel_plot, rt_vstub, rt_submodel_tess, rt_nul_tnurb, + rt_submodel_import5, rt_submodel_export5, + rt_submodel_import, rt_submodel_export, rt_submodel_ifree, + rt_submodel_describe, rt_submodel_xform, rt_submodel_parse, + sizeof(struct rt_submodel_internal), RT_SUBMODEL_INTERNAL_MAGIC, + rt_parsetab_get, rt_parsetab_adjust, rt_parsetab_form, + NULL, rt_submodel_params, + }, + + {RT_FUNCTAB_MAGIC, "ID_CLINE", "cline", + 0, /* 29 Fastgen cline solid */ + rt_cline_prep, rt_cline_shot, rt_cline_print, rt_cline_norm, + rt_nul_piece_shot, rt_nul_piece_hitsegs, + rt_cline_uv, rt_cline_curve, rt_cline_class, rt_cline_free, + rt_cline_plot, rt_cline_vshot, rt_cline_tess, rt_cline_tnurb, + rt_cline_import5, rt_cline_export5, + rt_cline_import, rt_cline_export, rt_cline_ifree, + rt_cline_describe, rt_cline_xform, rt_cline_parse, + sizeof(struct rt_cline_internal), RT_CLINE_INTERNAL_MAGIC, + rt_cline_get, rt_cline_adjust, rt_cline_form, + NULL, rt_cline_params, + }, + + {RT_FUNCTAB_MAGIC, "ID_BOT", "bot", + 0, /* 30 Bag o' Triangles */ + rt_bot_prep, rt_bot_shot, rt_bot_print, rt_bot_norm, + rt_bot_piece_shot, rt_bot_piece_hitsegs, + rt_bot_uv, rt_bot_curve, rt_bot_class, rt_bot_free, + rt_bot_plot, rt_bot_vshot, rt_bot_tess, rt_bot_tnurb, + rt_bot_import5, rt_bot_export5, + rt_bot_import, rt_bot_export, rt_bot_ifree, + rt_bot_describe, rt_bot_xform, NULL, + sizeof(struct rt_bot_internal), RT_BOT_INTERNAL_MAGIC, + rt_bot_get, rt_bot_adjust, rt_bot_form, + NULL, rt_bot_params, + }, + + /* ID_MAX_SOLID. Add new solids _above_ this point */ + + {RT_FUNCTAB_MAGIC, "ID_COMBINATION", "comb", + 0, + rt_nul_prep, rt_nul_shot, rt_nul_print, rt_nul_norm, + rt_nul_piece_shot, rt_nul_piece_hitsegs, + rt_nul_uv, rt_nul_curve, rt_nul_class, rt_nul_free, + rt_nul_plot, rt_nul_vshot, rt_nul_tess, rt_nul_tnurb, + rt_comb_import5, rt_comb_export5, + rt_comb_import4, rt_comb_export4, rt_comb_ifree, + rt_comb_describe, rt_generic_xform, NULL, + 0, 0, + rt_comb_get, rt_comb_adjust, rt_comb_form, + rt_comb_make, NULL + }, + + {RT_FUNCTAB_MAGIC, "ID_BINEXPM", "binexpm", + 0, + rt_nul_prep, rt_nul_shot, rt_nul_print, rt_nul_norm, + rt_nul_piece_shot, rt_nul_piece_hitsegs, + rt_nul_uv, rt_nul_curve, rt_nul_class, rt_nul_free, + rt_nul_plot, rt_nul_vshot, rt_nul_tess, rt_nul_tnurb, + rt_binexpm_import5, + rt_nul_export5, + rt_nul_import, rt_nul_export, rt_nul_ifree, + rt_nul_describe, rt_generic_xform, NULL, + 0, 0, + rt_nul_get, rt_nul_adjust, rt_nul_form, + rt_nul_make, NULL + }, + + {RT_FUNCTAB_MAGIC, "ID_BINUNIF", "binunif", + 0, + rt_nul_prep, rt_nul_shot, rt_nul_print, rt_nul_norm, + rt_nul_piece_shot, rt_nul_piece_hitsegs, + rt_nul_uv, rt_nul_curve, rt_nul_class, rt_nul_free, + rt_nul_plot, rt_nul_vshot, rt_nul_tess, rt_nul_tnurb, + rt_binunif_import5, + rt_binunif_export5, + rt_nul_import, rt_nul_export, rt_binunif_ifree, + rt_binunif_describe, rt_generic_xform, NULL, + 0, 0, + rt_binunif_get, rt_binunif_adjust, rt_nul_form, + rt_binunif_make, NULL + }, + + {RT_FUNCTAB_MAGIC, "ID_BINMIME", "binmime", + 0, + rt_nul_prep, rt_nul_shot, rt_nul_print, rt_nul_norm, + rt_nul_piece_shot, rt_nul_piece_hitsegs, + rt_nul_uv, rt_nul_curve, rt_nul_class, rt_nul_free, + rt_nul_plot, rt_nul_vshot, rt_nul_tess, rt_nul_tnurb, + rt_binmime_import5, rt_nul_export5, + rt_nul_import, rt_nul_export, rt_nul_ifree, + rt_nul_describe, rt_generic_xform, NULL, + 0, 0, + rt_nul_get, rt_nul_adjust, rt_nul_form, + rt_nul_make, NULL + }, + + {RT_FUNCTAB_MAGIC, "ID_SUPERELL", "superell", + 1, /* 35 but "should" be 31 Superquadratic Ellipsoid */ + rt_superell_prep, rt_superell_shot, rt_superell_print, rt_superell_norm, + rt_nul_piece_shot, rt_nul_piece_hitsegs, + rt_superell_uv, rt_superell_curve, rt_superell_class, rt_superell_free, + rt_superell_plot, rt_superell_vshot, rt_superell_tess, rt_superell_tnurb, + rt_superell_import5, rt_superell_export5, + rt_superell_import, rt_superell_export, rt_superell_ifree, + rt_superell_describe, rt_superell_xform, rt_superell_parse, + sizeof(struct rt_superell_internal), RT_SUPERELL_INTERNAL_MAGIC, + rt_parsetab_get, rt_parsetab_adjust, rt_parsetab_form, + NULL, rt_superell_params, + }, + + {RT_FUNCTAB_MAGIC, "ID_METABALL", "metaball", + 1, /* 36 but "should" be 32 Metaball */ + rt_metaball_prep, rt_metaball_shot, rt_metaball_print, rt_metaball_norm, + rt_nul_piece_shot, rt_nul_piece_hitsegs, + rt_metaball_uv, rt_metaball_curve, rt_metaball_class, rt_metaball_free, + rt_metaball_plot, rt_nul_vshot, rt_metaball_tess, rt_metaball_tnurb, + rt_metaball_import5, rt_metaball_export5, + rt_nul_import, rt_nul_export, rt_metaball_ifree, + rt_metaball_describe, rt_metaball_xform, rt_nul_parse, + sizeof(struct rt_metaball_internal), RT_METABALL_INTERNAL_MAGIC, + rt_parsetab_get, rt_parsetab_adjust, rt_parsetab_form, + NULL, rt_metaball_params, + }, + +#if OBJ_BREP + {RT_FUNCTAB_MAGIC, "ID_BREP", "brep", + 1, /* 37 */ + rt_brep_prep, rt_brep_shot, rt_brep_print, rt_brep_norm, + rt_nul_piece_shot, rt_nul_piece_hitsegs, + rt_brep_uv, rt_brep_curve, rt_brep_class, rt_brep_free, + rt_brep_plot, rt_nul_vshot, rt_brep_tess, rt_nul_tnurb, + rt_brep_import5, rt_brep_export5, + rt_nul_import, rt_nul_export, rt_brep_ifree, + rt_brep_describe, rt_brep_xform, rt_nul_parse, + sizeof(struct rt_brep_internal), RT_BREP_INTERNAL_MAGIC, + rt_parsetab_get, rt_parsetab_adjust, rt_parsetab_form, + NULL, rt_brep_params, + }, +#else + {RT_FUNCTAB_MAGIC, "ID_BREP_PLCHLDR", "brep", + 0, /* this entry for sanity only */ + rt_nul_prep, rt_nul_shot, rt_nul_print, rt_nul_norm, + rt_nul_piece_shot, rt_nul_piece_hitsegs, + rt_nul_uv, rt_nul_curve, rt_nul_class, rt_nul_free, + rt_nul_plot, rt_nul_vshot, rt_nul_tess, rt_nul_tnurb, + rt_nul_import5, rt_nul_export5, + rt_nul_import, rt_nul_export, rt_nul_ifree, + rt_nul_describe, rt_nul_xform, NULL, + 0, 0, + rt_nul_get, rt_nul_adjust, rt_nul_form, + rt_nul_make, NULL, + }, +#endif + + {RT_FUNCTAB_MAGIC, "ID_HYP", "hyp", + 1, /* 38 but "should" be 34 Hyperboloid */ + rt_hyp_prep, rt_hyp_shot, rt_hyp_print, rt_hyp_norm, + rt_nul_piece_shot, rt_nul_piece_hitsegs, + rt_hyp_uv, rt_hyp_curve, rt_hyp_class, rt_hyp_free, + rt_hyp_plot, rt_nul_vshot, rt_hyp_tess, rt_nul_tnurb, + rt_hyp_import5, rt_hyp_export5, + rt_nul_import, rt_nul_export, rt_hyp_ifree, + rt_hyp_describe, rt_generic_xform, rt_hyp_parse, + sizeof(struct rt_hyp_internal), RT_HYP_INTERNAL_MAGIC, + rt_parsetab_get, rt_parsetab_adjust, rt_parsetab_form, + NULL, rt_hyp_params, + }, + + {RT_FUNCTAB_MAGIC, "ID_CONSTRAINT", "constrnt", + 0, + rt_nul_prep, rt_nul_shot, rt_nul_print, rt_nul_norm, + rt_nul_piece_shot, rt_nul_piece_hitsegs, + rt_nul_uv, rt_nul_curve, rt_nul_class, rt_nul_free, + rt_nul_plot, rt_nul_vshot, rt_nul_tess, rt_nul_tnurb, + rt_constraint_import5, rt_constraint_export5, + rt_nul_import, rt_nul_export, rt_constraint_ifree, + rt_nul_describe, rt_nul_xform, rt_nul_parse, + 0, 0, + rt_nul_get, rt_nul_adjust, rt_nul_form, + NULL, NULL + }, + + {RT_FUNCTAB_MAGIC, "ID_REVOLVE", "revolve", + 1, + rt_revolve_prep, rt_revolve_shot, rt_revolve_print, rt_revolve_norm, + rt_nul_piece_shot, rt_nul_piece_hitsegs, + rt_revolve_uv, rt_revolve_curve, rt_revolve_class, rt_revolve_free, + rt_revolve_plot, rt_nul_vshot, rt_revolve_tess, rt_nul_tnurb, + rt_revolve_import5, rt_revolve_export5, + rt_nul_import, rt_nul_export, rt_revolve_ifree, + rt_revolve_describe, rt_nul_xform, rt_revolve_parse, + sizeof(struct rt_revolve_internal), RT_REVOLVE_INTERNAL_MAGIC, + rt_parsetab_get, rt_parsetab_adjust, rt_parsetab_form, + NULL, rt_nul_params + }, + + {RT_FUNCTAB_MAGIC, "ID_PNTS", "pnts", + 0, + NULL, NULL, rt_pnts_print, NULL, + NULL, NULL, + NULL, NULL, NULL, NULL, + rt_pnts_plot, NULL, NULL, NULL, + rt_pnts_import5, rt_pnts_export5, + NULL, NULL, rt_pnts_ifree, + NULL, rt_pnts_xform, NULL, + sizeof(struct rt_pnts_internal), RT_PNTS_INTERNAL_MAGIC, + NULL, NULL, NULL, + NULL, NULL + }, + + {0L, ">ID_MAXIMUM", ">id_max", + 0, /* this entry for sanity only */ + rt_nul_prep, rt_nul_shot, rt_nul_print, rt_nul_norm, + rt_nul_piece_shot, rt_nul_piece_hitsegs, + rt_nul_uv, rt_nul_curve, rt_nul_class, rt_nul_free, + rt_nul_plot, rt_nul_vshot, rt_nul_tess, rt_nul_tnurb, + rt_nul_import5, rt_nul_export5, + rt_nul_import, rt_nul_export, rt_nul_ifree, + rt_nul_describe, rt_nul_xform, NULL, + 0, 0, + rt_nul_get, rt_nul_adjust, rt_nul_form, + rt_nul_make, NULL + } +}; + + +/* + * Hooks for unimplemented routines + */ +#define DEF(func, args) func BU_ARGS(args) { \ + bu_log(#func " unimplemented\n"); return; } +#define IDEF(func, args) func BU_ARGS(args) { \ + bu_log(#func " unimplemented\n"); return(0); } +#define NDEF(func, args) func BU_ARGS(args) { \ + bu_log(#func " unimplemented\n"); return(-1); } + +int IDEF(rt_nul_prep, (struct soltab *stp, + struct rt_db_internal *ip, + struct rt_i *rtip)); +int IDEF(rt_nul_shot, (struct soltab *stp, + struct xray *rp, + struct application *ap, + struct seg *seghead)); +int IDEF(rt_nul_piece_shot, (struct rt_piecestate *psp, + struct rt_piecelist *plp, + double dist_corr, + struct xray *rp, + struct application *ap, + struct seg *seghead)); +void DEF(rt_nul_piece_hitsegs, (struct rt_piecestate *psp, + struct seg *seghead, + struct application *ap)); +void DEF(rt_nul_print, (const struct soltab *stp)); +void DEF(rt_nul_norm, (struct hit *hitp, + struct soltab *stp, + struct xray *rp)); +void DEF(rt_nul_uv, (struct application *ap, + struct soltab *stp, + struct hit *hitp, + struct uvcoord *uvp)); +void DEF(rt_nul_curve, (struct curvature *cvp, + struct hit *hitp, + struct soltab *stp)); +int IDEF(rt_nul_class, ()); +void DEF(rt_nul_free, (struct soltab *stp)); +int NDEF(rt_nul_plot, (struct bu_list *vhead, + struct rt_db_internal *ip, + const struct rt_tess_tol *ttol, + const struct bn_tol *tol)); +void DEF(rt_nul_vshot, (struct soltab *stp[], + struct xray *rp[], + struct seg segp[], int n, + struct application *ap)); +int NDEF(rt_nul_tess, (struct nmgregion **r, + struct model *m, + struct rt_db_internal *ip, + const struct rt_tess_tol *ttol, + const struct bn_tol *tol)); +int NDEF(rt_nul_tnurb, (struct nmgregion **r, + struct model *m, + struct rt_db_internal *ip, + const struct bn_tol *tol)); +int NDEF(rt_nul_import5, (struct rt_db_internal *ip, + const struct bu_external *ep, + const mat_t mat, const struct db_i *dbip, + struct resource *resp, + const int minot_type)); +int NDEF(rt_nul_export5, (struct bu_external *ep, + const struct rt_db_internal *ip, + double local2mm, const struct db_i *dbip, + struct resource *resp, + const int minor_type )); +int NDEF(rt_nul_import, (struct rt_db_internal *ip, + const struct bu_external *ep, + const mat_t mat, const struct db_i *dbip, + struct resource *resp )); +int NDEF(rt_nul_export, (struct bu_external *ep, + const struct rt_db_internal *ip, + double local2mm, const struct db_i *dbip, + struct resource *resp )); +void DEF(rt_nul_ifree, (struct rt_db_internal *ip, struct resource *resp)); +int NDEF(rt_nul_describe, (struct bu_vls *str, + const struct rt_db_internal *ip, + int verbose, double mm2local, struct resource *resp, + struct db_i *db_i)); +int NDEF(rt_nul_xform, (struct rt_db_internal *op, + const mat_t mat, struct rt_db_internal *ip, + int free, struct db_i *dbip, struct resource *resp)); +int NDEF(rt_nul_params, (struct pc_pc_set * ps, const struct rt_db_internal *op)); + +/* Map for database solidrec objects to internal objects */ +static char idmap[] = { + ID_NULL, /* undefined, 0 */ + ID_NULL, /* RPP 1 axis-aligned rectangular parallelopiped */ + ID_NULL, /* BOX 2 arbitrary rectangular parallelopiped */ + ID_NULL, /* RAW 3 right-angle wedge */ + ID_NULL, /* ARB4 4 tetrahedron */ + ID_NULL, /* ARB5 5 pyramid */ + ID_NULL, /* ARB6 6 extruded triangle */ + ID_NULL, /* ARB7 7 weird 7-vertex shape */ + ID_NULL, /* ARB8 8 hexahedron */ + ID_NULL, /* ELL 9 ellipsoid */ + ID_NULL, /* ELL1 10 another ellipsoid ? */ + ID_NULL, /* SPH 11 sphere */ + ID_NULL, /* RCC 12 right circular cylinder */ + ID_NULL, /* REC 13 right elliptic cylinder */ + ID_NULL, /* TRC 14 truncated regular cone */ + ID_NULL, /* TEC 15 truncated elliptic cone */ + ID_TOR, /* TOR 16 toroid */ + ID_NULL, /* TGC 17 truncated general cone */ + ID_TGC, /* GENTGC 18 supergeneralized TGC; internal form */ + ID_ELL, /* GENELL 19: V, A, B, C */ + ID_ARB8, /* GENARB8 20: V, and 7 other vectors */ + ID_NULL, /* HACK: ARS 21: arbitrary triangular-surfaced polyhedron */ + ID_NULL, /* HACK: ARSCONT 22: extension record type for ARS solid */ + ID_NULL, /* ELLG 23: gift-only */ + ID_HALF, /* HALFSPACE 24: halfspace */ + ID_NULL, /* HACK: SPLINE 25 */ + ID_RPC, /* HACK: RPC 26: right parabolic cylinder */ + ID_RHC, /* HACK: RHC 27: right hyperbolic cylinder */ + ID_EPA, /* HACK: EPA 28: elliptical paraboloid */ + ID_EHY, /* HACK: EHY 29: elliptical hyperboloid */ + ID_ETO, /* HACK: ETO 29: elliptical torus */ + ID_GRIP, /* HACK: GRP 30: grip pseudo solid */ + ID_NULL /* n+1 */ +}; + +/** + * R T _ I D _ S O L I D + * + * Given a database record, determine the proper rt_functab subscript. + * Used by MGED as well as internally to librt. + * + * Returns ID_xxx if successful, or ID_NULL upon failure. + */ +int +rt_id_solid(struct bu_external *ep) +{ + register union record *rec; + register int id; + + BU_CK_EXTERNAL( ep ); + rec = (union record *)ep->ext_buf; + + switch ( rec->u_id ) { + case ID_SOLID: + id = idmap[(int)(rec->s.s_type)]; + break; + case ID_ARS_A: + id = ID_ARS; + break; + case ID_P_HEAD: + id = ID_POLY; + break; + case ID_BSOLID: + id = ID_BSPLINE; + break; + case DBID_STRSOL: + /* XXX This really needs to be some kind of table */ + if ( strcmp( rec->ss.ss_keyword, "ebm" ) == 0 ) { + id = ID_EBM; + break; + } else if ( strcmp( rec->ss.ss_keyword, "vol" ) == 0 ) { + id = ID_VOL; + break; + } else if ( strcmp( rec->ss.ss_keyword, "hf" ) == 0 ) { + id = ID_HF; + break; + } else if ( strcmp( rec->ss.ss_keyword, "dsp" ) == 0 ) { + id = ID_DSP; + break; + } else if ( strcmp( rec->ss.ss_keyword, "submodel" ) == 0 ) { + id = ID_SUBMODEL; + break; + } + bu_log("rt_id_solid(%s): String solid type '%s' unknown\n", + rec->ss.ss_name, rec->ss.ss_keyword ); + id = ID_NULL; /* BAD */ + break; + case DBID_ARBN: + id = ID_ARBN; + break; + case DBID_PIPE: + id = ID_PIPE; + break; + case DBID_PARTICLE: + id = ID_PARTICLE; + break; + case DBID_NMG: + id = ID_NMG; + break; + case DBID_SKETCH: + id = ID_SKETCH; + break; + case DBID_EXTR: + id = ID_EXTRUDE; + break; + case DBID_CLINE: + id = ID_CLINE; + break; + case DBID_BOT: + id = ID_BOT; + break; + default: + bu_log("rt_id_solid: u_id=x%x unknown\n", rec->u_id); + id = ID_NULL; /* BAD */ + break; + } + if ( id < ID_NULL || id > ID_MAX_SOLID ) { + bu_log("rt_id_solid: internal error, id=%d?\n", id); + id = ID_NULL; /* very BAD */ + } + return(id); +} + +/** + * R T _ G E T _ F U N C T A B _ B Y _ L A B E L + * + * Given the Tcl 'label' for a given solid type, find the appropriate + * entry in rt_functab[]. + */ +const struct rt_functab * +rt_get_functab_by_label(const char *label) +{ + register const struct rt_functab *ftp; + + for ( ftp = rt_functab; ftp->magic != 0; ftp++ ) { + if ( strncmp( label, ftp->ft_label, 8 ) == 0 ) + return ftp; + } + return NULL; +} + +/** + * 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 free, + 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_export( &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 ( (free || op == ip) ) rt_db_free_internal(ip, resp); + + RT_INIT_DB_INTERNAL(op); + if ( rt_functab[id].ft_import( 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 ) < 0 ) { + bu_log("rt_generic_xform(): %s export failure\n", + rt_functab[id].ft_name); + return -1; /* FAIL */ + } + + if ( (free || 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, resp); + } + + RT_INIT_DB_INTERNAL(op); + + if ( !free && 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 ) < 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 + * tab-width: 8 + * indent-tabs-mode: t + * c-file-style: "stroustrup" + * End: + * ex: shiftwidth=4 tabstop=8 + */ Deleted: brlcad/trunk/src/librt/table.c =================================================================== --- brlcad/trunk/src/librt/table.c 2009-04-13 15:07:43 UTC (rev 34200) +++ brlcad/trunk/src/librt/table.c 2009-04-13 15:13:40 UTC (rev 34201) @@ -1,1408 +0,0 @@ -/* T A B L E . C - * BRL-CAD - * - * Copyright (c) 1989-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 g_ */ -/** @{ */ -/** @file table.c - * - * Tables for the BRL-CAD Package ray-tracing library "librt". - * - */ -/** @} */ - -#include "common.h" - -#include <stdio.h> -#include <string.h> -#include <math.h> -#include "bio.h" - -#include "tcl.h" - -#include "bu.h" -#include "vmath.h" -#include "db.h" -#include "nmg.h" -#include "raytrace.h" -#include "rtgeom.h" - - -const struct bu_structparse rt_nul_parse[] = { - {""} -}; - -# define RT_DECLARE_INTERFACE(name) \ - BU_EXTERN(int rt_##name##_prep, (struct soltab *stp, \ - struct rt_db_internal *ip, struct rt_i *rtip )); \ - BU_EXTERN(int rt_##name##_shot, (struct soltab *stp, \ - register struct xray *rp, \ - struct application *ap, struct seg *seghead )); \ - BU_EXTERN(int rt_##name##_piece_shot, (\ - struct rt_piecestate *psp, \ - struct rt_piecelist *plp, \ - double dist_corr, \ - struct xray *rp, \ - struct application *ap, \ - struct seg *seghead )); \ - BU_EXTERN(void rt_##name##_piece_hitsegs, (\ - struct rt_piecestate *psp, \ - struct seg *seghead, \ - struct application *ap)); \ - BU_EXTERN(void rt_##name##_print, (const struct soltab *stp)); \ - BU_EXTERN(void rt_##name##_norm, (struct hit *hitp, \ - struct soltab *stp, struct xray *rp)); \ - BU_EXTERN(void rt_##name##_uv, (struct application *ap, \ - struct soltab *stp, struct hit *hitp, \ - struct uvcoord *uvp)); \ - BU_EXTERN(void rt_##name##_curve, (struct curvature *cvp, \ - struct hit *hitp, struct soltab *stp)); \ - BU_EXTERN(int rt_##name##_class, ()); \ - BU_EXTERN(void rt_##name##_free, (struct soltab *stp)); \ - BU_EXTERN(int rt_##name##_plot, (struct bu_list *vhead, \ - struct rt_db_internal *ip, \ - const struct rt_tess_tol *ttol, \ - const struct bn_tol *tol)); \ - BU_EXTERN(void rt_##name##_vshot, (struct soltab *stp[], \ - struct xray *rp[], \ - struct seg segp[], int n, struct application *ap )); \ - BU_EXTERN(int rt_##name##_tess, (struct nmgregion **r, \ - struct model *m, struct rt_db_internal *ip, \ - const struct rt_tess_tol *ttol, \ - const struct bn_tol *tol)); \ - BU_EXTERN(int rt_##name##_tnurb, (struct nmgregion **r, \ - struct model *m, struct rt_db_internal *ip, \ - const struct bn_tol *tol)); \ - BU_EXTERN(int rt_##name##_import5, (struct rt_db_internal *ip, \ - const struct bu_external *ep, const mat_t mat, \ - const struct db_i *dbip, struct resource *resp, const int minor_type )); \ - BU_EXTERN(int rt_##name##_export5, (struct bu_external *ep, \ - const struct rt_db_internal *ip, \ - double local2mm, const struct db_i *dbip, \ - struct resource *resp, \ - const int minor_type)); \ - BU_EXTERN(int rt_##name##_import, (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##_export, (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, \ - struct resource *resp)); \ - 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(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)); \ - BU_EXTERN(int rt_##name##_params, (struct pc_pc_set *ps, \ - const struct rt_db_internal *ip)); \ - extern const struct bu_structparse rt_##name##_parse[]; - - -RT_DECLARE_INTERFACE(nul); - -#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_binexpm_xform rt_generic_xform -RT_DECLARE_INTERFACE(binexpm); -*/ - -#define rt_pnts_xform rt_generic_xform -RT_DECLARE_INTERFACE(pnts); - -#if OBJ_BREP -#define rt_brep_xform rt_generic_xform -RT_DECLARE_INTERFACE(brep); -#endif - - -/* from 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, - const int minor_type)); - -BU_EXTERN(int rt_comb_import5, (struct rt_db_internal *ip... [truncated message content] |
From: <br...@us...> - 2009-04-13 15:15:27
|
Revision: 34202 http://brlcad.svn.sourceforge.net/brlcad/?rev=34202&view=rev Author: brlcad Date: 2009-04-13 15:15:21 +0000 (Mon, 13 Apr 2009) Log Message: ----------- move rt_mirror() up into primitives as well since it's one of the first table calls Modified Paths: -------------- brlcad/trunk/src/librt/Makefile.am Added Paths: ----------- brlcad/trunk/src/librt/primitives/mirror.c Removed Paths: ------------- brlcad/trunk/src/librt/mirror.c Modified: brlcad/trunk/src/librt/Makefile.am =================================================================== --- brlcad/trunk/src/librt/Makefile.am 2009-04-13 15:13:40 UTC (rev 34201) +++ brlcad/trunk/src/librt/Makefile.am 2009-04-13 15:15:21 UTC (rev 34202) @@ -65,7 +65,6 @@ many.c \ mater.c \ memalloc.c \ - mirror.c \ mkbundle.c \ opennurbs_ext.cpp \ oslo_calc.c \ @@ -114,6 +113,7 @@ primitives/hf/hf.c \ primitives/hyp/hyp.c \ primitives/metaball/metaball.c \ + primitives/mirror.c \ primitives/nmg/nmg.c \ primitives/nmg/nmg_bool.c \ primitives/nmg/nmg_ck.c \ Deleted: brlcad/trunk/src/librt/mirror.c =================================================================== --- brlcad/trunk/src/librt/mirror.c 2009-04-13 15:13:40 UTC (rev 34201) +++ brlcad/trunk/src/librt/mirror.c 2009-04-13 15:15:21 UTC (rev 34202) @@ -1,1011 +0,0 @@ -/* M I R R O R . C - * BRL-CAD - * - * Copyright (c) 2007-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. - */ -/** @file mirror.c - * - * Routine(s) to mirror objects. - * - */ - -#include "common.h" - -#include <string.h> -#include "bio.h" - -#include "rtgeom.h" -#include "raytrace.h" -#include "wdb.h" -#include "bn.h" -#include "bu.h" -#include "vmath.h" -#include "nurb.h" - - -/** - * Mirror an object about some axis at a specified point on the axis. - * - * Returns a directory pointer to the new mirrored object - * - * Note: mirror_dir is expected to be normalized. - * - **/ -struct directory * -rt_mirror(struct db_i *dbip, - const char *from, - const char *to, - point_t mirror_origin, - vect_t mirror_dir, - fastf_t mirror_pt, - struct resource *resp) -{ - register struct directory *dp; - struct rt_db_internal internal; - - register int i, j; - int id; - mat_t rmat; - mat_t mirmat; - mat_t temp; - vect_t xvec; - vect_t nvec; - fastf_t ang; - static fastf_t tol_dist_sq = 0.005 * 0.005; - static point_t origin = {0.0, 0.0, 0.0}; - - if (!NEAR_ZERO(MAGSQ(mirror_dir) - 1.0, tol_dist_sq)) { - bu_log("rt_mirror: mirror_dir is invalid!\n"); - return DIR_NULL; - } - - if (!resp) { - resp=&rt_uniresource; - } - - /* look up the object being mirrored */ - if ((dp = db_lookup(dbip, from, LOOKUP_NOISY)) == DIR_NULL) { - return DIR_NULL; - } - - /* make sure object mirroring to does not already exist */ - if (db_lookup(dbip, to, LOOKUP_QUIET) != DIR_NULL) { - bu_log("%s already exists\n", to); - return DIR_NULL; - } - - /* get object being mirrored */ - id = rt_db_get_internal(&internal, dp, dbip, NULL, resp); - if (id < 0) { - bu_log("ERROR: Unable to load solid [%s]\n", from); - return DIR_NULL; - } - RT_CK_DB_INTERNAL(&internal); - - mirror_pt *= dbip->dbi_local2base; - MAT_IDN(mirmat); - - /* 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); - - /* Factor in the mirror_origin */ - { - vect_t v; - - VSUB2(v, origin, mirror_origin); - VUNITIZE(v); - - if (NEAR_ZERO(MAGSQ(v) - 1.0, tol_dist_sq)) { - fastf_t h = MAGNITUDE(mirror_origin); - fastf_t cosa = VDOT(v, mirror_dir); - - mirror_pt = mirror_pt - h * cosa; - } - } - - /* Add the translation to mirmat */ - mirmat[3 + X*4] += 2 * mirror_pt * mirror_dir[X]; - mirmat[3 + Y*4] += 2 * mirror_pt * mirror_dir[Y]; - mirmat[3 + Z*4] += 2 * mirror_pt * mirror_dir[Z]; - - switch (id) { - case ID_TOR: - { - struct rt_tor_internal *tor; - point_t pt; - vect_t h; - vect_t n; - fastf_t ang; - mat_t mat; - - tor = (struct rt_tor_internal *)internal.idb_ptr; - RT_TOR_CK_MAGIC(tor); - - VMOVE(pt, tor->v); - MAT4X3PNT(tor->v, mirmat, pt); - - VMOVE(h, tor->h); - VUNITIZE(h); - - VCROSS(n, mirror_dir, tor->h); - VUNITIZE(n); - ang = M_PI_2 - acos(VDOT(h, mirror_dir)); - bn_mat_arb_rot(mat, origin, n, ang*2); - MAT4X3VEC(tor->h, mat, h); - - break; - } - case ID_TGC: - case ID_REC: - { - struct rt_tgc_internal *tgc; - point_t pt; - vect_t h; - vect_t a, b, c, d; - vect_t n; - fastf_t ang; - mat_t mat; - - tgc = (struct rt_tgc_internal *)internal.idb_ptr; - RT_TGC_CK_MAGIC(tgc); - - VMOVE(pt, tgc->v); - MAT4X3PNT(tgc->v, mirmat, pt); - - VMOVE(h, tgc->h); - VUNITIZE(h); - VCROSS(n, mirror_dir, tgc->h); - VUNITIZE(n); - ang = M_PI_2 - acos(VDOT(h, mirror_dir)); - bn_mat_arb_rot(mat, origin, n, ang*2); - VMOVE(h, tgc->h); - MAT4X3VEC(tgc->h, mat, h); - - VMOVE(a, tgc->a); - VUNITIZE(a); - VCROSS(n, mirror_dir, tgc->a); - VUNITIZE(n); - ang = M_PI_2 - acos(VDOT(a, mirror_dir)); - bn_mat_arb_rot(mat, origin, n, ang*2); - VMOVE(a, tgc->a); - MAT4X3VEC(tgc->a, mat, a); - VMOVE(c, tgc->c); - MAT4X3VEC(tgc->c, mat, c); - - VMOVE(b, tgc->b); - VUNITIZE(b); - VCROSS(n, mirror_dir, tgc->b); - VUNITIZE(n); - ang = M_PI_2 - acos(VDOT(b, mirror_dir)); - bn_mat_arb_rot(mat, origin, n, ang*2); - VMOVE(b, tgc->b); - MAT4X3VEC(tgc->b, mat, b); - VMOVE(d, tgc->d); - MAT4X3VEC(tgc->d, mat, d); - - break; - } - case ID_ELL: - case ID_SPH: - { - struct rt_ell_internal *ell; - point_t pt; - vect_t a, b, c; - vect_t n; - fastf_t ang; - mat_t mat; - - ell = (struct rt_ell_internal *)internal.idb_ptr; - RT_ELL_CK_MAGIC(ell); - - VMOVE(pt, ell->v); - MAT4X3PNT(ell->v, mirmat, pt); - - VMOVE(a, ell->a); - VUNITIZE(a); - VCROSS(n, mirror_dir, ell->a); - VUNITIZE(n); - ang = M_PI_2 - acos(VDOT(a, mirror_dir)); - bn_mat_arb_rot(mat, origin, n, ang*2); - VMOVE(a, ell->a); - MAT4X3VEC(ell->a, mat, a); - - VMOVE(b, ell->b); - VUNITIZE(b); - VCROSS(n, mirror_dir, ell->b); - VUNITIZE(n); - ang = M_PI_2 - acos(VDOT(b, mirror_dir)); - bn_mat_arb_rot(mat, origin, n, ang*2); - VMOVE(b, ell->b); - MAT4X3VEC(ell->b, mat, b); - - VMOVE(c, ell->c); - VUNITIZE(c); - VCROSS(n, mirror_dir, ell->c); - VUNITIZE(n); - ang = M_PI_2 - acos(VDOT(c, mirror_dir)); - bn_mat_arb_rot(mat, origin, n, ang*2); - VMOVE(c, ell->c); - MAT4X3VEC(ell->c, mat, c); - - break; - } - case ID_ARB8: - { - struct rt_arb_internal *arb; - - arb = (struct rt_arb_internal *)internal.idb_ptr; - RT_ARB_CK_MAGIC(arb); - - /* mirror each vertex */ - for (i=0; i<8; i++) { - point_t pt; - - VMOVE(pt, arb->pt[i]); - MAT4X3PNT(arb->pt[i], mirmat, pt); - } - - break; - } - case ID_HALF: - { - struct rt_half_internal *haf; - vect_t n1; - vect_t n2; - fastf_t ang; - mat_t mat; - - haf = (struct rt_half_internal *)internal.idb_ptr; - RT_HALF_CK_MAGIC(haf); - - VMOVE(n1, haf->eqn); - VCROSS(n2, mirror_dir, n1); - VUNITIZE(n2); - ang = M_PI_2 - acos(VDOT(n1, mirror_dir)); - bn_mat_arb_rot(mat, origin, n2, ang*2); - MAT4X3VEC(haf->eqn, mat, n1); - - if (!NEAR_ZERO(VDOT(n1, haf->eqn) - 1.0, tol_dist_sq)) { - point_t ptA; - point_t ptB; - point_t ptC; - vect_t h; - vect_t v; - fastf_t mag; - fastf_t cosa; - - VSCALE(ptA, n1, haf->eqn[H]); - VSCALE(v, mirror_dir, 2 * mirror_pt); - VADD2(ptB, ptA, v); - VSUB2(h, ptB, ptA); - mag = MAGNITUDE(h); - VUNITIZE(h); - - cosa = VDOT(h, mirror_dir); - - VSCALE(ptC, haf->eqn, -mag * cosa); - VADD2(ptC, ptC, ptA); - haf->eqn[H] = VDOT(haf->eqn, ptC); - } - - break; - } - case ID_GRIP: - { - struct rt_grip_internal *grp; - point_t pt; - vect_t h; - vect_t n; - fastf_t ang; - mat_t mat; - - grp = (struct rt_grip_internal *)internal.idb_ptr; - RT_GRIP_CK_MAGIC(grp); - - VMOVE(pt, grp->center); - MAT4X3PNT(grp->center, mirmat, pt); - - VMOVE(h, grp->normal); - VUNITIZE(h); - - VCROSS(n, mirror_dir, grp->normal); - VUNITIZE(n); - ang = M_PI_2 - acos(VDOT(h, mirror_dir)); - bn_mat_arb_rot(mat, origin, n, ang*2); - MAT4X3VEC(grp->normal, mat, h); - - break; - } - case ID_POLY: - { - struct rt_pg_internal *pg; - fastf_t *verts; - fastf_t *norms; - - pg = (struct rt_pg_internal *)internal.idb_ptr; - RT_PG_CK_MAGIC(pg); - - verts = (fastf_t *)bu_calloc(pg->max_npts*3, sizeof(fastf_t), "rt_mirror: verts"); - norms = (fastf_t *)bu_calloc(pg->max_npts*3, sizeof(fastf_t), "rt_mirror: norms"); - - for (i=0; i<pg->npoly; i++) { - int last; - - last = (pg->poly[i].npts - 1)*3; - /* mirror coords and temporarily store in reverse order */ - for (j=0; j<pg->poly[i].npts*3; j += 3) { - point_t pt; - vect_t n1; - vect_t n2; - mat_t mat; - - VMOVE(pt, &pg->poly[i].verts[j]); - MAT4X3PNT(&pg->poly[i].verts[j], mirmat, pt); - - VMOVE(n1, &pg->poly[i].norms[j]); - VUNITIZE(n1); - - VCROSS(n2, mirror_dir, &pg->poly[i].norms[j]); - VUNITIZE(n2); - ang = M_PI_2 - acos(VDOT(n1, mirror_dir)); - bn_mat_arb_rot(mat, origin, n2, ang*2); - MAT4X3VEC(&pg->poly[i].norms[j], mat, n1); - - VMOVE(&norms[last-j], &pg->poly[i].norms[j]); - } - - /* write back mirrored and reversed face loop */ - for (j=0; j<pg->poly[i].npts*3; j += 3) { - VMOVE(&pg->poly[i].norms[j], &norms[j]); - VMOVE(&pg->poly[i].verts[j], &verts[j]); - } - } - - bu_free((char *)verts, "rt_mirror: verts"); - bu_free((char *)norms, "rt_mirror: norms"); - - break; - } - case ID_BSPLINE: - { - struct rt_nurb_internal *nurb; - - nurb = (struct rt_nurb_internal *)internal.idb_ptr; - RT_NURB_CK_MAGIC(nurb); - - for (i=0; i<nurb->nsrf; i++) { - fastf_t *ptr; - int tmp; - int orig_size[2]; - int ncoords; - int m; - int l; - - /* swap knot vetcors between u and v */ - ptr = nurb->srfs[i]->u.knots; - tmp = nurb->srfs[i]->u.k_size; - - nurb->srfs[i]->u.knots = nurb->srfs[i]->v.knots; - nurb->srfs[i]->u.k_size = nurb->srfs[i]->v.k_size; - nurb->srfs[i]->v.knots = ptr; - nurb->srfs[i]->v.k_size = tmp; - - /* swap order */ - tmp = nurb->srfs[i]->order[0]; - nurb->srfs[i]->order[0] = nurb->srfs[i]->order[1]; - nurb->srfs[i]->order[1] = tmp; - - /* swap mesh size */ - orig_size[0] = nurb->srfs[i]->s_size[0]; - orig_size[1] = nurb->srfs[i]->s_size[1]; - - nurb->srfs[i]->s_size[0] = orig_size[1]; - nurb->srfs[i]->s_size[1] = orig_size[0]; - - /* allocat memory for a new control mesh */ - ncoords = RT_NURB_EXTRACT_COORDS(nurb->srfs[i]->pt_type); - ptr = (fastf_t *)bu_calloc(orig_size[0]*orig_size[1]*ncoords, sizeof(fastf_t), "rt_mirror: ctl mesh ptr"); - - /* mirror each control point */ - for (j=0; j<orig_size[0]*orig_size[1]; j++) { - point_t pt; - - VMOVE(pt, &nurb->srfs[i]->ctl_points[j*ncoords]); - MAT4X3PNT(&nurb->srfs[i]->ctl_points[j*ncoords], mirmat, pt); - } - - /* copy mirrored control points into new mesh - * while swaping u and v */ - m = 0; - for (j=0; j<orig_size[0]; j++) { - for (l=0; l<orig_size[1]; l++) { - VMOVEN(&ptr[(l*orig_size[0]+j)*ncoords], &nurb->srfs[i]->ctl_points[m*ncoords], ncoords); - m++; - } - } - - /* free old mesh */ - bu_free((char *)nurb->srfs[i]->ctl_points, "rt_mirror: ctl points"); - - /* put new mesh in place */ - nurb->srfs[i]->ctl_points = ptr; - } - - break; - } - case ID_ARBN: - { - struct rt_arbn_internal *arbn; - - arbn = (struct rt_arbn_internal *)internal.idb_ptr; - RT_ARBN_CK_MAGIC(arbn); - - for (i=0; i<arbn->neqn; i++) { - point_t orig_pt; - point_t pt; - vect_t norm; - fastf_t factor; - - /* unitize the plane equation first */ - factor = 1.0 / MAGNITUDE(arbn->eqn[i]); - VSCALE(arbn->eqn[i], arbn->eqn[i], factor); - arbn->eqn[i][3] = arbn->eqn[i][3] * factor; - - /* Pick a point on the original halfspace */ - VSCALE(orig_pt, arbn->eqn[i], arbn->eqn[i][3]); - - /* Transform the point, and the normal */ - MAT4X3VEC(norm, mirmat, arbn->eqn[i]); - MAT4X3PNT(pt, mirmat, orig_pt); - - /* Measure new distance from origin to new point */ - VUNITIZE(norm); - VMOVE(arbn->eqn[i], norm); - arbn->eqn[i][3] = VDOT(pt, norm); - } - - break; - } - case ID_PIPE: - { - struct rt_pipe_internal *pipe; - struct wdb_pipept *ps; - - pipe = (struct rt_pipe_internal *)internal.idb_ptr; - RT_PIPE_CK_MAGIC(pipe); - - for (BU_LIST_FOR (ps, wdb_pipept, &pipe->pipe_segs_head)) { - point_t pt; - - VMOVE(pt, ps->pp_coord); - MAT4X3PNT(ps->pp_coord, mirmat, pt); - } - - break; - } - case ID_PARTICLE: - { - struct rt_part_internal *part; - point_t pt; - vect_t h; - vect_t n; - fastf_t ang; - mat_t mat; - - part = (struct rt_part_internal *)internal.idb_ptr; - RT_PART_CK_MAGIC(part); - - VMOVE(pt, part->part_V); - MAT4X3PNT(part->part_V, mirmat, pt); - - VMOVE(h, part->part_H); - VUNITIZE(h); - - VCROSS(n, mirror_dir, part->part_H); - VUNITIZE(n); - ang = M_PI_2 - acos(VDOT(h, mirror_dir)); - bn_mat_arb_rot(mat, origin, n, ang*2); - VMOVE(h, part->part_H); - MAT4X3VEC(part->part_H, mat, h); - - break; - } - case ID_RPC: - { - struct rt_rpc_internal *rpc; - point_t pt; - vect_t h; - vect_t b; - vect_t n; - fastf_t ang; - mat_t mat; - - rpc = (struct rt_rpc_internal *)internal.idb_ptr; - RT_RPC_CK_MAGIC(rpc); - - VMOVE(pt, rpc->rpc_V); - MAT4X3PNT(rpc->rpc_V, mirmat, pt); - - VMOVE(h, rpc->rpc_H); - VMOVE(b, rpc->rpc_B); - VUNITIZE(h); - VUNITIZE(b); - - VCROSS(n, mirror_dir, rpc->rpc_H); - VUNITIZE(n); - ang = M_PI_2 - acos(VDOT(h, mirror_dir)); - bn_mat_arb_rot(mat, origin, n, ang*2); - VMOVE(h, rpc->rpc_H); - MAT4X3VEC(rpc->rpc_H, mat, h); - - VCROSS(n, mirror_dir, rpc->rpc_B); - VUNITIZE(n); - ang = M_PI_2 - acos(VDOT(b, mirror_dir)); - bn_mat_arb_rot(mat, origin, n, ang*2); - VMOVE(b, rpc->rpc_B); - MAT4X3VEC(rpc->rpc_B, mat, b); - - break; - } - case ID_RHC: - { - struct rt_rhc_internal *rhc; - point_t pt; - vect_t h; - vect_t b; - vect_t n; - fastf_t ang; - mat_t mat; - - rhc = (struct rt_rhc_internal *)internal.idb_ptr; - RT_RHC_CK_MAGIC(rhc); - - VMOVE(pt, rhc->rhc_V); - MAT4X3PNT(rhc->rhc_V, mirmat, pt); - - VMOVE(h, rhc->rhc_H); - VMOVE(b, rhc->rhc_B); - VUNITIZE(h); - VUNITIZE(b); - - VCROSS(n, mirror_dir, rhc->rhc_H); - VUNITIZE(n); - ang = M_PI_2 - acos(VDOT(h, mirror_dir)); - bn_mat_arb_rot(mat, origin, n, ang*2); - VMOVE(h, rhc->rhc_H); - MAT4X3VEC(rhc->rhc_H, mat, h); - - VCROSS(n, mirror_dir, rhc->rhc_B); - VUNITIZE(n); - ang = M_PI_2 - acos(VDOT(b, mirror_dir)); - bn_mat_arb_rot(mat, origin, n, ang*2); - VMOVE(b, rhc->rhc_B); - MAT4X3VEC(rhc->rhc_B, mat, b); - - break; - } - case ID_EPA: - { - struct rt_epa_internal *epa; - point_t pt; - vect_t h; - vect_t au; - vect_t n; - fastf_t ang; - mat_t mat; - - epa = (struct rt_epa_internal *)internal.idb_ptr; - RT_EPA_CK_MAGIC(epa); - - VMOVE(pt, epa->epa_V); - MAT4X3PNT(epa->epa_V, mirmat, pt); - - VMOVE(h, epa->epa_H); - VMOVE(au, epa->epa_Au); - VUNITIZE(h); - VUNITIZE(au); - - VCROSS(n, mirror_dir, epa->epa_H); - VUNITIZE(n); - ang = M_PI_2 - acos(VDOT(h, mirror_dir)); - bn_mat_arb_rot(mat, origin, n, ang*2); - VMOVE(h, epa->epa_H); - MAT4X3VEC(epa->epa_H, mat, h); - - VCROSS(n, mirror_dir, epa->epa_Au); - VUNITIZE(n); - ang = M_PI_2 - acos(VDOT(au, mirror_dir)); - bn_mat_arb_rot(mat, origin, n, ang*2); - VMOVE(au, epa->epa_Au); - MAT4X3VEC(epa->epa_Au, mat, au); - - break; - } - case ID_ETO: - { - struct rt_eto_internal *eto; - point_t pt; - vect_t n1; - vect_t n2; - vect_t c; - fastf_t ang; - mat_t mat; - - eto = (struct rt_eto_internal *)internal.idb_ptr; - RT_ETO_CK_MAGIC(eto); - - VMOVE(pt, eto->eto_V); - MAT4X3PNT(eto->eto_V, mirmat, pt); - - VMOVE(n1, eto->eto_N); - VMOVE(c, eto->eto_C); - VUNITIZE(n1); - VUNITIZE(c); - - VCROSS(n2, mirror_dir, eto->eto_N); - VUNITIZE(n2); - ang = M_PI_2 - acos(VDOT(n1, mirror_dir)); - bn_mat_arb_rot(mat, origin, n2, ang*2); - VMOVE(n1, eto->eto_N); - MAT4X3VEC(eto->eto_N, mat, n1); - - VCROSS(n2, mirror_dir, eto->eto_C); - VUNITIZE(n2); - ang = M_PI_2 - acos(VDOT(c, mirror_dir)); - bn_mat_arb_rot(mat, origin, n2, ang*2); - VMOVE(c, eto->eto_C); - MAT4X3VEC(eto->eto_C, mat, c); - - break; - } - - case ID_HYP: - { - struct rt_hyp_internal *hyp; - point_t pt; - vect_t h; - vect_t a; - vect_t n; - fastf_t ang; - mat_t mat; - - hyp = (struct rt_hyp_internal *)internal.idb_ptr; - RT_HYP_CK_MAGIC(hyp); - - VMOVE(pt, hyp->hyp_Vi); - MAT4X3PNT(hyp->hyp_Vi, mirmat, pt); - - VMOVE(h, hyp->hyp_Hi); - VUNITIZE(h); - VCROSS(n, mirror_dir, hyp->hyp_Hi); - VUNITIZE(n); - ang = M_PI_2 - acos(VDOT(h, mirror_dir)); - bn_mat_arb_rot(mat, origin, n, ang*2); - VMOVE(h, hyp->hyp_Hi); - MAT4X3VEC(hyp->hyp_Hi, mat, h); - - VMOVE(a, hyp->hyp_A); - VUNITIZE(a); - VCROSS(n, mirror_dir, hyp->hyp_A); - VUNITIZE(n); - ang = M_PI_2 - acos(VDOT(a, mirror_dir)); - bn_mat_arb_rot(mat, origin, n, ang*2); - VMOVE(a, hyp->hyp_A); - MAT4X3VEC(hyp->hyp_A, mat, a); - - break; - } - - - - case ID_NMG: - { - struct model *m; - struct nmgregion *r; - struct shell *s; - struct bu_ptbl table; - struct vertex *v; - - m = (struct model *)internal.idb_ptr; - NMG_CK_MODEL(m); - - /* move every vertex */ - nmg_vertex_tabulate(&table, &m->magic); - for (i=0; i<BU_PTBL_END(&table); i++) { - point_t pt; - - v = (struct vertex *)BU_PTBL_GET(&table, i); - NMG_CK_VERTEX(v); - - VMOVE(pt, v->vg_p->coord); - MAT4X3PNT(v->vg_p->coord, mirmat, pt); - } - - bu_ptbl_reset(&table); - - nmg_face_tabulate(&table, &m->magic); - for (i=0; i<BU_PTBL_END(&table); i++) { - struct face *f; - - f = (struct face *)BU_PTBL_GET(&table, i); - NMG_CK_FACE(f); - - if (!f->g.magic_p) - continue; - - if (*f->g.magic_p != NMG_FACE_G_PLANE_MAGIC) { - bu_log("Sorry, can only mirror NMG solids with planar faces\n"); - bu_log("Error [%s] has \n", from); - bu_ptbl_free(&table); - rt_db_free_internal(&internal, resp); - return DIR_NULL; - } - } - - for (BU_LIST_FOR (r, nmgregion, &m->r_hd)) { - for (BU_LIST_FOR (s, shell, &r->s_hd)) { - nmg_invert_shell(s); - } - } - - - for (i=0; i<BU_PTBL_END(&table); i++) { - struct face *f; - struct faceuse *fu; - - f = (struct face *)BU_PTBL_GET(&table, i); - NMG_CK_FACE(f); - - fu = f->fu_p; - if (fu->orientation != OT_SAME) { - fu = fu->fumate_p; - } - if (fu->orientation != OT_SAME) { - bu_log("Error with orientation of the NMG faces for [%s]\n", from); - bu_ptbl_free(&table); - rt_db_free_internal(&internal, resp); - return DIR_NULL; - } - - if (nmg_calc_face_g(fu)) { - bu_log("Error calculating the NMG faces for [%s]\n", from); - bu_ptbl_free(&table); - rt_db_free_internal(&internal, resp); - return DIR_NULL; - } - } - - bu_ptbl_free(&table); - nmg_rebound(m, &(dbip->dbi_wdbp->wdb_tol)); - - break; - } - case ID_ARS: - { - struct rt_ars_internal *ars; - fastf_t *tmp_curve; - - ars = (struct rt_ars_internal *)internal.idb_ptr; - RT_ARS_CK_MAGIC(ars); - - /* mirror each vertex */ - for (i=0; i<ars->ncurves; i++) { - for (j=0; j<ars->pts_per_curve; j++) { - point_t pt; - - VMOVE(pt, &ars->curves[i][j*3]); - MAT4X3PNT(&ars->curves[i][j*3], mirmat, pt); - } - } - - /* now reverse order of vertices in each curve */ - tmp_curve = (fastf_t *)bu_calloc(3*ars->pts_per_curve, sizeof(fastf_t), "rt_mirror: tmp_curve"); - for (i=0; i<ars->ncurves; i++) { - /* reverse vertex order */ - for (j=0; j<ars->pts_per_curve; j++) { - VMOVE(&tmp_curve[(ars->pts_per_curve-j-1)*3], &ars->curves[i][j*3]); - } - - /* now copy back */ - memcpy(ars->curves[i], tmp_curve, ars->pts_per_curve*3*sizeof(fastf_t)); - } - - bu_free((char *)tmp_curve, "rt_mirror: tmp_curve"); - - break; - } - case ID_EBM: - { - struct rt_ebm_internal *ebm; - - ebm = (struct rt_ebm_internal *)internal.idb_ptr; - RT_EBM_CK_MAGIC(ebm); - - bn_mat_mul(temp, mirmat, ebm->mat); - MAT_COPY(ebm->mat, temp); - - break; - } - case ID_DSP: - { - struct rt_dsp_internal *dsp; - - dsp = (struct rt_dsp_internal *)internal.idb_ptr; - RT_DSP_CK_MAGIC(dsp); - - bn_mat_mul(temp, mirmat, dsp->dsp_mtos); - MAT_COPY(dsp->dsp_mtos, temp); - - break; - } - case ID_VOL: - { - struct rt_vol_internal *vol; - - vol = (struct rt_vol_internal *)internal.idb_ptr; - RT_VOL_CK_MAGIC(vol); - - bn_mat_mul(temp, mirmat, vol->mat); - MAT_COPY(vol->mat, temp); - - break; - } - case ID_SUPERELL: - { - struct rt_superell_internal *superell; - point_t pt; - vect_t a, b, c; - vect_t n; - fastf_t ang; - mat_t mat; - - - superell = (struct rt_superell_internal *)internal.idb_ptr; - RT_SUPERELL_CK_MAGIC(superell); - - VMOVE(pt, superell->v); - MAT4X3PNT(superell->v, mirmat, pt); - - VMOVE(a, superell->a); - VUNITIZE(a); - VCROSS(n, mirror_dir, superell->a); - VUNITIZE(n); - ang = M_PI_2 - acos(VDOT(a, mirror_dir)); - bn_mat_arb_rot(mat, origin, n, ang*2); - VMOVE(a, superell->a); - MAT4X3VEC(superell->a, mat, a); - - VMOVE(b, superell->b); - VUNITIZE(b); - VCROSS(n, mirror_dir, superell->b); - VUNITIZE(n); - ang = M_PI_2 - acos(VDOT(b, mirror_dir)); - bn_mat_arb_rot(mat, origin, n, ang*2); - VMOVE(b, superell->b); - MAT4X3VEC(superell->b, mat, b); - - VMOVE(c, superell->c); - VUNITIZE(c); - VCROSS(n, mirror_dir, superell->c); - VUNITIZE(n); - ang = M_PI_2 - acos(VDOT(c, mirror_dir)); - bn_mat_arb_rot(mat, origin, n, ang*2); - VMOVE(c, superell->c); - MAT4X3VEC(superell->c, mat, c); - - superell->n = 1.0; - superell->e = 1.0; - - break; - } - case ID_COMBINATION: - { - struct rt_comb_internal *comb; - - comb = (struct rt_comb_internal *)internal.idb_ptr; - RT_CK_COMB(comb); - - if (comb->tree) { - db_tree_mul_dbleaf(comb->tree, mirmat); - } - break; - } - case ID_BOT: - { - struct rt_bot_internal *bot; - - bot = (struct rt_bot_internal *)internal.idb_ptr; - RT_BOT_CK_MAGIC(bot); - - /* mirror each vertex */ - for (i=0; i<bot->num_vertices; i++) { - point_t pt; - - VMOVE(pt, &bot->vertices[i*3]); - MAT4X3PNT(&bot->vertices[i*3], mirmat, pt); - } - - /* Reverse each faces' order */ - for (i=0; i<bot->num_faces; i++) { - int save_face = bot->faces[i*3]; - - bot->faces[i*3] = bot->faces[i*3 + Z]; - bot->faces[i*3 + Z] = save_face; - } - - /* fix normals */ - for (i=0; i<bot->num_normals; i++) { - vectp_t np = &bot->normals[i*3]; - vect_t n1; - vect_t n2; - fastf_t ang; - mat_t mat; - - VMOVE(n1, np); - VCROSS(n2, mirror_dir, n1); - VUNITIZE(n2); - ang = M_PI_2 - acos(VDOT(n1, mirror_dir)); - bn_mat_arb_rot(mat, origin, n2, ang*2); - MAT4X3VEC(np, mat, n1); - } - - break; - } - default: - { - rt_db_free_internal(&internal, resp); - bu_log("Unknown or unsupported object type (id==%d)\n", id); - bu_log("ERROR: cannot mirror object [%s]\n", from); - return DIR_NULL; - } - } - - /* save the mirrored object to disk */ - if ((dp = db_diradd(dbip, to, -1L, 0, dp->d_flags, (genptr_t)&internal.idb_type)) == DIR_NULL) { - bu_log("ERROR: Unable to add [%s] to the database directory", to); - return DIR_NULL; - } - if (rt_db_put_internal(dp, dbip, &internal, resp) < 0) { - bu_log("ERROR: Unable to store [%s] to the database", to); - return DIR_NULL; - } - - return dp; -} - - -/* - * 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/primitives/mirror.c (from rev 34200, brlcad/trunk/src/librt/mirror.c) =================================================================== --- brlcad/trunk/src/librt/primitives/mirror.c (rev 0) +++ brlcad/trunk/src/librt/primitives/mirror.c 2009-04-13 15:15:21 UTC (rev 34202) @@ -0,0 +1,1011 @@ +/* M I R R O R . C + * BRL-CAD + * + * Copyright (c) 2007-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. + */ +/** @file mirror.c + * + * Routine(s) to mirror objects. + * + */ + +#include "common.h" + +#include <string.h> +#include "bio.h" + +#include "rtgeom.h" +#include "raytrace.h" +#include "wdb.h" +#include "bn.h" +#include "bu.h" +#include "vmath.h" +#include "nurb.h" + + +/** + * Mirror an object about some axis at a specified point on the axis. + * + * Returns a directory pointer to the new mirrored object + * + * Note: mirror_dir is expected to be normalized. + * + **/ +struct directory * +rt_mirror(struct db_i *dbip, + const char *from, + const char *to, + point_t mirror_origin, + vect_t mirror_dir, + fastf_t mirror_pt, + struct resource *resp) +{ + register struct directory *dp; + struct rt_db_internal internal; + + register int i, j; + int id; + mat_t rmat; + mat_t mirmat; + mat_t temp; + vect_t xvec; + vect_t nvec; + fastf_t ang; + static fastf_t tol_dist_sq = 0.005 * 0.005; + static point_t origin = {0.0, 0.0, 0.0}; + + if (!NEAR_ZERO(MAGSQ(mirror_dir) - 1.0, tol_dist_sq)) { + bu_log("rt_mirror: mirror_dir is invalid!\n"); + return DIR_NULL; + } + + if (!resp) { + resp=&rt_uniresource; + } + + /* look up the object being mirrored */ + if ((dp = db_lookup(dbip, from, LOOKUP_NOISY)) == DIR_NULL) { + return DIR_NULL; + } + + /* make sure object mirroring to does not already exist */ + if (db_lookup(dbip, to, LOOKUP_QUIET) != DIR_NULL) { + bu_log("%s already exists\n", to); + return DIR_NULL; + } + + /* get object being mirrored */ + id = rt_db_get_internal(&internal, dp, dbip, NULL, resp); + if (id < 0) { + bu_log("ERROR: Unable to load solid [%s]\n", from); + return DIR_NULL; + } + RT_CK_DB_INTERNAL(&internal); + + mirror_pt *= dbip->dbi_local2base; + MAT_IDN(mirmat); + + /* 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); + + /* Factor in the mirror_origin */ + { + vect_t v; + + VSUB2(v, origin, mirror_origin); + VUNITIZE(v); + + if (NEAR_ZERO(MAGSQ(v) - 1.0, tol_dist_sq)) { + fastf_t h = MAGNITUDE(mirror_origin); + fastf_t cosa = VDOT(v, mirror_dir); + + mirror_pt = mirror_pt - h * cosa; + } + } + + /* Add the translation to mirmat */ + mirmat[3 + X*4] += 2 * mirror_pt * mirror_dir[X]; + mirmat[3 + Y*4] += 2 * mirror_pt * mirror_dir[Y]; + mirmat[3 + Z*4] += 2 * mirror_pt * mirror_dir[Z]; + + switch (id) { + case ID_TOR: + { + struct rt_tor_internal *tor; + point_t pt; + vect_t h; + vect_t n; + fastf_t ang; + mat_t mat; + + tor = (struct rt_tor_internal *)internal.idb_ptr; + RT_TOR_CK_MAGIC(tor); + + VMOVE(pt, tor->v); + MAT4X3PNT(tor->v, mirmat, pt); + + VMOVE(h, tor->h); + VUNITIZE(h); + + VCROSS(n, mirror_dir, tor->h); + VUNITIZE(n); + ang = M_PI_2 - acos(VDOT(h, mirror_dir)); + bn_mat_arb_rot(mat, origin, n, ang*2); + MAT4X3VEC(tor->h, mat, h); + + break; + } + case ID_TGC: + case ID_REC: + { + struct rt_tgc_internal *tgc; + point_t pt; + vect_t h; + vect_t a, b, c, d; + vect_t n; + fastf_t ang; + mat_t mat; + + tgc = (struct rt_tgc_internal *)internal.idb_ptr; + RT_TGC_CK_MAGIC(tgc); + + VMOVE(pt, tgc->v); + MAT4X3PNT(tgc->v, mirmat, pt); + + VMOVE(h, tgc->h); + VUNITIZE(h); + VCROSS(n, mirror_dir, tgc->h); + VUNITIZE(n); + ang = M_PI_2 - acos(VDOT(h, mirror_dir)); + bn_mat_arb_rot(mat, origin, n, ang*2); + VMOVE(h, tgc->h); + MAT4X3VEC(tgc->h, mat, h); + + VMOVE(a, tgc->a); + VUNITIZE(a); + VCROSS(n, mirror_dir, tgc->a); + VUNITIZE(n); + ang = M_PI_2 - acos(VDOT(a, mirror_dir)); + bn_mat_arb_rot(mat, origin, n, ang*2); + VMOVE(a, tgc->a); + MAT4X3VEC(tgc->a, mat, a); + VMOVE(c, tgc->c); + MAT4X3VEC(tgc->c, mat, c); + + VMOVE(b, tgc->b); + VUNITIZE(b); + VCROSS(n, mirror_dir, tgc->b); + VUNITIZE(n); + ang = M_PI_2 - acos(VDOT(b, mirror_dir)); + bn_mat_arb_rot(mat, origin, n, ang*2); + VMOVE(b, tgc->b); + MAT4X3VEC(tgc->b, mat, b); + VMOVE(d, tgc->d); + MAT4X3VEC(tgc->d, mat, d); + + break; + } + case ID_ELL: + case ID_SPH: + { + struct rt_ell_internal *ell; + point_t pt; + vect_t a, b, c; + vect_t n; + fastf_t ang; + mat_t mat; + + ell = (struct rt_ell_internal *)internal.idb_ptr; + RT_ELL_CK_MAGIC(ell); + + VMOVE(pt, ell->v); + MAT4X3PNT(ell->v, mirmat, pt); + + VMOVE(a, ell->a); + VUNITIZE(a); + VCROSS(n, mirror_dir, ell->a); + VUNITIZE(n); + ang = M_PI_2 - acos(VDOT(a, mirror_dir)); + bn_mat_arb_rot(mat, origin, n, ang*2); + VMOVE(a, ell->a); + MAT4X3VEC(ell->a, mat, a); + + VMOVE(b, ell->b); + VUNITIZE(b); + VCROSS(n, mirror_dir, ell->b); + VUNITIZE(n); + ang = M_PI_2 - acos(VDOT(b, mirror_dir)); + bn_mat_arb_rot(mat, origin, n, ang*2); + VMOVE(b, ell->b); + MAT4X3VEC(ell->b, mat, b); + + VMOVE(c, ell->c); + VUNITIZE(c); + VCROSS(n, mirror_dir, ell->c); + VUNITIZE(n); + ang = M_PI_2 - acos(VDOT(c, mirror_dir)); + bn_mat_arb_rot(mat, origin, n, ang*2); + VMOVE(c, ell->c); + MAT4X3VEC(ell->c, mat, c); + + break; + } + case ID_ARB8: + { + struct rt_arb_internal *arb; + + arb = (struct rt_arb_internal *)internal.idb_ptr; + RT_ARB_CK_MAGIC(arb); + + /* mirror each vertex */ + for (i=0; i<8; i++) { + point_t pt; + + VMOVE(pt, arb->pt[i]); + MAT4X3PNT(arb->pt[i], mirmat, pt); + } + + break; + } + case ID_HALF: + { + struct rt_half_internal *haf; + vect_t n1; + vect_t n2; + fastf_t ang; + mat_t mat; + + haf = (struct rt_half_internal *)internal.idb_ptr; + RT_HALF_CK_MAGIC(haf); + + VMOVE(n1, haf->eqn); + VCROSS(n2, mirror_dir, n1); + VUNITIZE(n2); + ang = M_PI_2 - acos(VDOT(n1, mirror_dir)); + bn_mat_arb_rot(mat, origin, n2, ang*2); + MAT4X3VEC(haf->eqn, mat, n1); + + if (!NEAR_ZERO(VDOT(n1, haf->eqn) - 1.0, tol_dist_sq)) { + point_t ptA; + point_t ptB; + point_t ptC; + vect_t h; + vect_t v; + fastf_t mag; + fastf_t cosa; + + VSCALE(ptA, n1, haf->eqn[H]); + VSCALE(v, mirror_dir, 2 * mirror_pt); + VADD2(ptB, ptA, v); + VSUB2(h, ptB, ptA); + mag = MAGNITUDE(h); + VUNITIZE(h); + + cosa = VDOT(h, mirror_dir); + + VSCALE(ptC, haf->eqn, -mag * cosa); + VADD2(ptC, ptC, ptA); + haf->eqn[H] = VDOT(haf->eqn, ptC); + } + + break; + } + case ID_GRIP: + { + struct rt_grip_internal *grp; + point_t pt; + vect_t h; + vect_t n; + fastf_t ang; + mat_t mat; + + grp = (struct rt_grip_internal *)internal.idb_ptr; + RT_GRIP_CK_MAGIC(grp); + + VMOVE(pt, grp->center); + MAT4X3PNT(grp->center, mirmat, pt); + + VMOVE(h, grp->normal); + VUNITIZE(h); + + VCROSS(n, mirror_dir, grp->normal); + VUNITIZE(n); + ang = M_PI_2 - acos(VDOT(h, mirror_dir)); + bn_mat_arb_rot(mat, origin, n, ang*2); + MAT4X3VEC(grp->normal, mat, h); + + break; + } + case ID_POLY: + { + struct rt_pg_internal *pg; + fastf_t *verts; + fastf_t *norms; + + pg = (struct rt_pg_internal *)internal.idb_ptr; + RT_PG_CK_MAGIC(pg); + + verts = (fastf_t *)bu_calloc(pg->max_npts*3, sizeof(fastf_t), "rt_mirror: verts"); + norms = (fastf_t *)bu_calloc(pg->max_npts*3, sizeof(fastf_t), "rt_mirror: norms"); + + for (i=0; i<pg->npoly; i++) { + int last; + + last = (pg->poly[i].npts - 1)*3; + /* mirror coords and temporarily store in reverse order */ + for (j=0; j<pg->poly[i].npts*3; j += 3) { + point_t pt; + vect_t n1; + vect_t n2; + mat_t mat; + + VMOVE(pt, &pg->poly[i].verts[j]); + MAT4X3PNT(&pg->poly[i].verts[j], mirmat, pt); + + VMOVE(n1, &pg->poly[i].norms[j]); + VUNITIZE(n1); + + VCROSS(n2, mirror_dir, &pg->poly[i].norms[j]); + VUNITIZE(n2); + ang = M_PI_2 - acos(VDOT(n1, mirror_dir)); + bn_mat_arb_rot(mat, origin, n2, ang*2); + MAT4X3VEC(&pg->poly[i].norms[j], mat, n1); + + VMOVE(&norms[last-j], &pg->poly[i].norms[j]); + } + + /* write back mirrored and reversed face loop */ + for (j=0; j<pg->poly[i].npts*3; j += 3) { + VMOVE(&pg->poly[i].norms[j], &norms[j]); + VMOVE(&pg->poly[i].verts[j], &verts[j]); + } + } + + bu_free((char *)verts, "rt_mirror: verts"); + bu_free((char *)norms, "rt_mirror: norms"); + + break; + } + case ID_BSPLINE: + { + struct rt_nurb_internal *nurb; + + nurb = (struct rt_nurb_internal *)internal.idb_ptr; + RT_NURB_CK_MAGIC(nurb); + + for (i=0; i<nurb->nsrf; i++) { + fastf_t *ptr; + int tmp; + int orig_size[2]; + int ncoords; + int m; + int l; + + /* swap knot vetcors between u and v */ + ptr = nurb->srfs[i]->u.knots; + tmp = nurb->srfs[i]->u.k_size; + + nurb->srfs[i]->u.knots = nurb->srfs[i]->v.knots; + nurb->srfs[i]->u.k_size = nurb->srfs[i]->v.k_size; + nurb->srfs[i]->v.knots = ptr; + nurb->srfs[i]->v.k_size = tmp; + + /* swap order */ + tmp = nurb->srfs[i]->order[0]; + nurb->srfs[i]->order[0] = nurb->srfs[i]->order[1]; + nurb->srfs[i]->order[1] = tmp; + + /* swap mesh size */ + orig_size[0] = nurb->srfs[i]->s_size[0]; + orig_size[1] = nurb->srfs[i]->s_size[1]; + + nurb->srfs[i]->s_size[0] = orig_size[1]; + nurb->srfs[i]->s_size[1] = orig_size[0]; + + /* allocat memory for a new control mesh */ + ncoords = RT_NURB_EXTRACT_COORDS(nurb->srfs[i]->pt_type); + ptr = (fastf_t *)bu_calloc(orig_size[0]*orig_size[1]*ncoords, sizeof(fastf_t), "rt_mirror: ctl mesh ptr"); + + /* mirror each control point */ + for (j=0; j<orig_size[0]*orig_size[1]; j++) { + point_t pt; + + VMOVE(pt, &nurb->srfs[i]->ctl_points[j*ncoords]); + MAT4X3PNT(&nurb->srfs[i]->ctl_points[j*ncoords], mirmat, pt); + } + + /* copy mirrored control points into new mesh + * while swaping u and v */ + m = 0; + for (j=0; j<orig_size[0]; j++) { + for (l=0; l<orig_size[1]; l++) { + VMOVEN(&ptr[(l*orig_size[0]+j)*ncoords], &nurb->srfs[i]->ctl_points[m*ncoords], ncoords); + m++; + } + } + + /* free old mesh */ + bu_free((char *)nurb->srfs[i]->ctl_points, "rt_mirror: ctl points"); + + /* put new mesh in place */ + nurb->srfs[i]->ctl_points = ptr; + } + + break; + } + case ID_ARBN: + { + struct rt_arbn_internal *arbn; + + arbn = (struct rt_arbn_internal *)internal.idb_ptr; + RT_ARBN_CK_MAGIC(arbn); + + for (i=0; i<arbn->neqn; i++) { + point_t orig_pt; + point_t pt; + vect_t norm; + fastf_t factor; + + /* unitize the plane equation first */ + factor = 1.0 / MAGNITUDE(arbn->eqn[i]); + VSCALE(arbn->eqn[i], arbn->eqn[i], factor); + arbn->eqn[i][3] = arbn->eqn[i][3] * factor; + + /* Pick a point on the original halfspace */ + VSCALE(orig_pt, arbn->eqn[i], arbn->eqn[i][3]); + + /* Transform the point, and the normal */ + MAT4X3VEC(norm, mirmat, arbn->eqn[i]); + MAT4X3PNT(pt, mirmat, orig_pt); + + /* Measure new distance from origin to new point */ + VUNITIZE(norm); + VMOVE(arbn->eqn[i], norm); + arbn->eqn[i][3] = VDOT(pt, norm); + } + + break; + } + case ID_PIPE: + { + struct rt_pipe_internal *pipe; + struct wdb_pipept *ps; + + pipe = (struct rt_pipe_internal *)internal.idb_ptr; + RT_PIPE_CK_MAGIC(pipe); + + for (BU_LIST_FOR (ps, wdb_pipept, &pipe->pipe_segs_head)) { + point_t pt; + + VMOVE(pt, ps->pp_coord); + MAT4X3PNT(ps->pp_coord, mirmat, pt); + } + + break; + } + case ID_PARTICLE: + { + struct rt_part_internal *part; + point_t pt; + vect_t h; + vect_t n; + fastf_t ang; + mat_t mat; + + part = (struct rt_part_internal *)internal.idb_ptr; + RT_PART_CK_MAGIC(part); + + VMOVE(pt, part->part_V); + MAT4X3PNT(part->part_V, mirmat, pt); + + VMOVE(h, part->part_H); + VUNITIZE(h); + + VCROSS(n, mirror_dir, part->part_H); + VUNITIZE(n); + ang = M_PI_2 - acos(VDOT(h, mirror_dir)); + bn_mat_arb_rot(mat, origin, n, ang*2); + VMOVE(h, part->part_H); + MAT4X3VEC(part->part_H, mat, h); + + break; + } + case ID_RPC: + { + struct rt_rpc_internal *rpc; + point_t pt; + vect_t h; + vect_t b; + vect_t n; + fastf_t ang; + mat_t mat; + + rpc = (struct rt_rpc_internal *)internal.idb_ptr; + RT_RPC_CK_MAGIC(rpc); + + VMOVE(pt, rpc->rpc_V); + MAT4X3PNT(rpc->rpc_V, mirmat, pt); + + VMOVE(h, rpc->rpc_H); + VMOVE(b, rpc->rpc_B); + VUNITIZE(h); + VUNITIZE(b); + + VCROSS(n, mirror_dir, rpc->rpc_H); + VUNITIZE(n); + ang = M_PI_2 - acos(VDOT(h, mirror_dir)); + bn_mat_arb_rot(mat, origin, n, ang*2); + VMOVE(h, rpc->rpc_H); + MAT4X3VEC(rpc->rpc_H, mat, h); + + VCROSS(n, mirror_dir, rpc->rpc_B); + VUNITIZE(n); + ang = M_PI_2 - acos(VDOT(b, mirror_dir)); + bn_mat_arb_rot(mat, origin, n, ang*2); + VMOVE(b, rpc->rpc_B); + MAT4X3VEC(rpc->rpc_B, mat, b); + + break; + } + case ID_RHC: + { + struct rt_rhc_internal *rhc; + point_t pt; + vect_t h; + vect_t b; + vect_t n; + fastf_t ang; + mat_t mat; + + rhc = (struct rt_rhc_internal *)internal.idb_ptr; + RT_RHC_CK_MAGIC(rhc); + + VMOVE(pt, rhc->rhc_V); + MAT4X3PNT(rhc->rhc_V, mirmat, pt); + + VMOVE(h, rhc->rhc_H); + VMOVE(b, rhc->rhc_B); + VUNITIZE(h); + VUNITIZE(b); + + VCROSS(n, mirror_dir, rhc->rhc_H); + VUNITIZE(n); + ang = M_PI_2 - acos(VDOT(h, mirror_dir)); + bn_mat_arb_rot(mat, origin, n, ang*2); + VMOVE(h, rhc->rhc_H); + MAT4X3VEC(rhc->rhc_H, mat, h); + + VCROSS(n, mirror_dir, rhc->rhc_B); + VUNITIZE(n); + ang = M_PI_2 - acos(VDOT(b, mirror_dir)); + bn_mat_arb_rot(mat, origin, n, ang*2); + VMOVE(b, rhc->rhc_B); + MAT4X3VEC(rhc->rhc_B, mat, b); + + break; + } + case ID_EPA: + { + struct rt_epa_internal *epa; + point_t pt; + vect_t h; + vect_t au; + vect_t n; + fastf_t ang; + mat_t mat; + + epa = (struct rt_epa_internal *)internal.idb_ptr; + RT_EPA_CK_MAGIC(epa); + + VMOVE(pt, epa->epa_V); + MAT4X3PNT(epa->epa_V, mirmat, pt); + + VMOVE(h, epa->epa_H); + VMOVE(au, epa->epa_Au); + VUNITIZE(h); + VUNITIZE(au); + + VCROSS(n, mirror_dir, epa->epa_H); + VUNITIZE(n); + ang = M_PI_2 - acos(VDOT(h, mirror_dir)); + bn_mat_arb_rot(mat, origin, n, ang*2); + VMOVE(h, epa->epa_H); + MAT4X3VEC(epa->epa_H, mat, h); + + VCROSS(n, mirror_dir, epa->epa_Au); + VUNITIZE(n); + ang = M_PI_2 - acos(VDOT(au, mirror_dir)); + bn_mat_arb_rot(mat, origin, n, ang*2); + VMOVE(au, epa->epa_Au); + MAT4X3VEC(epa->epa_Au, mat, au); + + break; + } + case ID_ETO: + { + struct rt_eto_internal *eto; + point_t pt; + vect_t n1; + vect_t n2; + vect_t c; + fastf_t ang; + mat_t mat; + + eto = (struct rt_eto_internal *)internal.idb_ptr; + RT_ETO_CK_MAGIC(eto); + + VMOVE(pt, eto->eto_V); + MAT4X3PNT(eto->eto_V, mirmat, pt); + + VMOVE(n1, eto->eto_N); + VMOVE(c, eto->eto_C); + VUNITIZE(n1); + VUNITIZE(c); + + VCROSS(n2, mirror_dir, eto->eto_N); + VUNITIZE(n2); + ang = M_PI_2 - acos(VDOT(n1, mirror_dir)); + bn_mat_arb_rot(mat, origin, n2, ang*2); + VMOVE(n1, eto->eto_N); + MAT4X3VEC(eto->eto_N, mat, n1); + + VCROSS(n2, mirror_dir, eto->eto_C); + VUNITIZE(n2); + ang = M_PI_2 - acos(VDOT(c, mirror_dir)); + bn_mat_arb_rot(mat, origin, n2, ang*2); + VMOVE(c, eto->eto_C); + MAT4X3VEC(eto->eto_C, mat, c); + + break; + } + + case ID_HYP: + { + struct rt_hyp_internal *hyp; + point_t pt; + vect_t h; + vect_t a; + vect_t n; + fastf_t ang; + mat_t mat; + + hyp = (struct rt_hyp_internal *)internal.idb_ptr; + RT_HYP_CK_MAGIC(hyp); + + VMOVE(pt, hyp->hyp_Vi); + MAT4X3PNT(hyp->hyp_Vi, mirmat, pt); + + VMOVE(h, hyp->hyp_Hi); + VUNITIZE(h); + VCROSS(n, mirror_dir, hyp->hyp_Hi); + VUNITIZE(n); + ang = M_PI_2 - acos(VDOT(h, mirror_dir)); + bn_mat_arb_rot(mat, origin, n, ang*2); + VMOVE(h, hyp->hyp_Hi); + MAT4X3VEC(hyp->hyp_Hi, mat, h); + + VMOVE(a, hyp->hyp_A); + VUNITIZE(a); + VCROSS(n, mirror_dir, hyp->hyp_A); + VUNITIZE(n); + ang = M_PI_2 - acos(VDOT(a, mirror_dir)); + bn_mat_arb_rot(mat, origin, n, ang*2); + VMOVE(a, hyp->hyp_A); + MAT4X3VEC(hyp->hyp_A, mat, a); + + break; + } + + + + case ID_NMG: + { + struct model *m; + struct nmgregion *r; + struct shell *s; + struct bu_ptbl table; + struct vertex *v; + + m = (struct model *)internal.idb_ptr; + NMG_CK_MODEL(m); + + /* move every vertex */ + nmg_vertex_tabulate(&table, &m->magic); + for (i=0; i<BU_PTBL_END(&table); i++) { + point_t pt; + + v = (struct vertex *)BU_PTBL_GET(&table, i); + NMG_CK_VERTEX(v); + + VMOVE(pt, v->vg_p->coord); + MAT4X3PNT(v->vg_p->coord, mirmat, pt); + } + + bu_ptbl_reset(&table); + + nmg_face_tabulate(&table, &m->magic); + for (i=0; i<BU_PTBL_END(&table); i++) { + struct face *f; + + f = (struct face *)BU_PTBL_GET(&table, i); + NMG_CK_FACE(f); + + if (!f->g.magic_p) + continue; + + if (*f->g.magic_p != NMG_FACE_G_PLANE_MAGIC) { + bu_log("Sorry, can only mirror NMG solids with planar faces\n"); + bu_log("Error [%s] has \n", from); + bu_ptbl_free(&table); + rt_db_free_internal(&internal, resp); + return DIR_NULL; + } + } + + for (BU_LIST_FOR (r, nmgregion, &m->r_hd)) { + for (BU_LIST_FOR (s, shell, &r->s_hd)) { + nmg_invert_shell(s); + } + } + + + for (i=0; i<BU_PTBL_END(&table); i++) { + struct face *f; + struct faceuse *fu; + + f = (struct face *)BU_PTBL_GET(&table, i); + NMG_CK_FACE(f); + + fu = f->fu_p; + if (fu->orientation != OT_SAME) { + fu = fu->fumate_p; + } + if (fu->orientation != OT_SAME) { + bu_log("Error with orientation of the NMG faces for [%s]\n", from); + bu_ptbl_free(&table); + rt_db_free_internal(&internal, resp); + return DIR_NULL; + } + + if (nmg_calc_face_g(fu)) { + bu_log("Error calculating the NMG faces for [%s]\n", from); + bu_ptbl_free(&table); + rt_db_free_internal(&internal, resp); + return DIR_NULL; + } + } + + bu_ptbl_free(&table); + nmg_rebound(m, &(dbip->dbi_wdbp->wdb_tol)); + + break; + } + case ID_ARS: + { + struct rt_ars_internal *ars; + fastf_t *tmp_curve; + + ars = (struct rt_ars_internal *)internal.idb_ptr; + RT_ARS_CK_MAGIC(ars); + + /* mirror each vertex */ + for (i=0; i<ars->ncurves; i++) { + for (j=0; j<ars->pts_per_curve; j++) { + point_t pt; + + VMOVE(pt, &ars->curves[i][j*3]); + MAT4X3PNT(&ars->curves[i][j*3], mirmat, pt); + } + } + + /* now reverse order of vertices in each curve */ + tmp_curve = (fastf_t *)bu_calloc(3*ars->pts_per_curve, sizeof(fastf_t), "rt_mirror: tmp_curve"); + for (i=0; i<ars->ncurves; i++) { + /* reverse vertex order */ + for (j=0; j<ars->pts_per_curve; j++) { + VMOVE(&tmp_curve[(ars->pts_per_curve-j-1)*3], &ars->curves[i][j*3]); + } + + /* now copy back */ + memcpy(ars->curves[i], tmp_curve, ars->pts_per_curve*3*sizeof(fastf_t)); + } + + bu_free((char *)tmp_curve, "rt_mirror: tmp_curve"); + + break; + } + case ID_EBM: + { + struct rt_ebm_internal *ebm; + + ebm = (struct rt_ebm_internal *)internal.idb_ptr; + RT_EBM_CK_MAGIC(ebm); + + bn_mat_mul(temp, mirmat, ebm->mat); + MAT_COPY(ebm->mat, temp); + + break; + } + case ID_DSP: + { + struct rt_dsp_internal *dsp; + + dsp = (struct rt_dsp_internal *)internal.idb_ptr; + RT_DSP_CK_MAGIC(dsp); + + bn_mat_mul(temp, mirmat, dsp->dsp_mtos); + MAT_COPY(dsp->dsp_mtos, temp); + + break; + } + case ID_VOL: + { + struct rt_vol_internal *vol; + + vol = (struct rt_vol_internal *)internal.idb_ptr; + RT_VOL_CK_MAGIC(vol); + + bn_mat_mul(temp, mirmat, vol->mat); + MAT_COPY(vol->mat, temp); + + break; + } + case ID_SUPERELL: + { + struct rt_superell_internal *superell; + point_t pt; + vect_t a, b, c; + vect_t n; + fastf_t ang; + mat_t mat; + + + superell = (struct rt_superell_internal *)internal.idb_ptr; + RT_SUPERELL_CK_MAGIC(superell); + + VMOVE(pt, superell->v); + MAT4X3PNT(superell->v, mirmat, pt); + + VMOVE(a, superell->a); + VUNITIZE(a); + VCROSS(n, mirror_dir, superell->a); + VUNITIZE(n); + ang = M_PI_2 - acos(VDOT(a, mirror_dir)); + bn_mat_arb_rot(mat, origin, n, ang*2); + VMOVE(a, superell->a); + MAT4X3VEC(superell->a, mat, a); + + VMOVE(b, superell->b); + VUNITIZE(b); + VCROSS(n, mirror_dir, superell->b); + VUNITIZE(n); + ang = M_PI_2 - acos(VDOT(b, mirror_dir)); + bn_mat_arb_rot(mat, origin, n, ang*2); + VMOVE(b, superell->b); + MAT4X3VEC(superell->b, mat, b); + + VMOVE(c, superell->c); + VUNITIZE(c); + VCROSS(n, mirror_dir, superell->c); + VUNITIZE(n); + ang = M_PI_2 - acos(VDOT(c, mirror_dir)); + bn_mat_arb_rot(mat, origin, n, ang*2); + VMOVE(c, superell->c); + MAT4X3VEC(superell->c, mat, c); + + superell->n = 1.0; + superell->e = 1.0; + + break; + } + case ID_COMBINATION: + { + struct rt_comb_internal *comb; + + comb = (struct rt_comb_internal *)internal.idb_ptr; + RT_CK_COMB(comb); + + if (comb->tree) { + db_tree_mul_dbleaf(comb->tree, mirmat); + } + break; + } + case ID_BOT: + { + struct rt_bot_internal *bot; + + bot = (struct rt_bot_internal *)internal.idb_ptr; + RT_BOT_CK_MAGIC(bot); + + /* mirror each vertex */ + for (i=0; i<bot->num_vertices; i++) { + point_t pt; + + VMOVE(pt, &bot->vertices[i*3]); + MAT4X3PNT(&bot->vertices[i*3], mirmat, pt); + } + + /* Reverse each faces' order */ + for (i=0; i<bot->num_faces; i++) { + int save_face = bot->faces[i*3]; + + bot->faces[i*3] = bot->faces[i*3 + Z]; + bot->faces[i*3 + Z] = save_face; + } + + /* fix normals */ + for (i=0; i<bot->num_normals; i++) { + vectp_t np = &bot->normals[i*3]; + vect_t n1; + vect_t n2; + fastf_t ang; + mat_t mat; + + VMOVE(n1, np); + VCROSS(n2, mirror_dir, n1); + VUNITIZE(n2); + ang = M_PI_2 - acos(VDOT(n1, mirror_dir)); + bn_mat_arb_rot(mat, origin, n2, ang*2); + MAT4X3VEC(np, mat, n1); + } + + break; + } + default: + { + rt_db_free_internal(&internal, resp); + bu_log("Unknown or unsupported object type (id==%d)\n", id); + bu_log("ERROR: cannot mirror object [%s]\n", from); + return DIR_NULL; + } + } + + /* save the mirrored object to disk */ + if ((dp = db_diradd(dbip, to, -1L, 0, dp->d_flags, (genptr_t)&internal.idb_type)) == DIR_NULL) { + bu_log("ERROR: Unable to add [%s] to the database directory", to); + return DIR_NULL; + } + if (rt_db_put_internal(dp, dbip, &internal, resp) < 0) { + bu_log("ERROR: Unable to store [%s] to the database", to); + return DIR_NULL; + } + + return dp; +} + + +/* + * 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...> - 2009-04-28 16:05:03
|
Revision: 34345 http://brlcad.svn.sourceforge.net/brlcad/?rev=34345&view=rev Author: brlcad Date: 2009-04-28 16:05:01 +0000 (Tue, 28 Apr 2009) Log Message: ----------- last last round of ifree updates, make sure everyone passes the second argument. Modified Paths: -------------- brlcad/trunk/src/librt/constraint.c brlcad/trunk/src/librt/db5_bin.c brlcad/trunk/src/librt/dir.c brlcad/trunk/src/librt/primitives/arbn/arbn.c brlcad/trunk/src/librt/primitives/ars/ars.c brlcad/trunk/src/librt/primitives/bot/bot.c Modified: brlcad/trunk/src/librt/constraint.c =================================================================== --- brlcad/trunk/src/librt/constraint.c 2009-04-28 15:57:14 UTC (rev 34344) +++ brlcad/trunk/src/librt/constraint.c 2009-04-28 16:05:01 UTC (rev 34345) @@ -50,7 +50,6 @@ * R T _ C O N S T R A I N T _ I F R E E * * Free the storage associated with the rt_db_internal version of constraint object. - * TODO: Rename to rt_constraint_ifree?? */ void rt_constraint_ifree( struct rt_db_internal *ip, struct resource *resp) Modified: brlcad/trunk/src/librt/db5_bin.c =================================================================== --- brlcad/trunk/src/librt/db5_bin.c 2009-04-28 15:57:14 UTC (rev 34344) +++ brlcad/trunk/src/librt/db5_bin.c 2009-04-28 16:05:01 UTC (rev 34345) @@ -498,11 +498,12 @@ * thing. */ void -rt_binunif_ifree( struct rt_db_internal *ip ) +rt_binunif_ifree( struct rt_db_internal *ip, struct resource *resp ) { 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/dir.c =================================================================== --- brlcad/trunk/src/librt/dir.c 2009-04-28 15:57:14 UTC (rev 34344) +++ brlcad/trunk/src/librt/dir.c 2009-04-28 16:05:01 UTC (rev 34345) @@ -243,8 +243,9 @@ { RT_CK_DB_INTERNAL( ip ); - /* meth is not required since may be asked to free something - * that was never set. + /* meth is not required since may be asked to free something that + * was never set. resp is not checked, since most ifree's don't + * use it (combinations use it). leave it up to ft_ifree to check */ if (ip->idb_meth) { RT_CK_FUNCTAB(ip->idb_meth); @@ -253,10 +254,7 @@ } } - /* resp is not checked, since most ifree's don't take/need it - * (only combinations use it) -- leave it up to ft_ifree to check it - */ - if ( ip->idb_ptr ) { + if ( ip->idb_ptr ) { ip->idb_ptr = NULL; /* sanity. Should be handled by INIT, below */ } if ( ip->idb_avs.magic == BU_AVS_MAGIC ) { Modified: brlcad/trunk/src/librt/primitives/arbn/arbn.c =================================================================== --- brlcad/trunk/src/librt/primitives/arbn/arbn.c 2009-04-28 15:57:14 UTC (rev 34344) +++ brlcad/trunk/src/librt/primitives/arbn/arbn.c 2009-04-28 16:05:01 UTC (rev 34345) @@ -43,9 +43,6 @@ #include "raytrace.h" -BU_EXTERN(void rt_arbn_print, (const struct soltab *stp) ); - - /** * R T _ A R B N _ P R E P * Modified: brlcad/trunk/src/librt/primitives/ars/ars.c =================================================================== --- brlcad/trunk/src/librt/primitives/ars/ars.c 2009-04-28 15:57:14 UTC (rev 34344) +++ brlcad/trunk/src/librt/primitives/ars/ars.c 2009-04-28 16:05:01 UTC (rev 34345) @@ -473,7 +473,7 @@ nmg_km( m ); return( -1 ); } - rt_ars_ifree( ip ); + rt_ars_ifree( ip, NULL ); s = BU_LIST_FIRST( shell, &r->s_hd ); bot = nmg_bot( s, &rtip->rti_tol ); @@ -495,7 +495,7 @@ ret = rt_bot_prep( stp, &intern, rtip ); - rt_bot_ifree( &intern ); + rt_bot_ifree( &intern, NULL ); return( ret ); #else @@ -608,7 +608,7 @@ rt_bot_prep_pieces(bot, stp, ntri, tol); - rt_ars_ifree( ip ); + rt_ars_ifree( ip, NULL ); return(0); /* OK */ Modified: brlcad/trunk/src/librt/primitives/bot/bot.c =================================================================== --- brlcad/trunk/src/librt/primitives/bot/bot.c 2009-04-28 15:57:14 UTC (rev 34344) +++ brlcad/trunk/src/librt/primitives/bot/bot.c 2009-04-28 16:05:01 UTC (rev 34345) @@ -1292,7 +1292,7 @@ } if ( free && op != ip ) { - rt_bot_ifree( ip ); + rt_bot_ifree( ip, NULL ); } return( 0 ); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ddr...@us...> - 2009-05-04 08:45:29
|
Revision: 34412 http://brlcad.svn.sourceforge.net/brlcad/?rev=34412&view=rev Author: ddreeves70 Date: 2009-05-04 08:45:27 +0000 (Mon, 04 May 2009) Log Message: ----------- Modified to use the GetClosestPoint function when I can but still needs more work Modified Paths: -------------- brlcad/trunk/src/librt/opennurbs_ext.cpp brlcad/trunk/src/librt/primitives/brep/brep.cpp Modified: brlcad/trunk/src/librt/opennurbs_ext.cpp =================================================================== --- brlcad/trunk/src/librt/opennurbs_ext.cpp 2009-05-04 00:16:16 UTC (rev 34411) +++ brlcad/trunk/src/librt/opennurbs_ext.cpp 2009-05-04 08:45:27 UTC (rev 34412) @@ -45,7 +45,7 @@ #define RANGE_LO 0.45 #define UNIVERSAL_SAMPLE_COUNT 1001 -#define BBOX_GROW 1e-1 +#define BBOX_GROW 1.0 namespace brlcad { Modified: brlcad/trunk/src/librt/primitives/brep/brep.cpp =================================================================== --- brlcad/trunk/src/librt/primitives/brep/brep.cpp 2009-05-04 00:16:16 UTC (rev 34411) +++ brlcad/trunk/src/librt/primitives/brep/brep.cpp 2009-05-04 08:45:27 UTC (rev 34412) @@ -242,7 +242,7 @@ * trimmed, we must account for it. */ bb->m_trimmed = false; // XXX - ack, hardcode for now - } + } } int @@ -797,6 +797,10 @@ continue; } // for each trim + ON_3dPoint closestPoint; + ON_3dVector tangent, kappa; + double currentDistance = -10000.0;; + ON_3dPoint hitPoint(uv.x, uv.y, 0.0); for( int lti = 0; lti < loop->TrimCount(); lti++ ) { const ON_BrepTrim* trim = loop->Trim( lti ); if (0 == trim ) @@ -805,43 +809,59 @@ if (trimCurve == 0) { continue; } + double closestT; - double currentDistance; - double shortestDistance; - double t; - ON_3dPoint hitPoint(uv.x, uv.y, 0.0); - ON_3dPoint closestPoint; - // trimCurve->GetClosestPoint(hitPoint, &closestT); This isn't working... - ON_Interval domain = trimCurve->Domain(); - double step = (domain.m_t[1]-domain.m_t[0])/(double)MAX_NUMBEROFPOINTS; - if (!curveApproximated[trim->m_c2i]) { - curveApproximated[trim->m_c2i] = true; - t = domain.m_t[0]; + bool gotClosest = trimCurve->GetClosestPoint(hitPoint, &closestT); + if (!gotClosest) { + // Someone needs to work on GetClosestPoint not to fail + // It is failing on nurbs curves that aren't rational + // For now if it fails we will use the approx. approach + double currentDistance; + double shortestDistance; + double t; + ON_Interval domain = trimCurve->Domain(); + double step = (domain.m_t[1] - domain.m_t[0]) / (double) MAX_NUMBEROFPOINTS; + if (!curveApproximated[trim->m_c2i]) { + curveApproximated[trim->m_c2i] = true; + t = domain.m_t[0]; + for (int i = 0; i < MAX_NUMBEROFPOINTS; i++) { + curveApproximations[trim->m_c2i][i] = trimCurve->PointAt(t); + t += step; + } + } + closestT = t = domain.m_t[0]; + closestPoint = curveApproximations[trim->m_c2i][0]; + currentDistance = shortestDistance = closestPoint.DistanceTo(hitPoint); for (int i = 0; i < MAX_NUMBEROFPOINTS; i++) { - curveApproximations[trim->m_c2i][i] = trimCurve->PointAt(t); + closestPoint = curveApproximations[trim->m_c2i][i]; + currentDistance = closestPoint.DistanceTo(hitPoint); + if (currentDistance < shortestDistance) { + closestT = t; + shortestDistance = currentDistance; + } t += step; } } - closestT = t = domain.m_t[0]; - closestPoint = curveApproximations[trim->m_c2i][0]; - currentDistance = shortestDistance = closestPoint.DistanceTo(hitPoint); - for (int i = 0; i < MAX_NUMBEROFPOINTS; i++) { - closestPoint = curveApproximations[trim->m_c2i][i]; - currentDistance = closestPoint.DistanceTo(hitPoint); - if (currentDistance < shortestDistance) { - closestT = t; - shortestDistance = currentDistance; - } - t += step; + ON_3dPoint testClosestPoint; + ON_3dVector testTangent, testKappa; + double testDistance; + trimCurve->EvCurvature(closestT, testClosestPoint, testTangent, testKappa); + testDistance = testClosestPoint.DistanceTo(hitPoint); + if ((currentDistance < 0.0) || (testDistance < currentDistance)) + { + closestPoint = testClosestPoint; + tangent = testTangent; + kappa = testKappa; + currentDistance = testDistance; } - ON_3dVector tangent, kappa; - trimCurve->EvCurvature(closestT, closestPoint, tangent, kappa); + } + if (currentDistance >= 0.0) + { ON_3dVector hitDirection(hitPoint.x-closestPoint.x, hitPoint.y-closestPoint.y, hitPoint.z-closestPoint.z); - ON_3dVector normal = ON_CrossProduct(tangent, kappa); double dot = (hitDirection * kappa); //printf("closestT=%lf dot=%lf closestPoint=(%lf, %lf, %lf) hitPoint=(%lf, %lf, %lf) tangent=(%lf, %lf, %lf) kappa=(%lf, %lf, %lf) normal=(%lf, %lf, %lf) hitDirection=(%lf, %lf, %lf)\n", closestT, dot, closestPoint.x, closestPoint.y, closestPoint.z, hitPoint.x, hitPoint.y, hitPoint.z, tangent.x, tangent.y, tangent.z, kappa.x, kappa.y, kappa.z, normal.x, normal.y, normal.z, hitDirection.x, hitDirection.y, hitDirection.z); if (((li == 0) && (dot < 0.0)) || - ((li > 0) && (dot > 0.0))) { + ((li > 0) && (dot > 0.0))) { return true; } } @@ -1397,7 +1417,7 @@ TRACE1("rt_brep_plot"); struct rt_brep_internal* bi; int i, j, k; - + RT_CK_DB_INTERNAL(ip); bi = (struct rt_brep_internal*)ip->idb_ptr; RT_BREP_CK_MAGIC(bi); @@ -1470,7 +1490,7 @@ /* Routine to iterate over the surfaces in the BREP and plot lines corresponding * to their projections into 3-space. Very crude walk method - doesn't properly - * handle drawing in the case of trims - but it illustrates how to go straight + * handle drawing in the case of trims - but it illustrates how to go straight * from uv parameter space to real space coordinates. * Needs to become proper tesselation routine. */ @@ -1497,7 +1517,7 @@ } } } - } + } */ return 0; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <br...@us...> - 2009-05-06 00:00:19
|
Revision: 34424 http://brlcad.svn.sourceforge.net/brlcad/?rev=34424&view=rev Author: brlcad Date: 2009-05-06 00:00:07 +0000 (Wed, 06 May 2009) Log Message: ----------- break out a tor_mirror() routine using the logic nearly identical to what is happening now in rt_mirror() with the exception of using a plane_t instead of pt+dir (so we still reconstruct pt+dir for now). first step towards a new primitive rt_###_mirror() callback on all primitives that takes an rt_db_internal and a plane to mirror across. Modified Paths: -------------- brlcad/trunk/src/librt/Makefile.am Added Paths: ----------- brlcad/trunk/src/librt/primitives/tor/tor_mirror.c Modified: brlcad/trunk/src/librt/Makefile.am =================================================================== --- brlcad/trunk/src/librt/Makefile.am 2009-05-05 23:55:38 UTC (rev 34423) +++ brlcad/trunk/src/librt/Makefile.am 2009-05-06 00:00:07 UTC (rev 34424) @@ -153,6 +153,7 @@ primitives/table.c \ primitives/tgc/tgc.c \ primitives/tor/tor.c \ + primitives/tor/tor_mirror.c \ primitives/vol/vol.c \ regionfix.c \ roots.c \ Added: brlcad/trunk/src/librt/primitives/tor/tor_mirror.c =================================================================== --- brlcad/trunk/src/librt/primitives/tor/tor_mirror.c (rev 0) +++ brlcad/trunk/src/librt/primitives/tor/tor_mirror.c 2009-05-06 00:00:07 UTC (rev 34424) @@ -0,0 +1,112 @@ +/* T O R _ M I R R O R . C + * BRL-CAD + * + * Copyright (c) 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. + */ +/** @file tor_mirror.c + * + * mirror support + * + */ + +#include "common.h" + +#include "raytrace.h" +#include "rtgeom.h" + + +/** + * R T _ T O R _ 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_tor_mirror(struct rt_db_internal *ip, register const plane_t *plane) +{ + struct rt_tor_internal *tor; + + fastf_t ang; + mat_t mat; + mat_t mirmat; + mat_t rmat; + mat_t temp; + vect_t mirror_dir; + point_t mirror_pt; + point_t pt; + vect_t h; + vect_t n; + vect_t nvec; + vect_t xvec; + + static fastf_t tol_dist_sq = 0.005 * 0.005; + static point_t origin = {0.0, 0.0, 0.0}; + + RT_CK_DB_INTERNAL(ip); + + tor = (struct rt_tor_internal *)ip->idb_ptr; + RT_TOR_CK_MAGIC(tor); + + 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]; + + VMOVE(pt, tor->v); + MAT4X3PNT(tor->v, mirmat, pt); + + VMOVE(h, tor->h); + VUNITIZE(h); + + VCROSS(n, mirror_dir, tor->h); + VUNITIZE(n); + ang = M_PI_2 - acos(VDOT(h, mirror_dir)); + bn_mat_arb_rot(mat, origin, n, ang*2); + MAT4X3VEC(tor->h, mat, h); + + 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/primitives/tor/tor_mirror.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: <br...@us...> - 2009-05-12 15:23:10
|
Revision: 34513 http://brlcad.svn.sourceforge.net/brlcad/?rev=34513&view=rev Author: brlcad Date: 2009-05-12 15:23:00 +0000 (Tue, 12 May 2009) Log Message: ----------- allow null a_hit/a_miss callbacks in the application structure so that the caller doesn't have to provide empty/stubbed callback functions just to prevent a crash. Modified Paths: -------------- brlcad/trunk/src/librt/bundle.c brlcad/trunk/src/librt/shoot.c brlcad/trunk/src/librt/vshoot.c Modified: brlcad/trunk/src/librt/bundle.c =================================================================== --- brlcad/trunk/src/librt/bundle.c 2009-05-12 14:23:48 UTC (rev 34512) +++ brlcad/trunk/src/librt/bundle.c 2009-05-12 15:23:00 UTC (rev 34513) @@ -250,7 +250,10 @@ if ( !rt_in_rpp( &ap->a_ray, ss.inv_dir, rtip->mdl_min, rtip->mdl_max ) || ap->a_ray.r_max < 0.0 ) { resp->re_nmiss_model++; - ap->a_return = ap->a_miss( ap ); + if (ap->a_miss) + ap->a_return = ap->a_miss( ap ); + else + ap->a_return = 0; status = "MISS model"; goto out; } @@ -449,7 +452,10 @@ /* finished_segs chain now has all segments hit by this ray */ if ( BU_LIST_IS_EMPTY( &(finished_segs.l) ) ) { - ap->a_return = ap->a_miss( ap ); + if (ap->a_miss) + ap->a_return = ap->a_miss( ap ); + else + ap->a_return = 0; status = "MISS primitives"; goto out; } @@ -463,7 +469,10 @@ regionbits, ap, solidbits); if ( FinalPart.pt_forw == &FinalPart ) { - ap->a_return = ap->a_miss( ap ); + if (ap->a_miss) + ap->a_return = ap->a_miss( ap ); + else + ap->a_return = 0; status = "MISS bool"; RT_FREE_PT_LIST( &InitialPart, resp ); RT_FREE_SEG_LIST( &finished_segs, resp ); @@ -497,7 +506,10 @@ * which don't follow the traditional solid modeling paradigm. */ if (RT_G_DEBUG&DEBUG_ALLHITS) rt_pr_partitions(rtip, &FinalPart, "Parition list passed to a_hit() routine"); - ap->a_return = ap->a_hit( ap, &FinalPart, &finished_segs ); + if (ap->a_hit) + ap->a_return = ap->a_hit( ap, &FinalPart, &finished_segs ); + else + ap->a_return = 0; status = "HIT"; RT_FREE_SEG_LIST( &finished_segs, resp ); Modified: brlcad/trunk/src/librt/shoot.c =================================================================== --- brlcad/trunk/src/librt/shoot.c 2009-05-12 14:23:48 UTC (rev 34512) +++ brlcad/trunk/src/librt/shoot.c 2009-05-12 15:23:00 UTC (rev 34513) @@ -1117,7 +1117,10 @@ goto start_cell; } resp->re_nmiss_model++; - ap->a_return = ap->a_miss( ap ); + if (ap->a_miss) + ap->a_return = ap->a_miss( ap ); + else + ap->a_return = 0; status = "MISS model"; goto out; } @@ -1512,7 +1515,10 @@ /* finished_segs chain now has all segments hit by this ray */ if ( BU_LIST_IS_EMPTY( &(finished_segs.l) ) ) { - ap->a_return = ap->a_miss( ap ); + if (ap->a_miss) + ap->a_return = ap->a_miss( ap ); + else + ap->a_return = 0; status = "MISS primitives"; goto out; } @@ -1526,7 +1532,10 @@ regionbits, ap, solidbits); if ( FinalPart.pt_forw == &FinalPart ) { - ap->a_return = ap->a_miss( ap ); + if (ap->a_miss) + ap->a_return = ap->a_miss( ap ); + else + ap->a_return = 0; status = "MISS bool"; RT_FREE_PT_LIST( &InitialPart, resp ); RT_FREE_SEG_LIST( &finished_segs, resp ); Modified: brlcad/trunk/src/librt/vshoot.c =================================================================== --- brlcad/trunk/src/librt/vshoot.c 2009-05-12 14:23:48 UTC (rev 34512) +++ brlcad/trunk/src/librt/vshoot.c 2009-05-12 15:23:00 UTC (rev 34513) @@ -172,7 +172,10 @@ if ( !rt_in_rpp( &ap->a_ray, inv_dir, rtip->mdl_min, rtip->mdl_max ) || ap->a_ray.r_max < 0.0 ) { rtip->nmiss_model++; - ret = ap->a_miss( ap ); + if (ap->a_miss) + ret = ap->a_miss( ap ); + else + ret = 0; status = "MISS model"; goto out; } @@ -242,7 +245,10 @@ * Ray has finally left known space. */ if ( InitialPart.pt_forw == &InitialPart ) { - ret = ap->a_miss( ap ); + if (ap->a_miss) + ret = ap->a_miss( ap ); + else + ret = 0; status = "MISSed all primitives"; goto freeup; } @@ -256,7 +262,10 @@ regionbits, ap); if ( FinalPart.pt_forw == &FinalPart ) { - ret = ap->a_miss( ap ); + if (ap->a_miss) + ret = ap->a_miss( ap ); + else + ret = 0; status = "MISS bool"; goto freeup; } @@ -276,7 +285,10 @@ hitit: if (RT_G_DEBUG&DEBUG_SHOOT) rt_pr_partitions(rtip, &FinalPart, "a_hit()"); - ret = ap->a_hit( ap, &FinalPart ); + if (ap->a_hit) + ret = ap->a_hit( ap, &FinalPart ); + else + ret = 0; status = "HIT"; /* This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <br...@us...> - 2009-05-20 21:31:51
|
Revision: 34573 http://brlcad.svn.sourceforge.net/brlcad/?rev=34573&view=rev Author: brlcad Date: 2009-05-20 21:31:45 +0000 (Wed, 20 May 2009) Log Message: ----------- separate out the tgc mirroring for the guts to rt_tgc_mirror() Modified Paths: -------------- brlcad/trunk/src/librt/Makefile.am Added Paths: ----------- brlcad/trunk/src/librt/primitives/tgc/tgc_mirror.c Modified: brlcad/trunk/src/librt/Makefile.am =================================================================== --- brlcad/trunk/src/librt/Makefile.am 2009-05-20 21:09:18 UTC (rev 34572) +++ brlcad/trunk/src/librt/Makefile.am 2009-05-20 21:31:45 UTC (rev 34573) @@ -152,6 +152,7 @@ primitives/superell/superell.c \ primitives/table.c \ primitives/tgc/tgc.c \ + primitives/tgc/tgc_mirror.c \ primitives/tor/tor.c \ primitives/tor/tor_mirror.c \ primitives/vol/vol.c \ Added: brlcad/trunk/src/librt/primitives/tgc/tgc_mirror.c =================================================================== --- brlcad/trunk/src/librt/primitives/tgc/tgc_mirror.c (rev 0) +++ brlcad/trunk/src/librt/primitives/tgc/tgc_mirror.c 2009-05-20 21:31:45 UTC (rev 34573) @@ -0,0 +1,134 @@ +/* T G C _ M I R R O R . C + * BRL-CAD + * + * Copyright (c) 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. + */ +/** @file tgc_mirror.c + * + * mirror support + * + */ + +#include "common.h" + +#include "raytrace.h" +#include "rtgeom.h" + + +/** + * R T _ T G C _ 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_tgc_mirror(struct rt_db_internal *ip, register const plane_t *plane) +{ + struct rt_tgc_internal *tgc; + + fastf_t ang; + mat_t mat; + mat_t mirmat; + mat_t rmat; + mat_t temp; + vect_t mirror_dir; + point_t mirror_pt; + point_t pt; + vect_t h; + vect_t a, b, c, d; + vect_t n; + vect_t nvec; + vect_t xvec; + + static point_t origin = {0.0, 0.0, 0.0}; + + RT_CK_DB_INTERNAL(ip); + + tgc = (struct rt_tgc_internal *)ip->idb_ptr; + RT_TGC_CK_MAGIC(tgc); + + 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]; + + VMOVE(pt, tgc->v); + MAT4X3PNT(tgc->v, mirmat, pt); + + VMOVE(h, tgc->h); + VUNITIZE(h); + VCROSS(n, mirror_dir, tgc->h); + VUNITIZE(n); + ang = M_PI_2 - acos(VDOT(h, mirror_dir)); + bn_mat_arb_rot(mat, origin, n, ang*2); + VMOVE(h, tgc->h); + MAT4X3VEC(tgc->h, mat, h); + + VMOVE(a, tgc->a); + VUNITIZE(a); + VCROSS(n, mirror_dir, tgc->a); + VUNITIZE(n); + ang = M_PI_2 - acos(VDOT(a, mirror_dir)); + bn_mat_arb_rot(mat, origin, n, ang*2); + VMOVE(a, tgc->a); + MAT4X3VEC(tgc->a, mat, a); + VMOVE(c, tgc->c); + MAT4X3VEC(tgc->c, mat, c); + + VMOVE(b, tgc->b); + VUNITIZE(b); + VCROSS(n, mirror_dir, tgc->b); + VUNITIZE(n); + ang = M_PI_2 - acos(VDOT(b, mirror_dir)); + bn_mat_arb_rot(mat, origin, n, ang*2); + VMOVE(b, tgc->b); + MAT4X3VEC(tgc->b, mat, b); + VMOVE(d, tgc->d); + MAT4X3VEC(tgc->d, mat, d); + + 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/primitives/tgc/tgc_mirror.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: <br...@us...> - 2009-05-21 19:05:54
|
Revision: 34579 http://brlcad.svn.sourceforge.net/brlcad/?rev=34579&view=rev Author: brlcad Date: 2009-05-21 19:05:48 +0000 (Thu, 21 May 2009) Log Message: ----------- separate out and define rt_ell_mirror() Modified Paths: -------------- brlcad/trunk/src/librt/CMakeLists.txt brlcad/trunk/src/librt/Makefile.am brlcad/trunk/src/librt/primitives/mirror.c brlcad/trunk/src/librt/primitives/tgc/tgc_mirror.c brlcad/trunk/src/librt/primitives/tor/tor_mirror.c Added Paths: ----------- brlcad/trunk/src/librt/primitives/ell/ell_mirror.c Modified: brlcad/trunk/src/librt/CMakeLists.txt =================================================================== --- brlcad/trunk/src/librt/CMakeLists.txt 2009-05-21 19:00:08 UTC (rev 34578) +++ brlcad/trunk/src/librt/CMakeLists.txt 2009-05-21 19:05:48 UTC (rev 34579) @@ -74,6 +74,7 @@ primitives/ebm/ebm.c primitives/ehy/ehy.c primitives/ell/ell.c + primitives/ell/ell_mirror.c primitives/epa/epa.c primitives/eto/eto.c primitives/extrude/extrude.c @@ -121,6 +122,7 @@ primitives/superell/superell.c primitives/table.c primitives/tgc/tgc.c + primitives/tgc/tgc_mirror.c primitives/tor/tor.c primitives/tor/tor_mirror.c primitives/vol/vol.c Modified: brlcad/trunk/src/librt/Makefile.am =================================================================== --- brlcad/trunk/src/librt/Makefile.am 2009-05-21 19:00:08 UTC (rev 34578) +++ brlcad/trunk/src/librt/Makefile.am 2009-05-21 19:05:48 UTC (rev 34579) @@ -105,6 +105,7 @@ primitives/ebm/ebm.c \ primitives/ehy/ehy.c \ primitives/ell/ell.c \ + primitives/ell/ell_mirror.c \ primitives/epa/epa.c \ primitives/eto/eto.c \ primitives/extrude/extrude.c \ Added: brlcad/trunk/src/librt/primitives/ell/ell_mirror.c =================================================================== --- brlcad/trunk/src/librt/primitives/ell/ell_mirror.c (rev 0) +++ brlcad/trunk/src/librt/primitives/ell/ell_mirror.c 2009-05-21 19:05:48 UTC (rev 34579) @@ -0,0 +1,130 @@ +/* E L L _ M I R R O R . C + * BRL-CAD + * + * Copyright (c) 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. + */ +/** @file ell_mirror.c + * + * mirror support + * + */ + +#include "common.h" + +#include "raytrace.h" +#include "rtgeom.h" + + +/** + * R T _ E L L _ 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_ell_mirror(struct rt_db_internal *ip, register const plane_t *plane) +{ + struct rt_ell_internal *ell; + + mat_t mat; + mat_t mirmat; + mat_t rmat; + mat_t temp; + vect_t nvec; + vect_t xvec; + vect_t mirror_dir; + point_t mirror_pt; + + point_t pt; + fastf_t ang; + vect_t a, b, c; + vect_t n; + + static point_t origin = {0.0, 0.0, 0.0}; + + RT_CK_DB_INTERNAL(ip); + + ell = (struct rt_ell_internal *)ip->idb_ptr; + RT_ELL_CK_MAGIC(ell); + + 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]; + + VMOVE(pt, ell->v); + MAT4X3PNT(ell->v, mirmat, pt); + + VMOVE(a, ell->a); + VUNITIZE(a); + VCROSS(n, mirror_dir, ell->a); + VUNITIZE(n); + ang = M_PI_2 - acos(VDOT(a, mirror_dir)); + bn_mat_arb_rot(mat, origin, n, ang*2); + VMOVE(a, ell->a); + MAT4X3VEC(ell->a, mat, a); + + VMOVE(b, ell->b); + VUNITIZE(b); + VCROSS(n, mirror_dir, ell->b); + VUNITIZE(n); + ang = M_PI_2 - acos(VDOT(b, mirror_dir)); + bn_mat_arb_rot(mat, origin, n, ang*2); + VMOVE(b, ell->b); + MAT4X3VEC(ell->b, mat, b); + + VMOVE(c, ell->c); + VUNITIZE(c); + VCROSS(n, mirror_dir, ell->c); + VUNITIZE(n); + ang = M_PI_2 - acos(VDOT(c, mirror_dir)); + bn_mat_arb_rot(mat, origin, n, ang*2); + VMOVE(c, ell->c); + MAT4X3VEC(ell->c, mat, c); + + 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/primitives/ell/ell_mirror.c ___________________________________________________________________ Added: svn:mime-type + text/plain Added: svn:eol-style + native Modified: brlcad/trunk/src/librt/primitives/mirror.c =================================================================== --- brlcad/trunk/src/librt/primitives/mirror.c 2009-05-21 19:00:08 UTC (rev 34578) +++ brlcad/trunk/src/librt/primitives/mirror.c 2009-05-21 19:05:48 UTC (rev 34579) @@ -115,12 +115,12 @@ err = rt_tgc_mirror(ip, plane); return err ? NULL : ip; } -#if 0 case ID_ELL: case ID_SPH: { err = rt_ell_mirror(ip, plane); return err ? NULL : ip; } +#if 0 case ID_ARB8: { err = rt_arb8_mirror(ip, plane); return err ? NULL : ip; @@ -235,50 +235,6 @@ mirmat[3 + Z*4] += 2.0 * mirror_pt[Z] * mirror_dir[Z]; switch (id) { - case ID_ELL: - case ID_SPH: { - struct rt_ell_internal *ell; - point_t pt; - vect_t a, b, c; - vect_t n; - fastf_t ang; - mat_t mat; - - ell = (struct rt_ell_internal *)ip->idb_ptr; - RT_ELL_CK_MAGIC(ell); - - VMOVE(pt, ell->v); - MAT4X3PNT(ell->v, mirmat, pt); - - VMOVE(a, ell->a); - VUNITIZE(a); - VCROSS(n, mirror_dir, ell->a); - VUNITIZE(n); - ang = M_PI_2 - acos(VDOT(a, mirror_dir)); - bn_mat_arb_rot(mat, origin, n, ang*2); - VMOVE(a, ell->a); - MAT4X3VEC(ell->a, mat, a); - - VMOVE(b, ell->b); - VUNITIZE(b); - VCROSS(n, mirror_dir, ell->b); - VUNITIZE(n); - ang = M_PI_2 - acos(VDOT(b, mirror_dir)); - bn_mat_arb_rot(mat, origin, n, ang*2); - VMOVE(b, ell->b); - MAT4X3VEC(ell->b, mat, b); - - VMOVE(c, ell->c); - VUNITIZE(c); - VCROSS(n, mirror_dir, ell->c); - VUNITIZE(n); - ang = M_PI_2 - acos(VDOT(c, mirror_dir)); - bn_mat_arb_rot(mat, origin, n, ang*2); - VMOVE(c, ell->c); - MAT4X3VEC(ell->c, mat, c); - - break; - } case ID_ARB8: { struct rt_arb_internal *arb; Modified: brlcad/trunk/src/librt/primitives/tgc/tgc_mirror.c =================================================================== --- brlcad/trunk/src/librt/primitives/tgc/tgc_mirror.c 2009-05-21 19:00:08 UTC (rev 34578) +++ brlcad/trunk/src/librt/primitives/tgc/tgc_mirror.c 2009-05-21 19:05:48 UTC (rev 34579) @@ -40,19 +40,20 @@ { struct rt_tgc_internal *tgc; - fastf_t ang; mat_t mat; mat_t mirmat; mat_t rmat; mat_t temp; + vect_t nvec; + vect_t xvec; vect_t mirror_dir; point_t mirror_pt; + point_t pt; + fastf_t ang; vect_t h; vect_t a, b, c, d; vect_t n; - vect_t nvec; - vect_t xvec; static point_t origin = {0.0, 0.0, 0.0}; Modified: brlcad/trunk/src/librt/primitives/tor/tor_mirror.c =================================================================== --- brlcad/trunk/src/librt/primitives/tor/tor_mirror.c 2009-05-21 19:00:08 UTC (rev 34578) +++ brlcad/trunk/src/librt/primitives/tor/tor_mirror.c 2009-05-21 19:05:48 UTC (rev 34579) @@ -40,18 +40,19 @@ { struct rt_tor_internal *tor; - fastf_t ang; mat_t mat; mat_t mirmat; mat_t rmat; mat_t temp; + vect_t nvec; + vect_t xvec; vect_t mirror_dir; point_t mirror_pt; + point_t pt; + fastf_t ang; vect_t h; vect_t n; - vect_t nvec; - vect_t xvec; static point_t origin = {0.0, 0.0, 0.0}; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ind...@us...> - 2009-06-08 16:57:04
|
Revision: 34698 http://brlcad.svn.sourceforge.net/brlcad/?rev=34698&view=rev Author: indianlarry Date: 2009-06-08 16:56:50 +0000 (Mon, 08 Jun 2009) Log Message: ----------- current NURB rt code snapshot for starseeker to test Modified Paths: -------------- brlcad/trunk/src/librt/opennurbs_ext.cpp brlcad/trunk/src/librt/primitives/brep/brep.cpp Modified: brlcad/trunk/src/librt/opennurbs_ext.cpp =================================================================== --- brlcad/trunk/src/librt/opennurbs_ext.cpp 2009-06-08 15:04:58 UTC (rev 34697) +++ brlcad/trunk/src/librt/opennurbs_ext.cpp 2009-06-08 16:56:50 UTC (rev 34698) @@ -85,7 +85,7 @@ } else { TRACE("need to subdivide"); // divide on param interval -//#define KTANGENTBREAK +#define KTANGENTBREAK #ifdef KTANGENTBREAK int knotcnt = trimCurve->SpanCount(); double *knots = new double[knotcnt+1]; @@ -267,13 +267,21 @@ bool slopex,slopex_changed; bool slopey,slopey_changed; bool slope_changed; + fastf_t xdelta,ydelta; p1 = curve->PointAt(t[0]); p2 = curve->PointAt(t[1]); - slopex = ((p2[X] - p1[X]) < 0.0); - slopey = ((p2[Y] - p1[Y]) < 0.0); + xdelta = (p2[X] - p1[X]); + slopex = (xdelta < 0.0); + ydelta = (p2[Y] - p1[Y]); + slopey = (ydelta < 0.0); + if ( NEAR_ZERO(xdelta, 0.000001) || + NEAR_ZERO(ydelta, 0.000001)) { + return true; + } + slopex_changed = (slopex != tanx1); slopey_changed = (slopey != tany1); Modified: brlcad/trunk/src/librt/primitives/brep/brep.cpp =================================================================== --- brlcad/trunk/src/librt/primitives/brep/brep.cpp 2009-06-08 15:04:58 UTC (rev 34697) +++ brlcad/trunk/src/librt/primitives/brep/brep.cpp 2009-06-08 16:56:50 UTC (rev 34698) @@ -544,13 +544,26 @@ bool tanx1,tanx2,tanx_changed; bool tany1,tany2,tany_changed; bool tan_changed; + for(int i=0;i<=knotcnt;i++) { + point_t p; + + p1 = trimCurve->PointAt(knots[i]); + if (i == 0) { + M_COLOR_PLOT( RED ); + } else if (i == knotcnt) { + M_COLOR_PLOT( GREEN ); + } else { + M_COLOR_PLOT( YELLOW ); + } + VMOVE(p,p1); + M_PT_PLOT(p); + } +#if 0 for(int i=1;i<=knotcnt;i++) { list<double> splitlist; ON_Interval t(knots[i-1],knots[i]); -// tangent1 = trimCurve->TangentAt(knots[i-1]); -// tangent2 = trimCurve->TangentAt(knots[i]); - split_trims_hv_tangent(trimCurve,t,splitlist); + //split_trims_hv_tangent(trimCurve,t,splitlist); for( list<double>::iterator l=splitlist.begin();l != splitlist.end();l++) { double x = *l; point_t p; @@ -560,73 +573,13 @@ VMOVE(p,p1); M_PT_PLOT(p); } -/* tanx1 = (tangent1[X] < 0.0); - tanx2 = (tangent2[X] < 0.0); - tany1 = (tangent1[Y] < 0.0); - tany2 = (tangent2[Y] < 0.0); - - tanx_changed =(tanx1 != tanx2); - tany_changed =(tany1 != tany2); - - tan_changed = tanx_changed || tany_changed; - - if ( tan_changed ) { - if (tanx_changed && tany_changed) {//horz & vert simply split - M_COLOR_PLOT( RED ); - } else if (tanx_changed) {//find horz - M_COLOR_PLOT( YELLOW ); - } else { //find vert - M_COLOR_PLOT( MAGENTA ); - } - } else { // check point slope for change - bool slopex,slopex_changed; - bool slopey,slopey_changed; - bool slope_changed; - - p1 = trimCurve->PointAt(knots[i-1]); - p2 = trimCurve->PointAt(knots[i]); - - slopex = ((p2[X] - p1[X]) < 0.0); - slopey = ((p2[Y] - p1[Y]) < 0.0); - - slopex_changed = (slopex != tanx1); - slopey_changed = (slopey != tany1); - - slope_changed = slopex_changed || slopey_changed; - - if (slope_changed) { //2 horz or 2 vert changes simply split - M_COLOR_PLOT( BLUE ); - } else { - M_COLOR_PLOT( DARKGREEN ); - } - } - //plot color coded segment - plottrim(*trimCurve,knots[i-1],knots[i]); - - //plot knots - if (i == 0) { - COLOR_PLOT( 255, 0, 0 ); - } else if (i == knotcnt) { - COLOR_PLOT( 255, 0, 255 ); - } else { - COLOR_PLOT( 0, 255, 0 ); - } - p1 = trimCurve->PointAt(knots[i]); - VADD2(p2, p1, grow); - VSUB2(p3, p1, grow); - BB_PLOT(p2,p3); - LINE_PLOT(p2,p3); - grow[X]=grow[X]*-1.0; - VADD2(p2, p1, grow); - VSUB2(p3, p1, grow); - LINE_PLOT(p2,p3); -*/ } for(int i=0;i<=knotcnt;i++) { p1 = trimCurve->PointAt(knots[i]); M_COLOR_PLOT(HOTPINK); M_PT_PLOT(p1); } +#endif /* while ( trimCurve->GetNextDiscontinuity( ON::G2_continuous, @@ -752,7 +705,7 @@ brep_bvh_subdivide(bs->bvh, surface_trees); } #ifdef KPLOT // debugging hacks to look at specific faces - //(void)fclose(plot_file()); + (void)fclose(plot_file()); #endif return 0; } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ind...@us...> - 2009-06-10 20:05:58
|
Revision: 34709 http://brlcad.svn.sourceforge.net/brlcad/?rev=34709&view=rev Author: indianlarry Date: 2009-06-10 20:05:56 +0000 (Wed, 10 Jun 2009) Log Message: ----------- testing four corner newton iterate, should only be need for high obliq but currently enabled for debugging so slows raytrace down by atleast 4x ;^) Modified Paths: -------------- brlcad/trunk/src/librt/opennurbs_ext.cpp brlcad/trunk/src/librt/primitives/brep/brep.cpp Modified: brlcad/trunk/src/librt/opennurbs_ext.cpp =================================================================== --- brlcad/trunk/src/librt/opennurbs_ext.cpp 2009-06-10 06:46:34 UTC (rev 34708) +++ brlcad/trunk/src/librt/opennurbs_ext.cpp 2009-06-10 20:05:56 UTC (rev 34709) @@ -87,6 +87,7 @@ // divide on param interval #define KTANGENTBREAK #ifdef KTANGENTBREAK + if (!trimCurve->IsLinear()) { int knotcnt = trimCurve->SpanCount(); double *knots = new double[knotcnt+1]; trimCurve->GetSpanVector(knots); @@ -102,6 +103,7 @@ min = xmax; } } + } #endif m_root->addChild(subdivideCurve(trimCurve,min,max,innerLoop,0)); } Modified: brlcad/trunk/src/librt/primitives/brep/brep.cpp =================================================================== --- brlcad/trunk/src/librt/primitives/brep/brep.cpp 2009-06-10 06:46:34 UTC (rev 34708) +++ brlcad/trunk/src/librt/primitives/brep/brep.cpp 2009-06-10 20:05:56 UTC (rev 34709) @@ -93,6 +93,8 @@ /* FIXME: fugly */ static int hit_count = 0; +//debugging +static int icount = 0; /******************************************************************************** * Auxiliary functions @@ -216,6 +218,19 @@ } return plot; } +static FILE* +plot_file(const char *pname) +{ + if (plot != NULL) + (void)fclose(plot_file()); + plot = fopen(pname,"w"); + point_t min, max; + VSET(min,-2048,-2048,-2048); + VSET(max, 2048, 2048, 2048); + pdv_3space(plot, min, max); + + return plot; +} #define BLUEVIOLET 138,43,226 #define CADETBLUE 95,159,159 @@ -294,7 +309,71 @@ } return; } +void plotleaf3d(SubsurfaceBBNode* bb) { + double min[3],max[3]; + double u,v; + if (bb->m_trimmed) { + COLOR_PLOT(255, 0, 0); + } else if (bb->m_checkTrim) { + COLOR_PLOT(0, 0, 255); + } else { + COLOR_PLOT(255, 0, 255); + } + + if (true) { + bb->GetBBox(min,max); + } else { + VSET(min,bb->m_u[0]+0.001,bb->m_v[0]+0.001,0.0); + VSET(max,bb->m_u[1]-0.001,bb->m_v[1]-0.001,0.0); + } + BB_PLOT(min,max); + + M_COLOR_PLOT(YELLOW); + bool start=true; + point_t a,b; + ON_3dPoint p; + const ON_BrepFace* f = bb->m_face; + const ON_Surface* surf = f->SurfaceOf(); + for(u=bb->m_u[0];u<=bb->m_u[1];u=u+(bb->m_u[1] - bb->m_u[0])/100) { + for(v=bb->m_v[0];v<=bb->m_v[1];v=v+(bb->m_v[1] - bb->m_v[0])/100) { + if (start) { + start=false; + p = surf->PointAt(u,v); + VMOVE(b,p); + } else { + VMOVE(a,b); + p = surf->PointAt(u,v); + VMOVE(b,p); + LINE_PLOT(a,b); + } + } + } + + return; +} +void plotleafuv(SubsurfaceBBNode* bb) { + double min[3],max[3]; + + if (bb->m_trimmed) { + COLOR_PLOT(255, 0, 0); + } else if (bb->m_checkTrim) { + COLOR_PLOT(0, 0, 255); + } else { + COLOR_PLOT(255, 0, 255); + } + + if (false) { + bb->GetBBox(min,max); + } else { + VSET(min,bb->m_u[0]+0.001,bb->m_v[0]+0.001,0.0); + VSET(max,bb->m_u[1]-0.001,bb->m_v[1]-0.001,0.0); + } + BB_PLOT(min,max); + + return; +} + void plottrim(ON_BrepFace &face ) { const ON_Surface* surf = face.SurfaceOf(); double umin, umax; @@ -1051,6 +1130,9 @@ p1 = ON_3dVector(rdy, -rdx, 0); else p1 = ON_3dVector(0, rdz, -rdy); + // keith test + p1.Unitize(); + //keith p2 = ON_CrossProduct(p1, rdir); p1d = -(p1 * ro); @@ -1087,8 +1169,189 @@ } + +int +utah_newton_4corner_solver(const SubsurfaceBBNode* sbv, const ON_Surface* surf, const ON_Ray& r, ON_2dPoint* ouv, double* t, ON_3dVector* N, bool& converged) +{ + int i; + int intersects = 0; + double j11, j12, j21, j22; + double f, g; + double rootdist, oldrootdist; + double J, invdetJ; + double du,dv; + + ON_3dVector p1, p2; + double p1d = 0, p2d = 0; + converged = false; + utah_ray_planes(r, p1, p1d, p2, p2d); + + ON_3dPoint S; + ON_3dVector Su, Sv; + ON_2dPoint uv; + + for( int iu = 0; iu < 2; iu++) { + for( int iv = 0; iv < 2; iv++) { + + uv.x = sbv->m_u[iu]; + uv.y = sbv->m_v[iv]; + + ON_2dPoint uv0(uv); + surf->Ev1Der(uv.x, uv.y, S, Su, Sv); + + utah_F(S, p1, p1d, p2, p2d, f, g); + rootdist = fabs(f) + fabs(g); + + for (i = 0; i < BREP_MAX_ITERATIONS; i++) { + utah_Fu(Su, p1, p2, j11, j21); + utah_Fv(Sv, p1, p2, j12, j22); + + J = (j11 * j22 - j12 * j21); + + if (NEAR_ZERO(J, BREP_INTERSECTION_ROOT_EPSILON)) { + // perform jittered perturbation in parametric domain.... + uv.x = uv.x + .1 * drand48() * (uv0.x - uv.x); + uv.y = uv.y + .1 * drand48() * (uv0.y - uv.y); + continue; + } + + invdetJ = 1. / J; + + + du = -invdetJ * (j22 * f - j12 * g); + dv = -invdetJ * (j11 * g - j21 * f); + + + if ( i == 0 ) { + if (((iu == 0) && (du < 0.0)) || + ((iu==1) && (du > 0.0))) + break; //head out of U bounds + if (((iv == 0) && (dv < 0.0)) || + ((iv==1) && (dv > 0.0))) + break; //head out of V bounds + } + + + uv.x -= invdetJ * (j22 * f - j12 * g); + uv.y -= invdetJ * (j11 * g - j21 * f); + + utah_pushBack(surf, uv); + + surf->Ev1Der(uv.x, uv.y, S, Su, Sv); + utah_F(S, p1, p1d, p2, p2d, f, g); + oldrootdist = rootdist; + rootdist = fabs(f) + fabs(g); + + if (oldrootdist < rootdist) break; + + if (rootdist < ROOT_TOL) { + if (sbv->m_u.Includes(uv.x) && sbv->m_v.Includes(uv.y)) { + bool new_point = true; + for(int j=0;j<intersects;j++) { + if (NEAR_ZERO(uv.x - ouv[j].x, 0.0001) && NEAR_ZERO(uv.y - ouv[j].y, 0.0001)) { + new_point = false; + } + } + if (new_point) { + //bu_log("New Hit Point:(%f %f %f) uv(%f,%f)\n",S.x,S.y,S.z,uv.x,uv.y); + t[intersects] = utah_calc_t(r, S); + N[intersects] = ON_CrossProduct(Su, Sv); + N[intersects].Unitize(); + ouv[intersects].x = uv.x; + ouv[intersects].y = uv.y; + intersects++; + converged = true; + } + } //else { + //bu_log("OOB Point Hit:(%f %f %f) uv(%f,%f)\n",S.x,S.y,S.z,uv.x,uv.y); + //} + break; + } + } + } + } + if (!converged) { + uv.x = sbv->m_u.Mid(); + uv.y = sbv->m_v.Mid(); + + ON_2dPoint uv0(uv); + surf->Ev1Der(uv.x, uv.y, S, Su, Sv); + + utah_F(S, p1, p1d, p2, p2d, f, g); + rootdist = fabs(f) + fabs(g); + + for (i = 0; i < BREP_MAX_ITERATIONS; i++) { + utah_Fu(Su, p1, p2, j11, j21); + utah_Fv(Sv, p1, p2, j12, j22); + + J = (j11 * j22 - j12 * j21); + + if (NEAR_ZERO(J, BREP_INTERSECTION_ROOT_EPSILON)) { + // perform jittered perturbation in parametric domain.... + uv.x = uv.x + .1 * drand48() * (uv0.x - uv.x); + uv.y = uv.y + .1 * drand48() * (uv0.y - uv.y); + continue; + } + + invdetJ = 1. / J; + + /* + du = -invdetJ * (j22 * f - j12 * g); + dv = -invdetJ * (j11 * g - j21 * f); + + + if ( i == 0 ) { + if (((iu == 0) && (du < 0.0)) || + ((iu==1) && (du > 0.0))) + break; //head out of U bounds + if (((iv == 0) && (dv < 0.0)) || + ((iv==1) && (dv > 0.0))) + break; //head out of V bounds + } + */ + + uv.x -= invdetJ * (j22 * f - j12 * g); + uv.y -= invdetJ * (j11 * g - j21 * f); + + utah_pushBack(surf, uv); + + surf->Ev1Der(uv.x, uv.y, S, Su, Sv); + utah_F(S, p1, p1d, p2, p2d, f, g); + oldrootdist = rootdist; + rootdist = fabs(f) + fabs(g); + + if (oldrootdist < rootdist) break; + + if (rootdist < ROOT_TOL) { + if (sbv->m_u.Includes(uv.x) && sbv->m_v.Includes(uv.y)) { + bool new_point = true; + for(int j=0;j<intersects;j++) { + if (NEAR_ZERO(uv.x - ouv[j].x, 0.0001) && NEAR_ZERO(uv.y - ouv[j].y, 0.0001)) { + new_point = false; + } + } + if (new_point) { + //bu_log("New Hit Point:(%f %f %f) uv(%f,%f)\n",S.x,S.y,S.z,uv.x,uv.y); + t[intersects] = utah_calc_t(r, S); + N[intersects] = ON_CrossProduct(Su, Sv); + N[intersects].Unitize(); + ouv[intersects].x = uv.x; + ouv[intersects].y = uv.y; + intersects++; + converged = true; + } + } //else { + //bu_log("OOB Point Hit:(%f %f %f) uv(%f,%f)\n",S.x,S.y,S.z,uv.x,uv.y); + //} + break; + } + } + } + return intersects; +} + void -utah_newton_solver(const ON_Surface* surf, const ON_Ray& r, ON_2dPoint &uv, double& t, ON_3dVector &N, bool& converged) +utah_newton_solver(const SubsurfaceBBNode* sbv, const ON_Surface* surf, const ON_Ray& r, ON_2dPoint &uv, double& t, ON_3dVector &N, bool& converged) { int i; double j11, j12, j21, j22; @@ -1310,6 +1573,73 @@ int +utah_brep_intersect_test(const SubsurfaceBBNode* sbv, const ON_BrepFace* face, const ON_Surface* surf, pt2d_t uv, ON_Ray& ray, HitList& hits) +{ + ON_3dVector N[2]; + bool hit = false; + double t[2]; + ON_2dPoint ouv[2]; + int found = BREP_INTERSECT_ROOT_DIVERGED; + bool converged = false; + int numhits; + + numhits = utah_newton_4corner_solver( sbv, surf, ray, ouv, t, N, converged); +//utah_newton_4corner_solver(const SubsurfaceBBNode* sbv, const ON_Surface* surf, const ON_Ray& r, ON_2dPoint* ouv, double* t, ON_3dVector* &N, bool& converged) + /* + * DDR. The utah people are using this t_min which represents the + * last point hit along the ray to ensure we are looking at points + * futher down the ray. I haven't implemented this I'm not sure + * we need it + * + * if (converged && (t > 1.e-2) && (t < t_min) && (!utah_isTrimmed(ouv, face))) hit = true; + * + */ + //if (converged && (t > 1.e-2) && (!utah_isTrimmed(ouv, face))) hit = true; + //if (converged && (t > 1.e-2) && (!((SubsurfaceBBNode*)sbv)->isTrimmed(ouv))) hit = true; + + for(int i=0;i < numhits;i++) { + + if (converged && (t[i] > 1.e-2)) { + if (!((SubsurfaceBBNode*)sbv)->isTrimmed(ouv[i])) { + hit = true; +//#define KHITPLOT +#ifdef KHITPLOT + double min[3],max[3]; + COLOR_PLOT(255, 200, 200); + VSET(min,ouv[0]-0.01,ouv[1]-0.01,0.0); + VSET(max,ouv[0]+0.01,ouv[1]+0.01,0.0); + BB_PLOT(min,max); + } else { + double min[3],max[3]; + COLOR_PLOT(200, 255, 200); + VSET(min,ouv[0]-0.01,ouv[1]-0.01,0.0); + VSET(max,ouv[0]+0.01,ouv[1]+0.01,0.0); + BB_PLOT(min,max); + } +#else + } +#endif + } + // if (converged && (t > 1.e-2)) hit = true; + + uv[0] = ouv[i].x; + uv[1] = ouv[i].y; + + if (hit) { + ON_3dPoint _pt; + ON_3dVector _norm(N[i]); + _pt = ray.m_origin + (ray.m_dir*t[i]); + if (face->m_bRev) _norm.Reverse(); + hit_count += 1; + hits.push_back(brep_hit(*face,(const fastf_t*)ray.m_origin,(const fastf_t*)_pt,(const fastf_t*)_norm, uv)); + hits.back().sbv = sbv; + found = BREP_INTERSECT_FOUND; + } + } + return found; +} + +int utah_brep_intersect(const SubsurfaceBBNode* sbv, const ON_BrepFace* face, const ON_Surface* surf, pt2d_t uv, ON_Ray& ray, HitList& hits) { ON_3dVector N; @@ -1319,8 +1649,7 @@ int found = BREP_INTERSECT_ROOT_DIVERGED; bool converged = false; - utah_newton_solver(surf, ray, ouv, t, N, converged); - + utah_newton_solver( sbv, surf, ray, ouv, t, N, converged); /* * DDR. The utah people are using this t_min which represents the * last point hit along the ray to ensure we are looking at points @@ -1394,9 +1723,12 @@ for (int i = 0; i < BREP_MAX_ITERATIONS; i++) { brep_r(surf, pr, uv, pt, su, sv, Rcurr); //fastf_t d = v2mag(Rcurr); - fastf_t d = DIST_PT_PT(pt, ray.m_origin); + //keith fastf_t d = DIST_PT_PT(pt, ray.m_origin); + fastf_t d = v2mag(Rcurr); + //keith //if (d < BREP_INTERSECTION_ROOT_EPSILON) { - if (NEAR_ZERO(d-Dlast, BREP_INTERSECTION_ROOT_EPSILON)) { + //keith if (NEAR_ZERO(d-Dlast, BREP_INTERSECTION_ROOT_EPSILON)) { + if (d < BREP_INTERSECTION_ROOT_EPSILON) { TRACE1("R:"<<ON_PRINT2(Rcurr)); found = BREP_INTERSECT_FOUND; break; } else if (d > Dlast) { @@ -1410,7 +1742,7 @@ move(uv, new_uv); Dlast = d; } - if (found > 0) { + if ((found > 0) && (!((SubsurfaceBBNode*)sbv)->isTrimmed(uv))) { ON_3dPoint _pt; ON_3dVector _norm; surf->EvNormal(uv[0], uv[1],_pt,_norm); @@ -1497,6 +1829,23 @@ if (inters.size() == 0) return 0; // MISS TRACE1("bboxes: " << inters.size()); + +//#define KDEBUGMISS + int boxcnt=0; +#ifdef KDEBUGMISS + char buffer[80]; + icount++; + if (icount > 1) return 0; + sprintf(buffer,"Shot%d.pl",icount); + plot_file((const char *)buffer); + ON_3dPoint p = r.m_origin + (r.m_dir*20.0); + point_t a,b; + VMOVE(a,r.m_origin); + VMOVE(b,p); + COLOR_PLOT( 255, 255, 255 ); + LINE_PLOT(a,b); + (void)fclose(plot_file()); +#endif // find all the hits (XXX very inefficient right now!) HitList all_hits; // record all hits @@ -1505,11 +1854,20 @@ hit_count = 0; for (BBNode::IsectList::iterator i = inters.begin(); i != inters.end(); i++) { const SubsurfaceBBNode* sbv = dynamic_cast<SubsurfaceBBNode*>((*i).m_node); + + boxcnt++; +#ifdef KDEBUGMISS + sprintf(buffer,"N%d.pl",boxcnt); + plot_file((const char *)buffer); + plotleaf3d((SubsurfaceBBNode*)sbv); + (void)fclose(plot_file()); +#endif + const ON_BrepFace* f = sbv->m_face; const ON_Surface* surf = f->SurfaceOf(); pt2d_t uv = {sbv->m_u.Mid(), sbv->m_v.Mid()}; TRACE1("surface: " << s); - int status = utah_brep_intersect(sbv, f, surf, uv, r, all_hits); + int status = utah_brep_intersect_test(sbv, f, surf, uv, r, all_hits); if (status == BREP_INTERSECT_FOUND) { TRACE("INTERSECTION: " << PT(all_hits.back().point) << all_hits.back().trimmed << ", " << all_hits.back().closeToEdge << ", " << all_hits.back().oob); } else { @@ -1529,6 +1887,9 @@ s++; } +#ifdef KDEBUGMISS + //(void)fclose(plot_file()); +#endif HitList hits = all_hits; // sort the hits This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <br...@us...> - 2009-06-23 23:11:29
|
Revision: 34862 http://brlcad.svn.sourceforge.net/brlcad/?rev=34862&view=rev Author: brlcad Date: 2009-06-23 23:11:24 +0000 (Tue, 23 Jun 2009) Log Message: ----------- ws indent consistency Modified Paths: -------------- brlcad/trunk/src/librt/primitives/table.c brlcad/trunk/src/librt/wdb.c Modified: brlcad/trunk/src/librt/primitives/table.c =================================================================== --- brlcad/trunk/src/librt/primitives/table.c 2009-06-23 22:52:47 UTC (rev 34861) +++ brlcad/trunk/src/librt/primitives/table.c 2009-06-23 23:11:24 UTC (rev 34862) @@ -45,78 +45,30 @@ {""} }; -# define RT_DECLARE_INTERFACE(name) \ - BU_EXTERN(int rt_##name##_prep, (struct soltab *stp, \ - struct rt_db_internal *ip, struct rt_i *rtip )); \ - BU_EXTERN(int rt_##name##_shot, (struct soltab *stp, \ - register struct xray *rp, \ - struct application *ap, struct seg *seghead )); \ - BU_EXTERN(int rt_##name##_piece_shot, (\ - struct rt_piecestate *psp, \ - struct rt_piecelist *plp, \ - double dist_corr, \ - struct xray *rp, \ - struct application *ap, \ - struct seg *seghead )); \ - BU_EXTERN(void rt_##name##_piece_hitsegs, (\ - struct rt_piecestate *psp, \ - struct seg *seghead, \ - struct application *ap)); \ +#define RT_DECLARE_INTERFACE(name) \ + BU_EXTERN(int rt_##name##_prep, (struct soltab *stp, struct rt_db_internal *ip, struct rt_i *rtip )); \ + BU_EXTERN(int rt_##name##_shot, (struct soltab *stp, register struct xray *rp, struct application *ap, struct seg *seghead )); \ + BU_EXTERN(int rt_##name##_piece_shot, (struct rt_piecestate *psp, struct rt_piecelist *plp, double dist_corr, struct xray *rp, struct application *ap, struct seg *seghead )); \ + BU_EXTERN(void rt_##name##_piece_hitsegs, (struct rt_piecestate *psp, struct seg *seghead, struct application *ap)); \ BU_EXTERN(void rt_##name##_print, (const struct soltab *stp)); \ - BU_EXTERN(void rt_##name##_norm, (struct hit *hitp, \ - struct soltab *stp, struct xray *rp)); \ - BU_EXTERN(void rt_##name##_uv, (struct application *ap, \ - struct soltab *stp, struct hit *hitp, \ - struct uvcoord *uvp)); \ - BU_EXTERN(void rt_##name##_curve, (struct curvature *cvp, \ - struct hit *hitp, struct soltab *stp)); \ + BU_EXTERN(void rt_##name##_norm, (struct hit *hitp, struct soltab *stp, struct xray *rp)); \ + BU_EXTERN(void rt_##name##_uv, (struct application *ap, struct soltab *stp, struct hit *hitp, struct uvcoord *uvp)); \ + BU_EXTERN(void rt_##name##_curve, (struct curvature *cvp, struct hit *hitp, struct soltab *stp)); \ BU_EXTERN(int rt_##name##_class, ()); \ BU_EXTERN(void rt_##name##_free, (struct soltab *stp)); \ - BU_EXTERN(int rt_##name##_plot, (struct bu_list *vhead, \ - struct rt_db_internal *ip, \ - const struct rt_tess_tol *ttol, \ - const struct bn_tol *tol)); \ - BU_EXTERN(void rt_##name##_vshot, (struct soltab *stp[], \ - struct xray *rp[], \ - struct seg segp[], int n, struct application *ap )); \ - BU_EXTERN(int rt_##name##_tess, (struct nmgregion **r, \ - struct model *m, struct rt_db_internal *ip, \ - const struct rt_tess_tol *ttol, \ - const struct bn_tol *tol)); \ - BU_EXTERN(int rt_##name##_tnurb, (struct nmgregion **r, \ - struct model *m, struct rt_db_internal *ip, \ - const struct bn_tol *tol)); \ - BU_EXTERN(int rt_##name##_import5, (struct rt_db_internal *ip, \ - const struct bu_external *ep, const mat_t mat, \ - const struct db_i *dbip, struct resource *resp, const int minor_type )); \ - BU_EXTERN(int rt_##name##_export5, (struct bu_external *ep, \ - const struct rt_db_internal *ip, \ - double local2mm, const struct db_i *dbip, \ - struct resource *resp, \ - const int minor_type)); \ - BU_EXTERN(int rt_##name##_import, (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##_export, (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, \ - struct resource *resp)); \ - 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(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)); \ - BU_EXTERN(int rt_##name##_params, (struct pc_pc_set *ps, \ - const struct rt_db_internal *ip)); \ - BU_EXTERN(int rt_##name##_mirror, (struct rt_db_internal *ip, \ - const plane_t *plane)); \ + BU_EXTERN(int rt_##name##_plot, (struct bu_list *vhead, struct rt_db_internal *ip, const struct rt_tess_tol *ttol, const struct bn_tol *tol)); \ + BU_EXTERN(void rt_##name##_vshot, (struct soltab *stp[], struct xray *rp[], struct seg segp[], int n, struct application *ap )); \ + BU_EXTERN(int rt_##name##_tess, (struct nmgregion **r, struct model *m, struct rt_db_internal *ip, const struct rt_tess_tol *ttol, const struct bn_tol *tol)); \ + BU_EXTERN(int rt_##name##_tnurb, (struct nmgregion **r, struct model *m, struct rt_db_internal *ip, const struct bn_tol *tol)); \ + BU_EXTERN(int rt_##name##_import5, (struct rt_db_internal *ip, const struct bu_external *ep, const mat_t mat, const struct db_i *dbip, struct resource *resp, const int minor_type)); \ + BU_EXTERN(int rt_##name##_export5, (struct bu_external *ep, const struct rt_db_internal *ip, double local2mm, const struct db_i *dbip, struct resource *resp, const int minor_type)); \ + BU_EXTERN(int rt_##name##_import, (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##_export, (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, struct resource *resp)); \ + 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(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)); \ + BU_EXTERN(int rt_##name##_params, (struct pc_pc_set *ps, const struct rt_db_internal *ip)); \ + BU_EXTERN(int rt_##name##_mirror, (struct rt_db_internal *ip, const plane_t *plane)); \ extern const struct bu_structparse rt_##name##_parse[]; @@ -222,11 +174,11 @@ RT_DECLARE_INTERFACE(constraint); /* -#define rt_binunif_xform rt_generic_xform -RT_DECLARE_INTERFACE(binunif); + #define rt_binunif_xform rt_generic_xform + RT_DECLARE_INTERFACE(binunif); -#define rt_binexpm_xform rt_generic_xform -RT_DECLARE_INTERFACE(binexpm); + #define rt_binexpm_xform rt_generic_xform + RT_DECLARE_INTERFACE(binexpm); */ #define rt_pnts_xform rt_generic_xform @@ -241,17 +193,17 @@ /* from 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, - const int minor_type)); + double local2mm, + const struct db_i *dbip, + struct resource *resp, + const int minor_type)); 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, - const int minor_type)); + const mat_t mat, + const struct db_i *dbip, + struct resource *resp, + const int minor_type)); /* from db5_bin.c */ BU_EXTERN(int rt_binexpm_import5, (struct rt_db_internal * ip, @@ -292,17 +244,17 @@ 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, - double diameter ) ); -BU_EXTERN( int rt_binunif_get, (struct bu_vls *log, - const struct rt_db_internal *intern, - const char *attr ) ); +BU_EXTERN(void rt_binunif_make, (const struct rt_functab *ftp, + struct rt_db_internal *intern, + double diameter ) ); +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, - struct resource *resp ) ); + struct rt_db_internal *intern, + int argc, + char **argv, + struct resource *resp ) ); /* from tcl.c */ BU_EXTERN(int rt_comb_get, (struct bu_vls *log, @@ -352,12 +304,12 @@ /* DSP solid */ extern int rt_dsp_get(struct bu_vls *log, const struct rt_db_internal *intern, - const char *attr); + const char *attr); extern int rt_dsp_adjust(struct bu_vls *log, struct rt_db_internal *intern, - int argc, - char **argv, + int argc, + char **argv, struct resource *resp); BU_EXTERN(void rt_dsp_make, (const struct rt_functab *, struct rt_db_internal *, double /*diameter*/)); @@ -429,11 +381,11 @@ 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) { +int rt_nul_get(struct bu_vls *log, const struct rt_db_internal *intern, const char *attr) { bu_vls_printf(log, "rt_nul_get"); return BRLCAD_ERROR; } -int rt_nul_adjust(struct bu_vls *log, struct rt_db_internal *intern, int argc, char **argv, struct resource *resp) { +int rt_nul_adjust(struct bu_vls *log, struct rt_db_internal *intern, int argc, char **argv, struct resource *resp) { RT_CK_RESOURCE(resp); bu_vls_printf(log, "rt_nul_adjust"); return BRLCAD_ERROR; @@ -870,7 +822,7 @@ }, {RT_FUNCTAB_MAGIC, "ID_BOT", "bot", - 0, /* 30 Bag o' Triangles */ + 0, /* 30 Bag o' Triangles */ rt_bot_prep, rt_bot_shot, rt_bot_print, rt_bot_norm, rt_bot_piece_shot, rt_bot_piece_hitsegs, rt_bot_uv, rt_bot_curve, rt_bot_class, rt_bot_free, @@ -944,7 +896,7 @@ }, {RT_FUNCTAB_MAGIC, "ID_SUPERELL", "superell", - 1, /* 35 but "should" be 31 Superquadratic Ellipsoid */ + 1, /* 35 but "should" be 31 Superquadratic Ellipsoid */ rt_superell_prep, rt_superell_shot, rt_superell_print, rt_superell_norm, rt_nul_piece_shot, rt_nul_piece_hitsegs, rt_superell_uv, rt_superell_curve, rt_superell_class, rt_superell_free, @@ -958,7 +910,7 @@ }, {RT_FUNCTAB_MAGIC, "ID_METABALL", "metaball", - 1, /* 36 but "should" be 32 Metaball */ + 1, /* 36 but "should" be 32 Metaball */ rt_metaball_prep, rt_metaball_shot, rt_metaball_print, rt_metaball_norm, rt_nul_piece_shot, rt_nul_piece_hitsegs, rt_metaball_uv, rt_metaball_curve, rt_metaball_class, rt_metaball_free, @@ -1002,7 +954,7 @@ #endif {RT_FUNCTAB_MAGIC, "ID_HYP", "hyp", - 1, /* 38 but "should" be 34 Hyperboloid */ + 1, /* 38 but "should" be 34 Hyperboloid */ rt_hyp_prep, rt_hyp_shot, rt_hyp_print, rt_hyp_norm, rt_nul_piece_shot, rt_nul_piece_hitsegs, rt_hyp_uv, rt_hyp_curve, rt_hyp_class, rt_hyp_free, @@ -1074,7 +1026,7 @@ /* - * Hooks for unimplemented routines + * Hooks for unimplemented routines */ #define DEF(func, args) func BU_ARGS(args) { \ bu_log(#func " unimplemented\n"); return; } @@ -1208,10 +1160,10 @@ register union record *rec; register int id; - BU_CK_EXTERNAL( ep ); + BU_CK_EXTERNAL(ep ); rec = (union record *)ep->ext_buf; - switch ( rec->u_id ) { + switch (rec->u_id ) { case ID_SOLID: id = idmap[(int)(rec->s.s_type)]; break; @@ -1226,19 +1178,19 @@ break; case DBID_STRSOL: /* XXX This really needs to be some kind of table */ - if ( strcmp( rec->ss.ss_keyword, "ebm" ) == 0 ) { + if (strcmp(rec->ss.ss_keyword, "ebm" ) == 0 ) { id = ID_EBM; break; - } else if ( strcmp( rec->ss.ss_keyword, "vol" ) == 0 ) { + } else if (strcmp(rec->ss.ss_keyword, "vol" ) == 0 ) { id = ID_VOL; break; - } else if ( strcmp( rec->ss.ss_keyword, "hf" ) == 0 ) { + } else if (strcmp(rec->ss.ss_keyword, "hf" ) == 0 ) { id = ID_HF; break; - } else if ( strcmp( rec->ss.ss_keyword, "dsp" ) == 0 ) { + } else if (strcmp(rec->ss.ss_keyword, "dsp" ) == 0 ) { id = ID_DSP; break; - } else if ( strcmp( rec->ss.ss_keyword, "submodel" ) == 0 ) { + } else if (strcmp(rec->ss.ss_keyword, "submodel" ) == 0 ) { id = ID_SUBMODEL; break; } @@ -1275,7 +1227,7 @@ id = ID_NULL; /* BAD */ break; } - if ( id < ID_NULL || id > ID_MAX_SOLID ) { + if (id < ID_NULL || id > ID_MAX_SOLID ) { bu_log("rt_id_solid: internal error, id=%d?\n", id); id = ID_NULL; /* very BAD */ } @@ -1291,10 +1243,10 @@ const struct rt_functab * rt_get_functab_by_label(const char *label) { - register const struct rt_functab *ftp; + register const struct rt_functab *ftp; - for ( ftp = rt_functab; ftp->magic != 0; ftp++ ) { - if ( strncmp( label, ftp->ft_label, 8 ) == 0 ) + for (ftp = rt_functab; ftp->magic != 0; ftp++ ) { + if (strncmp(label, ftp->ft_label, 8 ) == 0 ) return ftp; } return NULL; @@ -1309,26 +1261,25 @@ * released. If "os" is same as "is", storage for the original solid * is overwritten with the new, transformed solid. * - * * Returns - - * -1 FAIL - * 0 OK + * -1 FAIL + * 0 OK */ 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) + struct rt_db_internal *op, + const mat_t mat, + struct rt_db_internal *ip, + int free, + struct db_i *dbip, + struct resource *resp) { - struct bu_external ext; - int id; + struct bu_external ext; + int id; struct bu_attribute_value_set avs; - RT_CK_DB_INTERNAL( ip ); + RT_CK_DB_INTERNAL(ip ); RT_CK_DBI(dbip); RT_CK_RESOURCE(resp); @@ -1337,15 +1288,15 @@ /* Scale change on export is 1.0 -- no change */ switch (dbip->dbi_version) { case 4: - if ( rt_functab[id].ft_export( &ext, ip, 1.0, dbip, resp ) < 0 ) { + if (rt_functab[id].ft_export(&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 ( (free || op == ip) ) rt_db_free_internal(ip, resp); + if ((free || op == ip) ) rt_db_free_internal(ip, resp); RT_INIT_DB_INTERNAL(op); - if ( rt_functab[id].ft_import( op, &ext, mat, dbip, resp ) < 0 ) { + if (rt_functab[id].ft_import(op, &ext, mat, dbip, resp ) < 0 ) { bu_log("rt_generic_xform(): solid import failure\n"); return -1; /* FAIL */ } @@ -1353,48 +1304,48 @@ case 5: avs.magic = -1; - if ( rt_functab[id].ft_export5( &ext, ip, 1.0, dbip, resp, 0 ) < 0 ) { + if (rt_functab[id].ft_export5(&ext, ip, 1.0, dbip, resp, 0 ) < 0 ) { bu_log("rt_generic_xform(): %s export failure\n", rt_functab[id].ft_name); return -1; /* FAIL */ } - if ( (free || op == ip) ) { - if ( ip->idb_avs.magic == BU_AVS_MAGIC ) { + if ((free || 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 ); + bu_avs_init(&avs, ip->idb_avs.count, "avs" ); + bu_avs_merge(&avs, &ip->idb_avs ); } rt_db_free_internal(ip, resp); } RT_INIT_DB_INTERNAL(op); - if ( !free && op != ip ) { + if (!free && 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 ); + 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 ) { + } 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 ); + 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 ) < 0 ) { + if (rt_functab[id].ft_import5(op, &ext, mat, dbip, resp, 0 ) < 0 ) { bu_log("rt_generic_xform(): solid import failure\n"); return -1; /* FAIL */ } break; } - bu_free_external( &ext ); + bu_free_external(&ext ); - RT_CK_DB_INTERNAL( op ); + RT_CK_DB_INTERNAL(op ); return 0; /* OK */ } Modified: brlcad/trunk/src/librt/wdb.c =================================================================== --- brlcad/trunk/src/librt/wdb.c 2009-06-23 22:52:47 UTC (rev 34861) +++ brlcad/trunk/src/librt/wdb.c 2009-06-23 23:11:24 UTC (rev 34862) @@ -21,8 +21,8 @@ /** @{ */ /** @file wdb.c * - * Routines to allow libwdb to use librt's import/export interface, - * rather than having to know about the database formats directly. + * Routines to allow libwdb to use librt's import/export interface, + * rather than having to know about the database formats directly. * */ /** @} */ @@ -44,73 +44,76 @@ /** - * W D B _ F O P E N + * W D B _ F O P E N * - * Create a libwdb output stream destined for a disk file. - * This will destroy any existing file by this name, and start fresh. - * The file is then opened in the normal "update" mode and - * an in-memory directory is built along the way, - * allowing retrievals and object replacements as needed. + * Create a libwdb output stream destined for a disk file. + * This will destroy any existing file by this name, and start fresh. + * The file is then opened in the normal "update" mode and + * an in-memory directory is built along the way, + * allowing retrievals and object replacements as needed. * - * Users can change the database title by calling: ??? + * Users can change the database title by calling: ??? */ struct rt_wdb * -wdb_fopen_v( const char *filename, int version ) +wdb_fopen_v(const char *filename, int version ) { - struct db_i *dbip; + struct db_i *dbip; - if ( rt_uniresource.re_magic != RESOURCE_MAGIC ) { - rt_init_resource( &rt_uniresource, 0, NULL ); + if (rt_uniresource.re_magic != RESOURCE_MAGIC ) { + rt_init_resource(&rt_uniresource, 0, NULL ); } - if ( (dbip = db_create( filename, version )) == DBI_NULL ) + if ((dbip = db_create(filename, version )) == DBI_NULL ) return RT_WDB_NULL; - return wdb_dbopen( dbip, RT_WDB_TYPE_DB_DISK ); + return wdb_dbopen(dbip, RT_WDB_TYPE_DB_DISK ); } struct rt_wdb * -wdb_fopen( const char *filename) +wdb_fopen(const char *filename) { return wdb_fopen_v(filename, 5); } /** - * W D B _ D B O P E N + * W D B _ D B O P E N * - * Create a libwdb output stream destined for an existing BRL-CAD database, - * already opened via a db_open() call. - * RT_WDB_TYPE_DB_DISK Add to on-disk database - * RT_WDB_TYPE_DB_DISK_APPEND_ONLY Add to on-disk database, don't clobber existing names, use prefix - * RT_WDB_TYPE_DB_INMEM Add to in-memory database only - * RT_WDB_TYPE_DB_INMEM_APPEND_ONLY Ditto, but give errors if name in use. + * Create a libwdb output stream destined for an existing BRL-CAD database, + * already opened via a db_open() call. + * RT_WDB_TYPE_DB_DISK Add to on-disk database + * RT_WDB_TYPE_DB_DISK_APPEND_ONLY Add to on-disk database, don't clobber existing names, use prefix + * RT_WDB_TYPE_DB_INMEM Add to in-memory database only + * RT_WDB_TYPE_DB_INMEM_APPEND_ONLY Ditto, but give errors if name in use. */ struct rt_wdb * -wdb_dbopen( struct db_i *dbip, int mode ) +wdb_dbopen(struct db_i *dbip, int mode ) { - struct rt_wdb *wdbp; + struct rt_wdb *wdbp; RT_CK_DBI(dbip); - if (mode != RT_WDB_TYPE_DB_DISK && mode != RT_WDB_TYPE_DB_DISK_APPEND_ONLY && - mode != RT_WDB_TYPE_DB_INMEM && mode != RT_WDB_TYPE_DB_INMEM_APPEND_ONLY) { + if ((mode != RT_WDB_TYPE_DB_DISK) && + (mode != RT_WDB_TYPE_DB_DISK_APPEND_ONLY) && + (mode != RT_WDB_TYPE_DB_INMEM) && + (mode != RT_WDB_TYPE_DB_INMEM_APPEND_ONLY)) + { bu_log("wdb_dbopen(%s) mode %d unknown\n", dbip->dbi_filename, mode ); return RT_WDB_NULL; } #if 0 - if ( (mode == RT_WDB_TYPE_DB_DISK || mode == RT_WDB_TYPE_DB_DISK_APPEND_ONLY ) && - dbip->dbi_read_only ) { + if ((mode == RT_WDB_TYPE_DB_DISK || mode == RT_WDB_TYPE_DB_DISK_APPEND_ONLY ) && + dbip->dbi_read_only ) { /* In-mem updates happen regardless of disk read-only flag */ bu_log("wdb_dbopen(%s): read-only\n", dbip->dbi_filename ); } #endif - if ( rt_uniresource.re_magic != RESOURCE_MAGIC ) - rt_init_resource( &rt_uniresource, 0, NULL ); + if (rt_uniresource.re_magic != RESOURCE_MAGIC ) + rt_init_resource(&rt_uniresource, 0, NULL ); BU_GETSTRUCT(wdbp, rt_wdb); wdb_init(wdbp, dbip, mode); @@ -120,36 +123,36 @@ } /** - * W D B _ I M P O R T + * W D B _ I M P O R T * - * Returns - - * 0 and modified *internp; - * -1 ft_import failure (from rt_db_get_internal) - * -2 db_get_external failure (from rt_db_get_internal) - * -3 Attempt to import from write-only (stream) file. - * -4 Name not found in database TOC. + * Returns - + * 0 and modified *internp; + * -1 ft_import failure (from rt_db_get_internal) + * -2 db_get_external failure (from rt_db_get_internal) + * -3 Attempt to import from write-only (stream) file. + * -4 Name not found in database TOC. * - * NON-PARALLEL because of rt_uniresource + * NON-PARALLEL because of rt_uniresource */ int wdb_import(struct rt_wdb *wdbp, struct rt_db_internal *internp, const char *name, const mat_t mat ) { - struct directory *dp; + struct directory *dp; - if ( (dp = db_lookup( wdbp->dbip, name, LOOKUP_QUIET )) == DIR_NULL ) + if ((dp = db_lookup(wdbp->dbip, name, LOOKUP_QUIET )) == DIR_NULL ) return -4; - return rt_db_get_internal( internp, dp, wdbp->dbip, mat, &rt_uniresource ); + return rt_db_get_internal(internp, dp, wdbp->dbip, mat, &rt_uniresource ); } /** - * W D B _ E X P O R T _ E X T E R N A L + * W D B _ E X P O R T _ E X T E R N A L * - * The caller must free "ep". + * The caller must free "ep". * - * Returns - - * 0 OK - * <0 error + * Returns - + * 0 OK + * <0 error */ int wdb_export_external( @@ -159,16 +162,16 @@ int flags, unsigned char type) { - struct directory *dp; + struct directory *dp; RT_CK_WDB(wdbp); BU_CK_EXTERNAL(ep); /* Stash name into external representation */ - if ( wdbp->dbip->dbi_version <= 4 ) { - db_wrap_v4_external( ep, name ); - } else if ( wdbp->dbip->dbi_version == 5 ) { - if ( db_wrap_v5_external( ep, name ) < 0 ) { + if (wdbp->dbip->dbi_version <= 4 ) { + db_wrap_v4_external(ep, name ); + } else if (wdbp->dbip->dbi_version == 5 ) { + if (db_wrap_v5_external(ep, name ) < 0 ) { bu_log("wdb_export_external(%s): db_wrap_v5_external error\n", name ); return -4; @@ -179,18 +182,18 @@ return -4; } - switch ( wdbp->type ) { + switch (wdbp->type ) { case RT_WDB_TYPE_DB_DISK: - if ( wdbp->dbip->dbi_read_only ) { + if (wdbp->dbip->dbi_read_only ) { bu_log("wdb_export_external(%s): read-only database, write aborted\n"); return -5; } /* If name already exists, that object will be updated. */ - dp = db_lookup( wdbp->dbip, name, LOOKUP_QUIET ); - if ( dp == DIR_NULL ) { - if ( (dp = db_diradd( wdbp->dbip, name, -1L, 0, flags, - (genptr_t)&type )) == DIR_NULL ) { + dp = db_lookup(wdbp->dbip, name, LOOKUP_QUIET ); + if (dp == DIR_NULL ) { + if ((dp = db_diradd(wdbp->dbip, name, -1L, 0, flags, + (genptr_t)&type )) == DIR_NULL ) { bu_log("wdb_export_external(%s): db_diradd error\n", name ); return -3; @@ -201,7 +204,7 @@ * read/written differently for both. */ dp->d_flags = (dp->d_flags & ~7) | (flags & ~(RT_DIR_INMEM)); - if ( db_put_external( ep, dp, wdbp->dbip ) < 0 ) { + if (db_put_external(ep, dp, wdbp->dbip ) < 0 ) { bu_log("wdb_export_external(%s): db_put_external error\n", name ); return -3; @@ -209,18 +212,18 @@ break; case RT_WDB_TYPE_DB_DISK_APPEND_ONLY: - if ( wdbp->dbip->dbi_read_only ) { + if (wdbp->dbip->dbi_read_only ) { bu_log("wdb_export_external(%s): read-only database, write aborted\n"); return -5; } /* If name already exists, new non-conflicting name will be generated */ - if ( (dp = db_diradd( wdbp->dbip, name, -1L, 0, flags, - (genptr_t)&type )) == DIR_NULL ) { + if ((dp = db_diradd(wdbp->dbip, name, -1L, 0, flags, + (genptr_t)&type )) == DIR_NULL ) { bu_log("wdb_export_external(%s): db_diradd error\n", name ); return -3; } - if ( db_put_external( ep, dp, wdbp->dbip ) < 0 ) { + if (db_put_external(ep, dp, wdbp->dbip ) < 0 ) { bu_log("wdb_export_external(%s): db_put_external error\n", name ); return -3; @@ -228,36 +231,36 @@ break; case RT_WDB_TYPE_DB_INMEM_APPEND_ONLY: - if ( (dp = db_lookup( wdbp->dbip, name, 0 )) != DIR_NULL ) { + if ((dp = db_lookup(wdbp->dbip, name, 0 )) != DIR_NULL ) { bu_log("wdb_export_external(%s): ERROR, that name is already in use, and APPEND_ONLY mode has been specified.\n", name ); return -3; } - if ( (dp = db_diradd( wdbp->dbip, name, -1L, 0, flags, - (genptr_t)&type )) == DIR_NULL ) { + if ((dp = db_diradd(wdbp->dbip, name, -1L, 0, flags, + (genptr_t)&type )) == DIR_NULL ) { bu_log("wdb_export_external(%s): db_diradd error\n", name ); return -3; } - db_inmem( dp, ep, flags, wdbp->dbip ); + db_inmem(dp, ep, flags, wdbp->dbip ); /* ep->buf has been stolen, replaced with null. */ break; case RT_WDB_TYPE_DB_INMEM: - if ( (dp = db_lookup( wdbp->dbip, name, 0 )) == DIR_NULL ) { - if ( (dp = db_diradd( wdbp->dbip, name, -1L, 0, flags, - (genptr_t)&type )) == DIR_NULL ) { + if ((dp = db_lookup(wdbp->dbip, name, 0 )) == DIR_NULL ) { + if ((dp = db_diradd(wdbp->dbip, name, -1L, 0, flags, + (genptr_t)&type )) == DIR_NULL ) { bu_log("wdb_export_external(%s): db_diradd error\n", name ); - bu_free_external( ep ); + bu_free_external(ep ); return -3; } } else { dp->d_flags = (dp->d_flags & ~7) | flags; } - db_inmem( dp, ep, flags, wdbp->dbip ); + db_inmem(dp, ep, flags, wdbp->dbip ); /* ep->buf has been stolen, replaced with null. */ break; } @@ -266,21 +269,21 @@ } /** - * W D B _ P U T _ I N T E R N A L + * W D B _ P U T _ I N T E R N A L * - * Convert the internal representation of a solid to the external one, - * and write it into the database. - * The internal representation is always freed. - * This is the analog of rt_db_put_internal() for rt_wdb objects. + * Convert the internal representation of a solid to the external one, + * and write it into the database. + * The internal representation is always freed. + * This is the analog of rt_db_put_internal() for rt_wdb objects. * - * Use this routine in preference to wdb_export() whenever the - * caller already has an rt_db_internal structure handy. + * Use this routine in preference to wdb_export() whenever the + * caller already has an rt_db_internal structure handy. * - * NON-PARALLEL because of rt_uniresource + * NON-PARALLEL because of rt_uniresource * - * Returns - - * 0 OK - * <0 error + * Returns - + * 0 OK + * <0 error */ int wdb_put_internal( @@ -289,65 +292,65 @@ struct rt_db_internal *ip, double local2mm ) { - struct bu_external ext; - int ret; - int flags; + struct bu_external ext; + int ret; + int flags; RT_CK_WDB(wdbp); RT_CK_DB_INTERNAL(ip); - if ( wdbp->dbip->dbi_version <= 4 ) { - BU_INIT_EXTERNAL( &ext ); + if (wdbp->dbip->dbi_version <= 4 ) { + BU_INIT_EXTERNAL(&ext ); ret = -1; if (ip->idb_meth->ft_export) { ret = ip->idb_meth->ft_export(&ext, ip, local2mm, wdbp->dbip, &rt_uniresource); } - if ( ret < 0 ) { + if (ret < 0 ) { bu_log("rt_db_put_internal(%s): solid export failure\n", name); ret = -1; goto out; } - db_wrap_v4_external( &ext, name ); + db_wrap_v4_external(&ext, name ); } else { - if ( rt_db_cvt_to_external5( &ext, name, ip, local2mm, wdbp->dbip, &rt_uniresource, ip->idb_major_type ) < 0 ) { + if (rt_db_cvt_to_external5(&ext, name, ip, local2mm, wdbp->dbip, &rt_uniresource, ip->idb_major_type ) < 0 ) { bu_log("wdb_export(%s): solid export failure\n", name ); ret = -2; goto out; } } - BU_CK_EXTERNAL( &ext ); + BU_CK_EXTERNAL(&ext ); - flags = db_flags_internal( ip ); - ret = wdb_export_external( wdbp, &ext, name, flags, ip->idb_type ); - out: - bu_free_external( &ext ); - rt_db_free_internal( ip, &rt_uniresource ); + flags = db_flags_internal(ip ); + ret = wdb_export_external(wdbp, &ext, name, flags, ip->idb_type ); +out: + bu_free_external(&ext ); + rt_db_free_internal(ip, &rt_uniresource ); return ret; } /** - * W D B _ E X P O R T + * W D B _ E X P O R T * - * Export an in-memory representation of an object, - * as described in the file h/rtgeom.h, into the indicated database. + * Export an in-memory representation of an object, + * as described in the file h/rtgeom.h, into the indicated database. * - * The internal representation (gp) is always freed. + * The internal representation (gp) is always freed. * - * WARNING: The caller must be careful not to double-free gp, - * particularly if it's been extracted from an rt_db_internal, - * e.g. by passing intern.idb_ptr for gp. + * WARNING: The caller must be careful not to double-free gp, + * particularly if it's been extracted from an rt_db_internal, + * e.g. by passing intern.idb_ptr for gp. * - * If the caller has an rt_db_internal structure handy already, - * they should call wdb_put_internal() directly -- this is a - * convenience routine intended primarily for internal use in LIBWDB. + * If the caller has an rt_db_internal structure handy already, + * they should call wdb_put_internal() directly -- this is a + * convenience routine intended primarily for internal use in LIBWDB. * - * Returns - - * 0 OK - * <0 error + * Returns - + * 0 OK + * <0 error */ int wdb_export( @@ -357,23 +360,23 @@ int id, double local2mm ) { - struct rt_db_internal intern; + struct rt_db_internal intern; RT_CK_WDB(wdbp); - if ( (id <= 0 || id > ID_MAX_SOLID) && id != ID_COMBINATION ) { + if ((id <= 0 || id > ID_MAX_SOLID) && id != ID_COMBINATION ) { bu_log("wdb_export(%s): id=%d bad\n", name, id ); return(-1); } - RT_INIT_DB_INTERNAL( &intern ); + RT_INIT_DB_INTERNAL(&intern ); intern.idb_major_type = DB5_MAJORTYPE_BRLCAD; intern.idb_type = id; intern.idb_ptr = gp; intern.idb_meth = &rt_functab[id]; - return wdb_put_internal( wdbp, name, &intern, local2mm ); + return wdb_put_internal(wdbp, name, &intern, local2mm ); } void @@ -446,13 +449,13 @@ * copies ts.ts_mat to matp. * * Returns - - * BRLCAD_OK - * BRLCAD_ERROR + * BRLCAD_OK + * 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) { - struct db_i *dbip; + struct db_i *dbip; int status; /* Can't run RT_CK_DB_INTERNAL(ip), it hasn't been filled in yet */ @@ -462,11 +465,11 @@ if (strchr(path, '/')) { /* This is a path */ - struct db_tree_state ts; - struct db_full_path old_path; - struct db_full_path new_path; - struct directory *dp_curr; - int ret; + struct db_tree_state ts; + struct db_full_path old_path; + struct db_full_path new_path; + struct directory *dp_curr; + int ret; db_init_db_tree_state(&ts, dbip, &rt_uniresource); db_full_path_init(&old_path); @@ -523,8 +526,8 @@ * mainly to make available nice Tcl error handling. * * Returns - - * BRLCAD_OK - * BRLCAD_ERROR + * BRLCAD_OK + * BRLCAD_ERROR */ int wdb_import_from_path(struct bu_vls *log, struct rt_db_internal *ip, const char *path, struct rt_wdb *wdb) @@ -596,7 +599,7 @@ goto bin; case OP_XOR: Tcl_DStringAppendElement(dsp, "^"); - bin: + bin: Tcl_DStringStartSublist(dsp); db_tcl_tree_describe(dsp, tp->tr_b.tb_left); Tcl_DStringEndSublist(dsp); @@ -616,7 +619,7 @@ goto unary; case OP_XNOP: Tcl_DStringAppendElement(dsp, "X"); - unary: + unary: Tcl_DStringStartSublist(dsp); db_tcl_tree_describe(dsp, tp->tr_b.tb_left); Tcl_DStringEndSublist(dsp); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <br...@us...> - 2009-06-23 23:23:54
|
Revision: 34863 http://brlcad.svn.sourceforge.net/brlcad/?rev=34863&view=rev Author: brlcad Date: 2009-06-23 23:23:52 +0000 (Tue, 23 Jun 2009) Log Message: ----------- break out arb8 mirroring, modify all the mirror function signatures to not take a pointer, instead just taking a plant_t Modified Paths: -------------- brlcad/trunk/src/librt/CMakeLists.txt brlcad/trunk/src/librt/Makefile.am brlcad/trunk/src/librt/primitives/ell/ell_mirror.c brlcad/trunk/src/librt/primitives/mirror.c brlcad/trunk/src/librt/primitives/tgc/tgc_mirror.c brlcad/trunk/src/librt/primitives/tor/tor_mirror.c Added Paths: ----------- brlcad/trunk/src/librt/primitives/arb8/arb8_mirror.c Modified: brlcad/trunk/src/librt/CMakeLists.txt =================================================================== --- brlcad/trunk/src/librt/CMakeLists.txt 2009-06-23 23:11:24 UTC (rev 34862) +++ brlcad/trunk/src/librt/CMakeLists.txt 2009-06-23 23:23:52 UTC (rev 34863) @@ -41,6 +41,7 @@ pr.c prep.c primitives/arb8/arb8.c + primitives/arb8/arb8_mirror.c primitives/arbn/arbn.c primitives/ars/ars.c primitives/bot/bot.c Modified: brlcad/trunk/src/librt/Makefile.am =================================================================== --- brlcad/trunk/src/librt/Makefile.am 2009-06-23 23:11:24 UTC (rev 34862) +++ brlcad/trunk/src/librt/Makefile.am 2009-06-23 23:23:52 UTC (rev 34863) @@ -72,6 +72,7 @@ pr.c \ prep.c \ primitives/arb8/arb8.c \ + primitives/arb8/arb8_mirror.c \ primitives/arbn/arbn.c \ primitives/ars/ars.c \ primitives/bot/bot.c \ Added: brlcad/trunk/src/librt/primitives/arb8/arb8_mirror.c =================================================================== --- brlcad/trunk/src/librt/primitives/arb8/arb8_mirror.c (rev 0) +++ brlcad/trunk/src/librt/primitives/arb8/arb8_mirror.c 2009-06-23 23:23:52 UTC (rev 34863) @@ -0,0 +1,104 @@ +/* A R B 8 _ M I R R O R . C + * BRL-CAD + * + * Copyright (c) 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. + */ +/** @file arb8_mirror.c + * + * mirror support + * + */ + +#include "common.h" + +#include "raytrace.h" +#include "rtgeom.h" + + +/** + * R T _ A R 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_arb_mirror(struct rt_db_internal *ip, register const plane_t plane) +{ + struct rt_arb_internal *arb; + + 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; + + point_t pt; + int i; + + static point_t origin = {0.0, 0.0, 0.0}; + + RT_CK_DB_INTERNAL(ip); + + arb = (struct rt_arb_internal *)ip->idb_ptr; + RT_ARB_CK_MAGIC(arb); + + 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]; + + /* mirror each vertex */ + for (i=0; i<8; i++) { + VMOVE(pt, arb->pt[i]); + MAT4X3PNT(arb->pt[i], mirmat, pt); + } + + 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/primitives/arb8/arb8_mirror.c ___________________________________________________________________ Added: svn:mime-type + text/plain Added: svn:eol-style + native Modified: brlcad/trunk/src/librt/primitives/ell/ell_mirror.c =================================================================== --- brlcad/trunk/src/librt/primitives/ell/ell_mirror.c 2009-06-23 23:11:24 UTC (rev 34862) +++ brlcad/trunk/src/librt/primitives/ell/ell_mirror.c 2009-06-23 23:23:52 UTC (rev 34863) @@ -36,11 +36,10 @@ * object's values about the given transformation matrix. */ int -rt_ell_mirror(struct rt_db_internal *ip, register const plane_t *plane) +rt_ell_mirror(struct rt_db_internal *ip, register const plane_t plane) { struct rt_ell_internal *ell; - mat_t mat; mat_t mirmat; mat_t rmat; mat_t temp; @@ -48,9 +47,10 @@ vect_t xvec; vect_t mirror_dir; point_t mirror_pt; + fastf_t ang; + mat_t mat; point_t pt; - fastf_t ang; vect_t a, b, c; vect_t n; @@ -63,8 +63,8 @@ MAT_IDN(mirmat); - VMOVE(mirror_dir, *plane); - VSCALE(mirror_pt, *plane, (*plane)[W]); + 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 */ Modified: brlcad/trunk/src/librt/primitives/mirror.c =================================================================== --- brlcad/trunk/src/librt/primitives/mirror.c 2009-06-23 23:11:24 UTC (rev 34862) +++ brlcad/trunk/src/librt/primitives/mirror.c 2009-06-23 23:23:52 UTC (rev 34863) @@ -37,6 +37,17 @@ #include "nurb.h" +/* FIXME: temporary until all mirror functions are migrated and the + * functab is utilized. + */ +#define RT_DECLARE_MIRROR(name) BU_EXTERN(int rt_##name##_mirror, (struct rt_db_internal *ip, const plane_t plane)); + +RT_DECLARE_MIRROR(tor); +RT_DECLARE_MIRROR(tgc); +RT_DECLARE_MIRROR(ell); +RT_DECLARE_MIRROR(arb); + + /** * Mirror an object about some axis at a specified point on the axis. * It is the caller's responsibility to retain and free the internal. @@ -61,10 +72,7 @@ vect_t xvec; static fastf_t tol_dist_sq = 0.005 * 0.005; static point_t origin = {0.0, 0.0, 0.0}; - plane_t plane; - fastf_t dist; - fastf_t dot; - point_t pnt; + plane_t plane; RT_CK_DBI(dbip); RT_CK_DB_INTERNAL(ip); @@ -120,89 +128,89 @@ err = rt_ell_mirror(ip, plane); return err ? NULL : ip; } -#if 0 case ID_ARB8: { - err = rt_arb8_mirror(ip, plane); + err = rt_arb_mirror(ip, plane); return err ? NULL : ip; } +#if 0 case ID_HALF: { - err = rt_half_mirror(ip, plane); + err = rt_half_mirror(ip, &plane); return err ? NULL : ip; } case ID_GRIP: { - err = rt_grip_mirror(ip, plane); + err = rt_grip_mirror(ip, &plane); return err ? NULL : ip; } case ID_POLY: { - err = rt_poly_mirror(ip, plane); + err = rt_poly_mirror(ip, &plane); return err ? NULL : ip; } case ID_BSPLINE: { - err = rt_nurb_mirror(ip, plane); + err = rt_nurb_mirror(ip, &plane); return err ? NULL : ip; } case ID_ARBN: { - err = rt_arbn_mirror(ip, plane); + err = rt_arbn_mirror(ip, &plane); return err ? NULL : ip; } case ID_PIPE: { - err = rt_pipe_mirror(ip, plane); + err = rt_pipe_mirror(ip, &plane); return err ? NULL : ip; } case ID_PARTICLE: { - err = rt_particle_mirror(ip, plane); + err = rt_particle_mirror(ip, &plane); return err ? NULL : ip; } case ID_RPC: { - err = rt_rpc_mirror(ip, plane); + err = rt_rpc_mirror(ip, &plane); return err ? NULL : ip; } case ID_RHC: { - err = rt_rhc_mirror(ip, plane); + err = rt_rhc_mirror(ip, &plane); return err ? NULL : ip; } case ID_EPA: { - err = rt_epa_mirror(ip, plane); + err = rt_epa_mirror(ip, &plane); return err ? NULL : ip; } case ID_ETO: { - err = rt_eto_mirror(ip, plane); + err = rt_eto_mirror(ip, &plane); return err ? NULL : ip; } case ID_HYP: { - err = rt_hyp_mirror(ip, plane); + err = rt_hyp_mirror(ip, &plane); return err ? NULL : ip; } case ID_NMG: { - err = rt_nmg_mirror(ip, plane); + err = rt_nmg_mirror(ip, &plane); return err ? NULL : ip; } case ID_ARS: { - err = rt_ars_mirror(ip, plane); + err = rt_ars_mirror(ip, &plane); return err ? NULL : ip; } case ID_EBM: { - err = rt_ebm_mirror(ip, plane); + err = rt_ebm_mirror(ip, &plane); return err ? NULL : ip; } case ID_DSP: { - err = rt_dsp_mirror(ip, plane); + err = rt_dsp_mirror(ip, &plane); return err ? NULL : ip; } case ID_VOL: { - err = rt_vol_mirror(ip, plane); + err = rt_vol_mirror(ip, &plane); return err ? NULL : ip; } case ID_SUPERELL: { - err = rt_superell_mirror(ip, plane); + err = rt_superell_mirror(ip, &plane); return err ? NULL : ip; } case ID_COMBINATION: { - err = rt_comb_mirror(ip, plane); + err = rt_comb_mirror(ip, &plane); return err ? NULL : ip; } case ID_BOT: { - err = rt_bot_mirror(ip, plane); + err = rt_bot_mirror(ip, &plane); return err ? NULL : ip; } default: { @@ -235,22 +243,6 @@ mirmat[3 + Z*4] += 2.0 * mirror_pt[Z] * mirror_dir[Z]; switch (id) { - case ID_ARB8: { - struct rt_arb_internal *arb; - - arb = (struct rt_arb_internal *)ip->idb_ptr; - RT_ARB_CK_MAGIC(arb); - - /* mirror each vertex */ - for (i=0; i<8; i++) { - point_t pt; - - VMOVE(pt, arb->pt[i]); - MAT4X3PNT(arb->pt[i], mirmat, pt); - } - - break; - } case ID_HALF: { struct rt_half_internal *haf; vect_t n1; Modified: brlcad/trunk/src/librt/primitives/tgc/tgc_mirror.c =================================================================== --- brlcad/trunk/src/librt/primitives/tgc/tgc_mirror.c 2009-06-23 23:11:24 UTC (rev 34862) +++ brlcad/trunk/src/librt/primitives/tgc/tgc_mirror.c 2009-06-23 23:23:52 UTC (rev 34863) @@ -36,11 +36,10 @@ * object's values about the given transformation matrix. */ int -rt_tgc_mirror(struct rt_db_internal *ip, register const plane_t *plane) +rt_tgc_mirror(struct rt_db_internal *ip, register const plane_t plane) { struct rt_tgc_internal *tgc; - mat_t mat; mat_t mirmat; mat_t rmat; mat_t temp; @@ -48,9 +47,10 @@ vect_t xvec; vect_t mirror_dir; point_t mirror_pt; + fastf_t ang; + mat_t mat; point_t pt; - fastf_t ang; vect_t h; vect_t a, b, c, d; vect_t n; @@ -64,8 +64,8 @@ MAT_IDN(mirmat); - VMOVE(mirror_dir, *plane); - VSCALE(mirror_pt, *plane, (*plane)[W]); + 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 */ Modified: brlcad/trunk/src/librt/primitives/tor/tor_mirror.c =================================================================== --- brlcad/trunk/src/librt/primitives/tor/tor_mirror.c 2009-06-23 23:11:24 UTC (rev 34862) +++ brlcad/trunk/src/librt/primitives/tor/tor_mirror.c 2009-06-23 23:23:52 UTC (rev 34863) @@ -36,11 +36,10 @@ * object's values about the given transformation matrix. */ int -rt_tor_mirror(struct rt_db_internal *ip, register const plane_t *plane) +rt_tor_mirror(struct rt_db_internal *ip, register const plane_t plane) { struct rt_tor_internal *tor; - mat_t mat; mat_t mirmat; mat_t rmat; mat_t temp; @@ -48,9 +47,10 @@ vect_t xvec; vect_t mirror_dir; point_t mirror_pt; + fastf_t ang; point_t pt; - fastf_t ang; + mat_t mat; vect_t h; vect_t n; @@ -63,8 +63,8 @@ MAT_IDN(mirmat); - VMOVE(mirror_dir, *plane); - VSCALE(mirror_pt, *plane, (*plane)[W]); + 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 */ This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <br...@us...> - 2009-07-08 21:16:08
|
Revision: 35020 http://brlcad.svn.sourceforge.net/brlcad/?rev=35020&view=rev Author: brlcad Date: 2009-07-08 21:15:58 +0000 (Wed, 08 Jul 2009) Log Message: ----------- move the inline distribute() function over to the only place it's actually used in opennurbs_ext.cpp until it's actually needed elsewhere (in which case it probably belongs in the header if it needs to be inline) Modified Paths: -------------- brlcad/trunk/src/librt/opennurbs_ext.cpp brlcad/trunk/src/librt/primitives/brep/brep.cpp Modified: brlcad/trunk/src/librt/opennurbs_ext.cpp =================================================================== --- brlcad/trunk/src/librt/opennurbs_ext.cpp 2009-07-08 21:14:38 UTC (rev 35019) +++ brlcad/trunk/src/librt/opennurbs_ext.cpp 2009-07-08 21:15:58 UTC (rev 35020) @@ -50,6 +50,17 @@ namespace brlcad { + + inline void + distribute(const int count, const ON_3dVector* v, double x[], double y[], double z[]) + { + for (int i = 0; i < count; i++) { + x[i] = v[i].x; + y[i] = v[i].y; + z[i] = v[i].z; + } + } + //-------------------------------------------------------------------------------- // CurveTree CurveTree::CurveTree(ON_BrepFace* face) Modified: brlcad/trunk/src/librt/primitives/brep/brep.cpp =================================================================== --- brlcad/trunk/src/librt/primitives/brep/brep.cpp 2009-07-08 21:14:38 UTC (rev 35019) +++ brlcad/trunk/src/librt/primitives/brep/brep.cpp 2009-07-08 21:15:58 UTC (rev 35020) @@ -153,15 +153,6 @@ } } -inline void -distribute(const int count, const ON_3dVector* v, double x[], double y[], double z[]) -{ - for (int i = 0; i < count; i++) { - x[i] = v[i].x; - y[i] = v[i].y; - z[i] = v[i].z; - } -} bool brep_pt_trimmed(pt2d_t pt, const ON_BrepFace& face) { This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <br...@us...> - 2009-07-14 14:58:15
|
Revision: 35106 http://brlcad.svn.sourceforge.net/brlcad/?rev=35106&view=rev Author: brlcad Date: 2009-07-14 14:58:13 +0000 (Tue, 14 Jul 2009) Log Message: ----------- refactor the tolerances being used into TOL and TOL2 to make it more apparent that there are two numbers being used. should test and document the effect of tightening/loosening these tolerances or make them functions if they need to be dynamic based on model parameters. Modified Paths: -------------- brlcad/trunk/src/librt/opennurbs_cleanup.cpp brlcad/trunk/src/librt/opennurbs_ext.cpp Modified: brlcad/trunk/src/librt/opennurbs_cleanup.cpp =================================================================== --- brlcad/trunk/src/librt/opennurbs_cleanup.cpp 2009-07-14 14:46:25 UTC (rev 35105) +++ brlcad/trunk/src/librt/opennurbs_cleanup.cpp 2009-07-14 14:58:13 UTC (rev 35106) @@ -41,10 +41,16 @@ #include "opennurbs_ext.h" -// grows 3D BBox along each axis by this factor +/// grows 3D BBox along each axis by this factor #define BBOX_GROW_3D 0.1 +/// arbitrary calculation tolerance (need to try VDIVIDE_TOL or VUNITIZE_TOL to tighten the bounds) +#define TOL 0.000001 +/// another arbitrary calculation tolerance (need to try VDIVIDE_TOL or VUNITIZE_TOL to tighten the bounds) +#define TOL2 0.00001 + + namespace brlcad { //-------------------------------------------------------------------------------- // CurveTree @@ -83,7 +89,7 @@ for (int i = 1; i <= knotcnt; i++) { double xmax = knots[i]; ON_Interval tc(min,xmax); - if (!NEAR_ZERO(xmax-min,0.000001)) { + if (!NEAR_ZERO(xmax-min,TOL)) { BRNode* childnode = new BRNode(face,loop,trimCurve,tc,innerLoop); trimnode->addChild(childnode); } @@ -104,7 +110,7 @@ // is done, add trimnode to the loopnode child list. for( list<double>::iterator l=splitlist.begin();l != splitlist.end();l++) { double xmax = *l; - if (!NEAR_ZERO(xmax-min,0.000001)) { + if (!NEAR_ZERO(xmax-min,TOL)) { GetBAChildren(trimnode,1,min,xmax); loopnode->addChild(trimnode); } @@ -150,7 +156,7 @@ for (list<BRNode*>::iterator i = m_sortedX.begin(); i != m_sortedX.end(); i++) { BRNode* br = dynamic_cast<BRNode*>(*i); br->GetBBox(bmin,bmax); - dist = 0.000001;//0.03*DIST_PT_PT(bmin,bmax); + dist = TOL;//0.03*DIST_PT_PT(bmin,bmax); if (bmax[X]+dist < u[0]) continue; if (bmin[X]-dist < u[1]) { @@ -169,17 +175,17 @@ // first lets check end points tangent = curve->TangentAt(max); - if (NEAR_ZERO(tangent.x,0.00001) ) + if (NEAR_ZERO(tangent.x,TOL2) ) return max; tangent = curve->TangentAt(min); - if (NEAR_ZERO(tangent.x,0.00001) ) + if (NEAR_ZERO(tangent.x,TOL2) ) return min; tanmin = (tangent[X] < 0.0); - while ( (max-min) > 0.00001 ) { + while ( (max-min) > TOL2 ) { mid = (max + min)/2.0; tangent = curve->TangentAt(mid); - if (NEAR_ZERO(tangent[X], 0.00001)) { + if (NEAR_ZERO(tangent[X], TOL2)) { return mid; } if ( (tangent[X] < 0.0) == tanmin ) { @@ -199,17 +205,17 @@ // first lets check end points tangent = curve->TangentAt(max); - if (NEAR_ZERO(tangent.y,0.00001) ) + if (NEAR_ZERO(tangent.y,TOL2) ) return max; tangent = curve->TangentAt(min); - if (NEAR_ZERO(tangent.y,0.00001) ) + if (NEAR_ZERO(tangent.y,TOL2) ) return min; tanmin = (tangent[Y] < 0.0); - while ( (max-min) > 0.00001 ) { + while ( (max-min) > TOL2 ) { mid = (max + min)/2.0; tangent = curve->TangentAt(mid); - if (NEAR_ZERO(tangent[Y], 0.00001)) { + if (NEAR_ZERO(tangent[Y], TOL2)) { return mid; } if ( (tangent[Y] < 0.0) == tanmin ) { @@ -270,7 +276,7 @@ ydelta = (p2[Y] - p1[Y]); slopey = (ydelta < 0.0); - if ( NEAR_ZERO(xdelta, 0.000001) || NEAR_ZERO(ydelta, 0.000001)) { + if ( NEAR_ZERO(xdelta, TOL) || NEAR_ZERO(ydelta, TOL)) { return true; } @@ -498,8 +504,8 @@ for (int j = 0; j < 3; j++) { double d = quads[i]->m_BBox.m_max[j] - quads[i]->m_BBox.m_min[j]; if (ON_NearZero(d, ON_ZERO_TOLERANCE)) { - quads[i]->m_BBox.m_min[j] -= 0.001; - quads[i]->m_BBox.m_max[j] += 0.001; + quads[i]->m_BBox.m_min[j] -= ON_ZERO_TOLERANCE; + quads[i]->m_BBox.m_max[j] += ON_ZERO_TOLERANCE; } } } Modified: brlcad/trunk/src/librt/opennurbs_ext.cpp =================================================================== --- brlcad/trunk/src/librt/opennurbs_ext.cpp 2009-07-14 14:46:25 UTC (rev 35105) +++ brlcad/trunk/src/librt/opennurbs_ext.cpp 2009-07-14 14:58:13 UTC (rev 35106) @@ -44,10 +44,17 @@ #define UNIVERSAL_SAMPLE_COUNT 1001 #define BBOX_GROW 0.0 -// grows 3D BBox along each axis by this factor + +/// grows 3D BBox along each axis by this factor #define BBOX_GROW_3D 0.1 +/// arbitrary calculation tolerance (need to try VDIVIDE_TOL or VUNITIZE_TOL to tighten the bounds) +#define TOL 0.000001 +/// another arbitrary calculation tolerance (need to try VDIVIDE_TOL or VUNITIZE_TOL to tighten the bounds) +#define TOL2 0.00001 + + namespace brlcad { @@ -220,7 +227,7 @@ } for (list<double>::iterator l=splitlist.begin();l != splitlist.end();l++) { double xmax = *l; - if (!NEAR_ZERO(xmax-min, 0.000001)) { + if (!NEAR_ZERO(xmax-min, TOL)) { m_root->addChild(subdivideCurve(trimCurve,adj_face_index,min,xmax,innerLoop,0)); } min = xmax; @@ -233,7 +240,7 @@ trimCurve->GetSpanVector(knots); for (int i=1;i<=knotcnt;i++) { double xmax = knots[i]; - if (!NEAR_ZERO(xmax-min, 0.000001)) { + if (!NEAR_ZERO(xmax-min, TOL)) { m_root->addChild(subdivideCurve(trimCurve,adj_face_index,min,xmax,innerLoop,0)); } min = xmax; @@ -241,7 +248,7 @@ delete knots; } #endif - if (!NEAR_ZERO(max-min, 0.000001)) { + if (!NEAR_ZERO(max-min, TOL)) { m_root->addChild(subdivideCurve(trimCurve,adj_face_index,min,max,innerLoop,0)); } } @@ -298,7 +305,7 @@ SubcurveBRNode* br = dynamic_cast<SubcurveBRNode*>(*i); br->GetBBox(bmin, bmax); - dist = 0.000001;//0.03*DIST_PT_PT(bmin, bmax); + dist = TOL;//0.03*DIST_PT_PT(bmin, bmax); if (bmax[X]+dist < u[0]) continue; if (bmin[X]-dist < u[1]) { @@ -316,7 +323,7 @@ for (list<BRNode*>::iterator i = m_sortedX.begin(); i != m_sortedX.end(); i++) { SubcurveBRNode* br = dynamic_cast<SubcurveBRNode*>(*i); br->GetBBox(bmin, bmax); - dist = 0.000001; //0.03*DIST_PT_PT(bmin, bmax); + dist = TOL; //0.03*DIST_PT_PT(bmin, bmax); if (bmax[Y]+dist < v[0]) continue; if (bmin[Y]-dist < v[1]) { @@ -336,17 +343,17 @@ // first lets check end points tangent = curve->TangentAt(max); - if (NEAR_ZERO(tangent.x, 0.00001)) + if (NEAR_ZERO(tangent.x, TOL2)) return max; tangent = curve->TangentAt(min); - if (NEAR_ZERO(tangent.x, 0.00001)) + if (NEAR_ZERO(tangent.x, TOL2)) return min; tanmin = (tangent[X] < 0.0); - while ((max-min) > 0.00001) { + while ((max-min) > TOL2) { mid = (max + min)/2.0; tangent = curve->TangentAt(mid); - if (NEAR_ZERO(tangent[X], 0.00001)) { + if (NEAR_ZERO(tangent[X], TOL2)) { return mid; } if ((tangent[X] < 0.0) == tanmin) { @@ -366,17 +373,17 @@ // first lets check end points tangent = curve->TangentAt(max); - if (NEAR_ZERO(tangent.y, 0.00001)) + if (NEAR_ZERO(tangent.y, TOL2)) return max; tangent = curve->TangentAt(min); - if (NEAR_ZERO(tangent.y, 0.00001)) + if (NEAR_ZERO(tangent.y, TOL2)) return min; tanmin = (tangent[Y] < 0.0); - while ((max-min) > 0.00001) { + while ((max-min) > TOL2) { mid = (max + min)/2.0; tangent = curve->TangentAt(mid); - if (NEAR_ZERO(tangent[Y], 0.00001)) { + if (NEAR_ZERO(tangent[Y], TOL2)) { return mid; } if ((tangent[Y] < 0.0) == tanmin) { @@ -438,8 +445,8 @@ ydelta = (p2[Y] - p1[Y]); slopey = (ydelta < 0.0); - if (NEAR_ZERO(xdelta, 0.000001) || - NEAR_ZERO(ydelta, 0.000001)) { + if (NEAR_ZERO(xdelta, TOL) || + NEAR_ZERO(ydelta, TOL)) { return true; } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sta...@us...> - 2009-07-14 22:59:34
|
Revision: 35119 http://brlcad.svn.sourceforge.net/brlcad/?rev=35119&view=rev Author: starseeker Date: 2009-07-14 22:59:32 +0000 (Tue, 14 Jul 2009) Log Message: ----------- Inching closer to behavior of original curve tree build - still have a ways to go, probably. Modified Paths: -------------- brlcad/trunk/src/librt/opennurbs_cleanup.cpp brlcad/trunk/src/librt/primitives/brep/brep_cleanup.cpp Modified: brlcad/trunk/src/librt/opennurbs_cleanup.cpp =================================================================== --- brlcad/trunk/src/librt/opennurbs_cleanup.cpp 2009-07-14 22:48:12 UTC (rev 35118) +++ brlcad/trunk/src/librt/opennurbs_cleanup.cpp 2009-07-14 22:59:32 UTC (rev 35119) @@ -144,8 +144,8 @@ // further based on horizontal and vertical tangents. list<double> splitlist; for(int i=1;i<=knotcnt;i++) { - ON_Interval t(knots[i-1],knots[i]); - getHVTangents(trimCurve,t,splitlist); + ON_Interval tk(knots[i-1],knots[i]); + getHVTangents(trimCurve,tk,splitlist); } // Once split, pass each sub-interval to a routine that // will build a tree containing nodes and leaves with @@ -156,11 +156,10 @@ for(list<double>::iterator l=splitlist.begin();l != splitlist.end();l++) { double xmax = *l; knotinterval++; - ON_Interval t(knots[knotinterval-1],knots[knotinterval]); + ON_Interval tk(knots[knotinterval-1],knots[knotinterval]); if (!NEAR_ZERO(xmax-min,TOL)) { - bu_log("min = %f, max = %f\n", min, xmax); - BRNode* trimnode = new BRNode(face,loop,trimCurve,t,innerLoop); - GetBAChildren(trimnode,1,min,xmax); + BRNode* trimnode = new BRNode(face,loop,trimCurve,tk,innerLoop); + if (!(isLinear(trimCurve, min, xmax))) GetBAChildren(trimnode,1,min,xmax); loopnode->addChild(trimnode); } min = xmax; @@ -169,17 +168,21 @@ } else { for (int i=1;i<=knotcnt;i++) { double xmax = knots[i]; - ON_Interval t(knots[i-1],knots[i]); + ON_Interval tk(knots[i-1],knots[i]); if (!NEAR_ZERO(xmax-min, TOL)) { - bu_log("min = %f, max = %f\n", min, xmax); - BRNode* trimnode = new BRNode(face,loop,trimCurve,t,innerLoop); - GetBAChildren(trimnode,1,min,xmax); + BRNode* trimnode = new BRNode(face,loop,trimCurve,tk,innerLoop); + if (!(isLinear(trimCurve, min, xmax))) GetBAChildren(trimnode,1,min,xmax); loopnode->addChild(trimnode); } min = xmax; } delete knots; } + if (!NEAR_ZERO(max-min, TOL)) { + BRNode* trimnode = new BRNode(face,loop,trimCurve,t,innerLoop); + if (!(isLinear(trimCurve, min, max))) GetBAChildren(trimnode,1,min,max); + } + } // Build loopnode bbox from child nodes ParentBBBuild(loopnode); @@ -365,21 +368,25 @@ void CurveTree::GetBAChildren(BRNode* parent, int depth, double min, double max) { -// bu_log("depth: %d, min: %d, max: %d\n", depth, min, max); + //bu_log("%d %d %d\n", depth, min, max); double mid = (max + min) / 2.0; ON_Interval tl(min, mid); ON_Interval tr(mid, max); BRNode* left = new BRNode(parent->m_face, parent->m_loop, parent->m_curve, tl, parent->m_innerTrim); BRNode* right = new BRNode(parent->m_face, parent->m_loop, parent->m_curve, tr, parent->m_innerTrim); - TrimBBBuild(left); - TrimBBBuild(right); +// TrimBBBuild(left); +// TrimBBBuild(right); // bu_log("left bbox: m_min: (%f,%f,%f), m_max: (%f,%f,%f)\n", left->m_BBox.m_min[0], left->m_BBox.m_min[1], left->m_BBox.m_min[2], left->m_BBox.m_max[0], left->m_BBox.m_max[1], left->m_BBox.m_max[2]); // bu_log("right bbox: m_min: (%f,%f,%f), m_max: (%f,%f,%f)\n", right->m_BBox.m_min[0], right->m_BBox.m_min[1], right->m_BBox.m_min[2], right->m_BBox.m_max[0], right->m_BBox.m_max[1], right->m_BBox.m_max[2]); - if (!(isLinear(parent->m_curve, min, mid))) { + if (!(isLinear(parent->m_curve, min, mid)) && depth >= BREP_MAX_LN_DEPTH) { GetBAChildren(left, depth + 1, min, mid); + } else { + TrimBBBuild(left); } if (!(isLinear(parent->m_curve, mid, max))) { GetBAChildren(right, depth + 1, mid, max); + } else { + TrimBBBuild(right); } parent->addChild(left); parent->addChild(right); @@ -556,7 +563,7 @@ parent->m_normals[6], parent->m_normals[7], parent->m_normals[9], parent->m_normals[11], parent->m_normals[12]); for (int i = 0; i < 4; i++) { - if (/*(quads[i]->NodeTrimmed() != 1) &&*/ !(quads[i]->isFlat()) && depth < BREP_MAX_FT_DEPTH) { + if (/*(quads[i]->NodeTrimmed() != 1) && */ !(quads[i]->isFlat()) && depth < BREP_MAX_FT_DEPTH) { GetBVChildren(quads[i],depth+1); } else { point_t min, max; Modified: brlcad/trunk/src/librt/primitives/brep/brep_cleanup.cpp =================================================================== --- brlcad/trunk/src/librt/primitives/brep/brep_cleanup.cpp 2009-07-14 22:48:12 UTC (rev 35118) +++ brlcad/trunk/src/librt/primitives/brep/brep_cleanup.cpp 2009-07-14 22:59:32 UTC (rev 35119) @@ -2682,7 +2682,7 @@ ON_BrepFace& f = brep->m_F[i]; CurveTree* ct = new CurveTree(&f); SurfaceTree* st = new SurfaceTree(&f, ct); - plot_bbnode(st->getRootNode(), vhead, 0, 0, 2); + plot_bbnode(st->getRootNode(), vhead, 0, 0, 8); } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sta...@us...> - 2009-08-19 15:58:14
|
Revision: 35631 http://brlcad.svn.sourceforge.net/brlcad/?rev=35631&view=rev Author: starseeker Date: 2009-08-19 15:57:58 +0000 (Wed, 19 Aug 2009) Log Message: ----------- Start fooling around with approaches to createing an eto brep. Modified Paths: -------------- brlcad/trunk/src/librt/Makefile.am Added Paths: ----------- brlcad/trunk/src/librt/primitives/eto/eto_brep.cpp Modified: brlcad/trunk/src/librt/Makefile.am =================================================================== --- brlcad/trunk/src/librt/Makefile.am 2009-08-19 15:51:54 UTC (rev 35630) +++ brlcad/trunk/src/librt/Makefile.am 2009-08-19 15:57:58 UTC (rev 35631) @@ -223,6 +223,7 @@ parse.c \ pmalloc.c \ primitives/bot/g_bot_include.c \ + primitives/eto/eto_brep.cpp \ primitives/nmg/nmg_brep.cpp \ timer-nt.c \ timer52brl.c \ Added: brlcad/trunk/src/librt/primitives/eto/eto_brep.cpp =================================================================== --- brlcad/trunk/src/librt/primitives/eto/eto_brep.cpp (rev 0) +++ brlcad/trunk/src/librt/primitives/eto/eto_brep.cpp 2009-08-19 15:57:58 UTC (rev 35631) @@ -0,0 +1,116 @@ +/* E L L _ B R E P . C P P + * BRL-CAD + * + * Copyright (c) 2008-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. + */ +/** @file ell_brep.cpp + * + * Convert a Generalized Ellipsoid to b-rep form + * + */ + +#include "common.h" + +#include "raytrace.h" +#include "rtgeom.h" +#include "brep.h" + + + +/** + * R T _ E T O _ B R E P + */ +extern "C" void +rt_eto_brep(ON_Brep **b, const struct rt_db_internal *ip, const struct bn_tol *tol) +{ + mat_t R; + mat_t S; + struct rt_eto_internal *eip; + + *b = NULL; + + RT_CK_DB_INTERNAL(ip); + eip = (struct rt_eto_internal *)ip->idb_ptr; + RT_ETO_CK_MAGIC(eip); + + point_t p_origin; + vect_t v1, x_dir, y_dir; + ON_3dPoint plane_origin, plane_x_dir, plane_y_dir; + + double ell_axis_len_1, ell_axis_len_2; + + // First, find a plane in 3 space with both x and y axis + // along an axis of the ellipse to be rotated, and its + // coordinate origin at the center of the ellipse. + // + // To identify a point on the eto suitable for use (there + // are of course infinitely many such points described by + // a circle at radius eto_r from the eto vertex) obtain + // a vector at a right angle to the eto normal, unitize it + // and scale it. + + bn_vec_ortho( v1, eip->eto_N ); + VUNITIZE( v1 ); + VSCALE(v1, v1, eip->eto_r); + VSET(p_origin, v1[0], v1[1], v1[2]); + VMOVE(x_dir, eip->eto_C); + VUNITIZE( x_dir ); + bn_vec_ortho( y_dir, eip->eto_C ); + VUNITIZE( y_dir ); + plane_origin = ON_3dPoint(p_origin); + plane_x_dir = ON_3dVector(x_dir); + plane_y_dir = ON_3dVector(y_dir); + + const ON_Plane* ell_plane = new ON_Plane(plane_origin, plane_x_dir, plane_y_dir); + + + + // Once the plane has been created, create the ellipse + // within the plane. + ell_axis_len_1 = MAGNITUDE(eip->eto_C); + ell_axis_len_2 = eip->eto_rd; + ON_Ellipse* ellipse = new ON_Ellipse(ell_plane, ell_axis_len_1, ell_axis_len_2); + + + // Generate an ON_Curve from the ellipse and revolve it + // around eto_N + + ON_NurbsCurve* ellcurve = ellipse->GetNurbsForm(); + ON_Line* revaxis = eip->eto_V, eip->eto_N; + + ON_RevSurface* eto_surf = ON_RevSurface::New(); + eto_surf->m_curve = ellcurve; + eto_surf->m_axis = revaxis; + eto_surf->m_angle = angle; + eto_surf->m_t = t; + + /* Create brep with one face*/ + *b = ON_Brep::New(); + (*b)->NewFace(*brep_ell_surf(unit2model)); +// (*b)->Standardize(); + // (*b)->Compact(); +} + +// Local Variables: +// tab-width: 8 +// mode: C++ +// c-basic-offset: 4 +// indent-tabs-mode: t +// c-file-style: "stroustrup" +// End: +// ex: shiftwidth=4 tabstop=8 + Property changes on: brlcad/trunk/src/librt/primitives/eto/eto_brep.cpp ___________________________________________________________________ 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: <sta...@us...> - 2009-08-21 19:28:32
|
Revision: 35677 http://brlcad.svn.sourceforge.net/brlcad/?rev=35677&view=rev Author: starseeker Date: 2009-08-21 19:28:19 +0000 (Fri, 21 Aug 2009) Log Message: ----------- Turn on nmg->brep cpp file - looks like this is the correct next step. Modified Paths: -------------- brlcad/trunk/src/librt/Makefile.am brlcad/trunk/src/librt/primitives/nmg/nmg_brep.cpp Modified: brlcad/trunk/src/librt/Makefile.am =================================================================== --- brlcad/trunk/src/librt/Makefile.am 2009-08-21 19:24:30 UTC (rev 35676) +++ brlcad/trunk/src/librt/Makefile.am 2009-08-21 19:28:19 UTC (rev 35677) @@ -129,6 +129,7 @@ primitives/mirror.c \ primitives/nmg/nmg.c \ primitives/nmg/nmg_bool.c \ + primitives/nmg/nmg_brep.cpp \ primitives/nmg/nmg_ck.c \ primitives/nmg/nmg_class.c \ primitives/nmg/nmg_eval.c \ @@ -225,7 +226,6 @@ parse.c \ pmalloc.c \ primitives/bot/g_bot_include.c \ - primitives/nmg/nmg_brep.cpp \ timer-nt.c \ timer52brl.c \ timerhep.c \ Modified: brlcad/trunk/src/librt/primitives/nmg/nmg_brep.cpp =================================================================== --- brlcad/trunk/src/librt/primitives/nmg/nmg_brep.cpp 2009-08-21 19:24:30 UTC (rev 35676) +++ brlcad/trunk/src/librt/primitives/nmg/nmg_brep.cpp 2009-08-21 19:28:19 UTC (rev 35677) @@ -130,10 +130,6 @@ struct faceuse *fu; - printf("rt_arb_tess\n"); - rt_arb_tess(&r, m, ip, NULL, tol); - printf("rt_arb_tess completed\n"); - /* RT_CK_DB_INTERNAL(ip); m = (struct model *)ip->idb_ptr; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <d_r...@us...> - 2009-10-30 09:48:36
|
Revision: 36351 http://brlcad.svn.sourceforge.net/brlcad/?rev=36351&view=rev Author: d_rossberg Date: 2009-10-30 09:48:27 +0000 (Fri, 30 Oct 2009) Log Message: ----------- vector.h was renamed to dvec.h because of possible a conflict with a STL header file name Modified Paths: -------------- brlcad/trunk/src/librt/opennurbs_ext.cpp brlcad/trunk/src/librt/primitives/brep/brep.cpp brlcad/trunk/src/librt/primitives/brep/brep_debug.cpp brlcad/trunk/src/librt/primitives/brep/brep_debug.h Modified: brlcad/trunk/src/librt/opennurbs_ext.cpp =================================================================== --- brlcad/trunk/src/librt/opennurbs_ext.cpp 2009-10-30 08:53:14 UTC (rev 36350) +++ brlcad/trunk/src/librt/opennurbs_ext.cpp 2009-10-30 09:48:27 UTC (rev 36351) @@ -34,7 +34,7 @@ #include "vmath.h" #include "bu.h" -#include "vector.h" +#include "dvec.h" #include "opennurbs_ext.h" Modified: brlcad/trunk/src/librt/primitives/brep/brep.cpp =================================================================== --- brlcad/trunk/src/librt/primitives/brep/brep.cpp 2009-10-30 08:53:14 UTC (rev 36350) +++ brlcad/trunk/src/librt/primitives/brep/brep.cpp 2009-10-30 09:48:27 UTC (rev 36351) @@ -41,7 +41,7 @@ #include "vmath.h" #include "brep.h" -#include "vector.h" +#include "dvec.h" #include "raytrace.h" #include "rtgeom.h" Modified: brlcad/trunk/src/librt/primitives/brep/brep_debug.cpp =================================================================== --- brlcad/trunk/src/librt/primitives/brep/brep_debug.cpp 2009-10-30 08:53:14 UTC (rev 36350) +++ brlcad/trunk/src/librt/primitives/brep/brep_debug.cpp 2009-10-30 09:48:27 UTC (rev 36351) @@ -37,7 +37,7 @@ #include "vmath.h" #include "brep.h" -#include "vector.h" +#include "dvec.h" #include "raytrace.h" #include "rtgeom.h" Modified: brlcad/trunk/src/librt/primitives/brep/brep_debug.h =================================================================== --- brlcad/trunk/src/librt/primitives/brep/brep_debug.h 2009-10-30 08:53:14 UTC (rev 36350) +++ brlcad/trunk/src/librt/primitives/brep/brep_debug.h 2009-10-30 09:48:27 UTC (rev 36351) @@ -40,7 +40,7 @@ #include "vmath.h" #include "brep.h" -#include "vector.h" +#include "dvec.h" #include "raytrace.h" #include "rtgeom.h" This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <br...@us...> - 2009-11-20 23:00:27
|
Revision: 36584 http://brlcad.svn.sourceforge.net/brlcad/?rev=36584&view=rev Author: brlcad Date: 2009-11-20 23:00:16 +0000 (Fri, 20 Nov 2009) Log Message: ----------- quell a variety of warnings: unused vars, floating point comparisons, missing initializers, and more. most curious were the floating point equality comparisons happening in rt_bool_final() .. need to validate regresion. Modified Paths: -------------- brlcad/trunk/src/librt/bezier_2d_isect.c brlcad/trunk/src/librt/bool.c brlcad/trunk/src/librt/cmd.c brlcad/trunk/src/librt/constraint.c Modified: brlcad/trunk/src/librt/bezier_2d_isect.c =================================================================== --- brlcad/trunk/src/librt/bezier_2d_isect.c 2009-11-20 21:58:03 UTC (rev 36583) +++ brlcad/trunk/src/librt/bezier_2d_isect.c 2009-11-20 23:00:16 UTC (rev 36584) @@ -55,7 +55,6 @@ point2d_t *V, /* 2D Control pts of Bezier curve */ int degree, /* Degreee of Bezier curve */ point2d_t ray_start, /* starting point for ray */ - point2d_t ray_dir, /* unit ray direction (actually a vector, not a point) */ point2d_t ray_perp) /* unit vector perpendicular to ray direction */ { int i; @@ -276,7 +275,6 @@ int degree, /* Degree of curve */ point2d_t ray_start, /* starting point of ray */ point2d_t ray_dir, /* unit ray direction */ - double epsilon, /* maximum allowable error */ point2d_t intercept, /* calculated intercept point */ point2d_t normal ) /* calculated unit normal at intercept */ { @@ -383,7 +381,7 @@ int total_count; point2d_t eval_pt; - switch (CrossingCount(w, degree, ray_start, ray_dir, ray_perp)) { + switch (CrossingCount(w, degree, ray_start, ray_perp)) { case 0 : { /* No solutions here */ return 0; @@ -401,7 +399,7 @@ if (ControlPolygonFlatEnough(w, degree, epsilon)) { *intercept = (point2d_t *)bu_malloc( sizeof( point2d_t ), "FindRoots: unique solution (intercept)" ); *normal = (point2d_t *)bu_malloc( sizeof( point2d_t ), "FindRoots: unique solution (normal)" ); - if ( !ComputeXIntercept( w, degree, ray_start, ray_dir, epsilon, *intercept[0], *normal[0] ) ) { + if ( !ComputeXIntercept( w, degree, ray_start, ray_dir, *intercept[0], *normal[0] ) ) { bu_free( (char *)(*intercept), "FindRoots: no solution" ); bu_free( (char *)(*normal), "FindRoots: no solution" ); return 0; Modified: brlcad/trunk/src/librt/bool.c =================================================================== --- brlcad/trunk/src/librt/bool.c 2009-11-20 21:58:03 UTC (rev 36583) +++ brlcad/trunk/src/librt/bool.c 2009-11-20 23:00:16 UTC (rev 36584) @@ -865,7 +865,7 @@ goto out; } if ( d >= INFINITY ) { - if ( a == b ) { + if ( NEAR_ZERO(a - b, SMALL_FASTF) ) { ret = 0; goto out; } @@ -1208,6 +1208,7 @@ RT_CK_AP(ap); RT_CK_PT(pp); BU_CK_PTBL(regiontable); + InputHdp = InputHdp; /* quell */ return; } @@ -1232,6 +1233,7 @@ RT_CK_AP(ap); RT_CK_PT(pp); BU_CK_PTBL(regiontable); + InputHdp = InputHdp; /* quell */ /* Attempt to control tremendous error outputs */ if ( ++count > 100 ) { @@ -1787,9 +1789,9 @@ ap->a_x, ap->a_y, ap->a_level ); rt_pr_partitions( ap->a_rt_i, InputHdp, "With problem" ); } - if ( pp->pt_forw != InputHdp && - pp->pt_outhit->hit_dist != pp->pt_forw->pt_inhit->hit_dist ) { - diff = pp->pt_outhit->hit_dist - pp->pt_forw->pt_inhit->hit_dist; + diff = pp->pt_outhit->hit_dist - pp->pt_forw->pt_inhit->hit_dist; + if ( pp->pt_forw != InputHdp && !NEAR_ZERO(diff, SMALL_FASTF) ) + { if ( NEAR_ZERO( diff, ap->a_rt_i->rti_tol.dist ) ) { if (RT_G_DEBUG&DEBUG_PARTITION) bu_log("rt_boolfinal: fusing 2 partitions x%x x%x\n", pp, pp->pt_forw ); @@ -2129,7 +2131,7 @@ } else { if ( (-b) > d ) d = (-b); } - if ( d==0.0 ) + if ( NEAR_ZERO(d, SMALL_FASTF) ) return( 0.0 ); if ( (diff = a - b) < 0.0 ) diff = -diff; return( diff / d ); Modified: brlcad/trunk/src/librt/cmd.c =================================================================== --- brlcad/trunk/src/librt/cmd.c 2009-11-20 21:58:03 UTC (rev 36583) +++ brlcad/trunk/src/librt/cmd.c 2009-11-20 23:00:16 UTC (rev 36584) @@ -142,6 +142,9 @@ char *lp; int retval; + if (rtip) + RT_CK_RTI(rtip); + lp = bu_strdup(ilp); nwords = bu_argv_from_string( cmd_args, MAXWORDS, lp ); Modified: brlcad/trunk/src/librt/constraint.c =================================================================== --- brlcad/trunk/src/librt/constraint.c 2009-11-20 21:58:03 UTC (rev 36583) +++ brlcad/trunk/src/librt/constraint.c 2009-11-20 23:00:16 UTC (rev 36584) @@ -40,10 +40,10 @@ const struct bu_structparse rt_constraint_parse[] = { - {"%d", 1, "ID", bu_offsetof(struct rt_constraint_internal, id), BU_STRUCTPARSE_FUNC_NULL}, - {"%d", 1, "N", bu_offsetof(struct rt_constraint_internal, type), BU_STRUCTPARSE_FUNC_NULL}, - {"%V", 1, "Ex", bu_offsetof(struct rt_constraint_internal, expression), BU_STRUCTPARSE_FUNC_NULL}, - {"", 0, (char *)0, 0, BU_STRUCTPARSE_FUNC_NULL } + {"%d", 1, "ID", bu_offsetof(struct rt_constraint_internal, id), BU_STRUCTPARSE_FUNC_NULL, NULL, NULL}, + {"%d", 1, "N", bu_offsetof(struct rt_constraint_internal, type), BU_STRUCTPARSE_FUNC_NULL, NULL, NULL}, + {"%V", 1, "Ex", bu_offsetof(struct rt_constraint_internal, expression), BU_STRUCTPARSE_FUNC_NULL, NULL, NULL}, + {"", 0, (char *)0, 0, BU_STRUCTPARSE_FUNC_NULL, NULL, NULL } }; @@ -59,6 +59,7 @@ RT_CK_DB_INTERNAL(ip); constraint = (struct rt_constraint_internal *)ip->idb_ptr; + if (!resp) resp = &rt_uniresource; if (constraint) { constraint->magic = 0; /* sanity */ @@ -91,12 +92,16 @@ struct bu_vls str; RT_CK_DB_INTERNAL(ip); + if (dbip) RT_CK_DBI(dbip); + if (resp) RT_CK_RESOURCE(resp); if ( ip->idb_type != ID_CONSTRAINT ) bu_bomb("rt_constraint_export() type not ID_CONSTRAINT"); cip = (struct rt_constraint_internal *) ip->idb_ptr; /*RT_CONSTRAINT_CK_MAGIC(cip);*/ constraint = *cip; + local2mm = local2mm; /* quell */ + BU_INIT_EXTERNAL(ep); /* BU_CK_EXTERNAL(ep);*/ @@ -124,6 +129,14 @@ struct resource *resp, const int minor_type) { + RT_CK_DB_INTERNAL(ip); + BU_CK_EXTERNAL( ep ); + mat = mat; + RT_CK_DBI(dbip); + if (resp) RT_CK_RESOURCE(resp); + if (minor_type != ID_CONSTRAINT) + bu_log("unexpected minor type [%d]\n", minor_type); + return 0; /* OK */ } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <br...@us...> - 2009-11-20 23:13:21
|
Revision: 36585 http://brlcad.svn.sourceforge.net/brlcad/?rev=36585&view=rev Author: brlcad Date: 2009-11-20 23:13:11 +0000 (Fri, 20 Nov 2009) Log Message: ----------- indent, ws, comment cleanup Modified Paths: -------------- brlcad/trunk/src/librt/constraint.c brlcad/trunk/src/librt/cut.c Modified: brlcad/trunk/src/librt/constraint.c =================================================================== --- brlcad/trunk/src/librt/constraint.c 2009-11-20 23:00:16 UTC (rev 36584) +++ brlcad/trunk/src/librt/constraint.c 2009-11-20 23:13:11 UTC (rev 36585) @@ -50,12 +50,13 @@ /** * R T _ C O N S T R A I N T _ I F R E E * - * Free the storage associated with the rt_db_internal version of constraint object. + * Free the storage associated with the rt_db_internal version of + * constraint object. */ void -rt_constraint_ifree( struct rt_db_internal *ip, struct resource *resp) +rt_constraint_ifree(struct rt_db_internal *ip, struct resource *resp) { - register struct rt_constraint_internal *constraint; + register struct rt_constraint_internal *constraint; RT_CK_DB_INTERNAL(ip); constraint = (struct rt_constraint_internal *)ip->idb_ptr; @@ -68,7 +69,7 @@ else bu_log("Freeing bogus constraint, VLS not initialized\n"); - bu_free( (genptr_t)constraint, "constraint ifree" ); + bu_free((genptr_t)constraint, "constraint ifree"); } ip->idb_ptr = GENPTR_NULL; /* sanity */ } @@ -76,26 +77,26 @@ /** - * R T _ C O N S T R A I N T _ E X P O R T 5 + * R T _ C O N S T R A I N T _ E X P O R T 5 * */ int rt_constraint_export5( - struct bu_external *ep, - const struct rt_db_internal *ip, - double local2mm, - const struct db_i *dbip, - struct resource *resp) + struct bu_external *ep, + const struct rt_db_internal *ip, + double local2mm, + const struct db_i *dbip, + struct resource *resp) { - struct rt_constraint_internal *cip; - struct rt_constraint_internal constraint; - struct bu_vls str; + struct rt_constraint_internal *cip; + struct rt_constraint_internal constraint; + struct bu_vls str; RT_CK_DB_INTERNAL(ip); if (dbip) RT_CK_DBI(dbip); if (resp) RT_CK_RESOURCE(resp); - if ( ip->idb_type != ID_CONSTRAINT ) bu_bomb("rt_constraint_export() type not ID_CONSTRAINT"); + if (ip->idb_type != ID_CONSTRAINT) bu_bomb("rt_constraint_export() type not ID_CONSTRAINT"); cip = (struct rt_constraint_internal *) ip->idb_ptr; /*RT_CONSTRAINT_CK_MAGIC(cip);*/ constraint = *cip; @@ -103,16 +104,16 @@ local2mm = local2mm; /* quell */ BU_INIT_EXTERNAL(ep); -/* BU_CK_EXTERNAL(ep);*/ bu_vls_init(&str); bu_vls_struct_print(&str, rt_constraint_parse, (char *) &constraint); ep->ext_nbytes = bu_vls_strlen(&str); - ep->ext_buf = (genptr_t)bu_calloc(1, ep->ext_nbytes,"constrnt external"); - bu_strlcpy(ep->ext_buf,bu_vls_addr(&str),ep->ext_nbytes); + ep->ext_buf = (genptr_t)bu_calloc(1, ep->ext_nbytes, "constrnt external"); + bu_strlcpy(ep->ext_buf, bu_vls_addr(&str), ep->ext_nbytes); bu_vls_free(&str); + return 0; /* OK */ } @@ -122,15 +123,15 @@ */ int rt_constraint_import5( - struct rt_db_internal *ip, + struct rt_db_internal *ip, const struct bu_external *ep, - const mat_t mat, - const struct db_i *dbip, - struct resource *resp, - const int minor_type) + const mat_t mat, + const struct db_i *dbip, + struct resource *resp, + const int minor_type) { RT_CK_DB_INTERNAL(ip); - BU_CK_EXTERNAL( ep ); + BU_CK_EXTERNAL(ep); mat = mat; RT_CK_DBI(dbip); if (resp) RT_CK_RESOURCE(resp); Modified: brlcad/trunk/src/librt/cut.c =================================================================== --- brlcad/trunk/src/librt/cut.c 2009-11-20 23:00:16 UTC (rev 36584) +++ brlcad/trunk/src/librt/cut.c 2009-11-20 23:13:11 UTC (rev 36585) @@ -48,125 +48,112 @@ #include "plot3.h" -HIDDEN int rt_ck_overlap BU_ARGS((const vect_t min, - const vect_t max, - const struct soltab *stp, - const struct rt_i *rtip)); -HIDDEN int rt_ct_box BU_ARGS((struct rt_i *rtip, - union cutter *cutp, - int axis, double where, int force)); -HIDDEN void rt_ct_optim BU_ARGS((struct rt_i *rtip, - union cutter *cutp, int depth)); -HIDDEN void rt_ct_free BU_ARGS((struct rt_i *rtip, - union cutter *cutp)); -HIDDEN void rt_ct_release_storage BU_ARGS((union cutter *cutp)); +HIDDEN int rt_ck_overlap BU_ARGS((const vect_t min, const vect_t max, const struct soltab *stp, const struct rt_i *rtip)); +HIDDEN int rt_ct_box BU_ARGS((struct rt_i *rtip, union cutter *cutp, int axis, double where, int force)); +HIDDEN void rt_ct_optim BU_ARGS((struct rt_i *rtip, union cutter *cutp, int depth)); +HIDDEN void rt_ct_free BU_ARGS((struct rt_i *rtip, union cutter *cutp)); +HIDDEN void rt_ct_release_storage BU_ARGS((union cutter *cutp)); -HIDDEN void rt_ct_measure BU_ARGS((struct rt_i *rtip, - union cutter *cutp, int depth)); -HIDDEN union cutter *rt_ct_get BU_ARGS((struct rt_i *rtip)); -void rt_plot_cut BU_ARGS((FILE *fp, struct rt_i *rtip, - union cutter *cutp, int lvl)); +HIDDEN void rt_ct_measure BU_ARGS((struct rt_i *rtip, union cutter *cutp, int depth)); +HIDDEN union cutter *rt_ct_get BU_ARGS((struct rt_i *rtip)); +void rt_plot_cut BU_ARGS((FILE *fp, struct rt_i *rtip, union cutter *cutp, int lvl)); -BU_EXTERN(void rt_pr_cut_info, (const struct rt_i *rtip, - const char *str)); -HIDDEN int rt_ct_old_assess(register union cutter *, - register int, - double *, - double *); +BU_EXTERN(void rt_pr_cut_info, (const struct rt_i *rtip, const char *str)); +HIDDEN int rt_ct_old_assess(register union cutter *, register int, double *, double *); #define AXIS(depth) ((depth)%3) /* cuts: X, Y, Z, repeat */ -/* - * R T _ C U T _ O N E _ A X I S + +/** + * R T _ C U T _ O N E _ A X I S * - * As a temporary aid until NUgrid is working, use NUgrid - * histogram to perform a preliminary partitioning of space, - * along a single axis. - * The tree built here is expected to be further refined. - * The bu_ptbl "boxes" contains a list of the boxnodes, for convenience. + * As a temporary aid until NUgrid is working, use NUgrid histogram to + * perform a preliminary partitioning of space, along a single axis. + * The tree built here is expected to be further refined. The bu_ptbl + * "boxes" contains a list of the boxnodes, for convenience. * - * Each span runs from [min].nu_spos to [max].nu_epos. + * Each span runs from [min].nu_spos to [max].nu_epos. */ union cutter * rt_cut_one_axis(struct bu_ptbl *boxes, struct rt_i *rtip, int axis, int min, int max, struct nugridnode *nuginfop) { register struct soltab *stp; - union cutter *box; - int cur; - int slice; + union cutter *box; + int cur; + int slice; BU_CK_PTBL(boxes); RT_CK_RTI(rtip); - if ( min == max ) { + if (min == max) { /* Down to one cell, generate a boxnode */ slice = min; - box = (union cutter *)bu_calloc( 1, sizeof(union cutter), - "union cutter"); + box = (union cutter *)bu_calloc(1, sizeof(union cutter), + "union cutter"); box->bn.bn_type = CUT_BOXNODE; box->bn.bn_len = 0; box->bn.bn_maxlen = rtip->nsolids; box->bn.bn_list = (struct soltab **)bu_malloc( box->bn.bn_maxlen * sizeof(struct soltab *), - "xbox boxnode []" ); - VMOVE( box->bn.bn_min, rtip->mdl_min ); - VMOVE( box->bn.bn_max, rtip->mdl_max ); + "xbox boxnode []"); + VMOVE(box->bn.bn_min, rtip->mdl_min); + VMOVE(box->bn.bn_max, rtip->mdl_max); box->bn.bn_min[axis] = nuginfop->nu_axis[axis][slice].nu_spos; box->bn.bn_max[axis] = nuginfop->nu_axis[axis][slice].nu_epos; box->bn.bn_len = 0; /* Search all solids for those in this slice */ - RT_VISIT_ALL_SOLTABS_START( stp, rtip ) { + RT_VISIT_ALL_SOLTABS_START(stp, rtip) { RT_CHECK_SOLTAB(stp); - if ( !rt_ck_overlap( box->bn.bn_min, box->bn.bn_max, - stp, rtip ) ) + if (!rt_ck_overlap(box->bn.bn_min, box->bn.bn_max, + stp, rtip)) continue; box->bn.bn_list[box->bn.bn_len++] = stp; } RT_VISIT_ALL_SOLTABS_END - bu_ptbl_ins( boxes, (long *)box ); + bu_ptbl_ins(boxes, (long *)box); return box; } cur = (min + max + 1) / 2; /* Recurse on both sides, then build a cutnode */ - box = (union cutter *)bu_calloc( 1, sizeof(union cutter), - "union cutter"); + box = (union cutter *)bu_calloc(1, sizeof(union cutter), + "union cutter"); box->cn.cn_type = CUT_CUTNODE; box->cn.cn_axis = axis; box->cn.cn_point = nuginfop->nu_axis[axis][cur].nu_spos; - box->cn.cn_l = rt_cut_one_axis( boxes, rtip, axis, min, cur-1, nuginfop ); - box->cn.cn_r = rt_cut_one_axis( boxes, rtip, axis, cur, max, nuginfop ); + box->cn.cn_l = rt_cut_one_axis(boxes, rtip, axis, min, cur-1, nuginfop); + box->cn.cn_r = rt_cut_one_axis(boxes, rtip, axis, cur, max, nuginfop); return box; } -/* - * R T _ C U T _ O P T I M I Z E _ P A R A L L E L + +/** + * R T _ C U T _ O P T I M I Z E _ P A R A L L E L * - * Process all the nodes in the global array rtip->rti_cuts_waiting, - * until none remain. - * This routine is run in parallel. + * Process all the nodes in the global array rtip->rti_cuts_waiting, + * until none remain. This routine is run in parallel. */ void rt_cut_optimize_parallel(int cpu, genptr_t arg) { - struct rt_i *rtip = (struct rt_i *)arg; - union cutter *cp; - int i; + struct rt_i *rtip = (struct rt_i *)arg; + union cutter *cp; + int i; RT_CK_RTI(rtip); - for (;;) { + for (;;) { - bu_semaphore_acquire( RT_SEM_WORKER ); + bu_semaphore_acquire(RT_SEM_WORKER); i = rtip->rti_cuts_waiting.end--; /* get first free index */ - bu_semaphore_release( RT_SEM_WORKER ); + bu_semaphore_release(RT_SEM_WORKER); i -= 1; /* change to last used index */ - if ( i < 0 ) break; + if (i < 0) break; - cp = (union cutter *)BU_PTBL_GET( &rtip->rti_cuts_waiting, i ); + cp = (union cutter *)BU_PTBL_GET(&rtip->rti_cuts_waiting, i); - rt_ct_optim( rtip, cp, Z ); + rt_ct_optim(rtip, cp, Z); } } @@ -229,13 +216,13 @@ { rt_projZmin_comp, rt_projZmax_comp } }; -/* - * R T _ N U G R I D _ C U T + +/** + * R T _ N U G R I D _ C U T * - * Makes a NUGrid node (CUT_NUGRIDNODE), filling the cells with solids - * from the given list. + * Makes a NUGrid node (CUT_NUGRIDNODE), filling the cells with solids + * from the given list. */ - void rt_nugrid_cut(register struct nugridnode *nugnp, register struct boxnode *fromp, struct rt_i *rtip, int just_collect_info, int depth) { @@ -246,81 +233,81 @@ #endif register struct soltab **stpp; - int nu_ncells; /* # cells along one axis */ - int nu_sol_per_cell; /* avg # solids per cell */ - int nu_max_ncells; /* hard limit on nu_ncells */ - int pseudo_depth; /* "fake" depth to tell rt_ct_optim */ - register int i; - int xp, yp, zp; - vect_t xmin, xmax, ymin, ymax, zmin, zmax; + int nu_ncells; /* # cells along one axis */ + int nu_sol_per_cell; /* avg # solids per cell */ + int nu_max_ncells; /* hard limit on nu_ncells */ + int pseudo_depth; /* "fake" depth to tell rt_ct_optim */ + register int i; + int xp, yp, zp; + vect_t xmin, xmax, ymin, ymax, zmin, zmax; struct boxnode nu_xbox, nu_ybox, nu_zbox; - if ( nugnp->nu_type != CUT_NUGRIDNODE ) - bu_bomb( "rt_nugrid_cut: passed non-nugridnode" ); + if (nugnp->nu_type != CUT_NUGRIDNODE) + bu_bomb("rt_nugrid_cut: passed non-nugridnode"); /* - * Build histograms of solid RPP extent distribution - * when projected onto X, Y, and Z axes. - * First stage in implementing the Gigante NUgrid algorithm. - * (Proc. Ausgraph 1990, pg 157) - * XXX For databases where the model diameter (diagonal through - * XXX the model RPP) is small or huge, a histogram with - * XXX floating-point ranges will be needed. - * XXX Integers should suffice for now. + * Build histograms of solid RPP extent distribution when + * projected onto X, Y, and Z axes. First stage in implementing + * the Gigante NUgrid algorithm. (Proc. Ausgraph 1990, pg 157) * - * Goal is to keep the average number of solids per cell constant. - * Assuming a uniform distribution, the number of cells along - * each axis will need to be (nsol / desired_avg)**(1/3). - * This is increased by two to err on the generous side, - * resulting in a 3*3*3 grid even for small numbers of solids. + * XXX For databases where the model diameter (diagonal through + * XXX the model RPP) is small or huge, a histogram with + * XXX floating-point ranges will be needed. + * XXX Integers should suffice for now. * - * Presumably the caller will have set rtip->rti_nu_gfactor to - * RT_NU_GFACTOR_DEFAULT (although it may change it depending on - * the user's wishes or what it feels will be optimal for this - * model.) The default value was computed in the following fashion: - * Suppose the ratio of the running times of ft_shot and - * rt_advance_to_next_cell is K, i.e., + * Goal is to keep the average number of solids per cell constant. + * Assuming a uniform distribution, the number of cells along each + * axis will need to be (nsol / desired_avg)**(1/3). This is + * increased by two to err on the generous side, resulting in a + * 3*3*3 grid even for small numbers of solids. * - * avg_running_time( ft_shot ) - * K := --------------------------------- - * avg_running_time( rt_advance ) + * Presumably the caller will have set rtip->rti_nu_gfactor to + * RT_NU_GFACTOR_DEFAULT (although it may change it depending on + * the user's wishes or what it feels will be optimal for this + * model.) The default value was computed in the following + * fashion: Suppose the ratio of the running times of ft_shot and + * rt_advance_to_next_cell is K, i.e., * - * Now suppose we divide each axis into G*n^R segments, yielding - * G^3 n^(3R) cells. We expect each cell to contain - * G^(-3) n^(1-3R) solids, and hence the running time of firing - * a single ray through the model will be proportional to + * avg_running_time(ft_shot) + * K := --------------------------------- + * avg_running_time(rt_advance) * - * G*n^R * [ 1 + K G^(-3) n^(1-3R) ] = G*n^R + KG^(-2) n^(1-2R). + * Now suppose we divide each axis into G*n^R segments, yielding + * G^3 n^(3R) cells. We expect each cell to contain G^(-3) + * n^(1-3R) solids, and hence the running time of firing a single + * ray through the model will be proportional to * - * Since we wish for the running time of this algorithm to be low, - * we wish to minimize the degree of this polynomial. The optimal - * choice for R is 1/3. So the above equation becomes + * G*n^R * [ 1 + K G^(-3) n^(1-3R) ] = G*n^R + KG^(-2) n^(1-2R). * - * G*n^(1/3) + KG^(-2) n^(1/3) = [ G + KG^(-2) ] n^(1/3). + * Since we wish for the running time of this algorithm to be low, + * we wish to minimize the degree of this polynomial. The optimal + * choice for R is 1/3. So the above equation becomes * - * We now wish to find an optimal value of G in terms of K. - * Using basic calculus we see that + * G*n^(1/3) + KG^(-2) n^(1/3) = [ G + KG^(-2) ] n^(1/3). * - * G := (2K)^(1/3). + * We now wish to find an optimal value of G in terms of K. Using + * basic calculus we see that * - * It has been experimentally observed that K ~ 5/3 when the model - * is mostly arb8s. Hence RT_NU_GFACTOR_DEFAULT := 1.5. + * G := (2K)^(1/3). * - * XXX More tests should be done for this. + * It has been experimentally observed that K ~ 5/3 when the model + * is mostly arb8s. Hence RT_NU_GFACTOR_DEFAULT := 1.5. + * + * XXX More tests should be done for this. */ - if ( rtip->rti_nu_gfactor < 0.01 || - rtip->rti_nu_gfactor > 10*RT_NU_GFACTOR_DEFAULT ) { + if (rtip->rti_nu_gfactor < 0.01 || + rtip->rti_nu_gfactor > 10*RT_NU_GFACTOR_DEFAULT) { rtip->rti_nu_gfactor = RT_NU_GFACTOR_DEFAULT; bu_log( "rt_nugrid_cut: warning: rtip->rti_nu_gfactor not set, setting to %g\n", - RT_NU_GFACTOR_DEFAULT ); + RT_NU_GFACTOR_DEFAULT); } - nu_ncells = (int)ceil( 2.0 + rtip->rti_nu_gfactor * - pow( (double)fromp->bn_len, 1.0/3.0 ) ); - if ( rtip->rti_nugrid_dimlimit > 0 && - nu_ncells > rtip->rti_nugrid_dimlimit ) + nu_ncells = (int)ceil(2.0 + rtip->rti_nu_gfactor * + pow((double)fromp->bn_len, 1.0/3.0)); + if (rtip->rti_nugrid_dimlimit > 0 && + nu_ncells > rtip->rti_nugrid_dimlimit) nu_ncells = rtip->rti_nugrid_dimlimit; nu_sol_per_cell = (fromp->bn_len + nu_ncells - 1) / nu_ncells; nu_max_ncells = 2*nu_ncells + 8; @@ -330,90 +317,89 @@ pseudo_depth = depth; #endif - if ( RT_G_DEBUG&DEBUG_CUT ) + if (RT_G_DEBUG&DEBUG_CUT) bu_log( "\nnu_ncells=%d, nu_sol_per_cell=%d, nu_max_ncells=%d\n", - nu_ncells, nu_sol_per_cell, nu_max_ncells ); + nu_ncells, nu_sol_per_cell, nu_max_ncells); #if USE_HIST - for ( i=0; i<3; i++ ) { - bu_hist_init( &start_hist[i], - fromp->bn_min[i], - fromp->bn_max[i], - nu_ncells*100 ); - bu_hist_init( &end_hist[i], - fromp->bn_min[i], - fromp->bn_max[i], - nu_ncells*100 ); + for (i=0; i<3; i++) { + bu_hist_init(&start_hist[i], + fromp->bn_min[i], + fromp->bn_max[i], + nu_ncells*100); + bu_hist_init(&end_hist[i], + fromp->bn_min[i], + fromp->bn_max[i], + nu_ncells*100); } - for ( i = 0, stpp = fromp->bn_list; - i < fromp->bn_len; - i++, stpp++ ) { + for (i = 0, stpp = fromp->bn_list; + i < fromp->bn_len; + i++, stpp++) { register struct soltab *stp = *stpp; - RT_CK_SOLTAB( stp ); - if ( stp->st_aradius <= 0 ) continue; - if ( stp->st_aradius >= INFINITY ) continue; - for ( j=0; j<3; j++ ) { - BU_HIST_TALLY( &start_hist[j], stp->st_min[j] ); - BU_HIST_TALLY( &end_hist[j], stp->st_max[j] ); + RT_CK_SOLTAB(stp); + if (stp->st_aradius <= 0) continue; + if (stp->st_aradius >= INFINITY) continue; + for (j=0; j<3; j++) { + BU_HIST_TALLY(&start_hist[j], stp->st_min[j]); + BU_HIST_TALLY(&end_hist[j], stp->st_max[j]); } } #endif /* Allocate memory for nugrid axis parition. */ - for ( i=0; i<3; i++ ) + for (i=0; i<3; i++) nugnp->nu_axis[i] = (struct nu_axis *)bu_malloc( - nu_max_ncells*sizeof(struct nu_axis), "NUgrid axis" ); + nu_max_ncells*sizeof(struct nu_axis), "NUgrid axis"); #if USE_HIST /* - * Next part of NUgrid algorithm: - * Decide where cell boundaries should be, along each axis. - * Each cell will be an interval across the histogram. - * For each interval, track the number of new solids that - * have *started* in the interval, and the number of existing solids - * that have *ended* in the interval. - * Continue widening the interval another histogram element - * in width, until either the number of starts or endings - * exceeds the goal for the average number of solids per - * cell, nu_sol_per_cell = (nsolids / nu_ncells). + * Next part of NUgrid algorithm: Decide where cell boundaries + * should be, along each axis. Each cell will be an interval + * across the histogram. For each interval, track the number of + * new solids that have *started* in the interval, and the number + * of existing solids that have *ended* in the interval. Continue + * widening the interval another histogram element in width, until + * either the number of starts or endings exceeds the goal for the + * average number of solids per cell, nu_sol_per_cell = (nsolids / + * nu_ncells). */ - for ( i=0; i<3; i++ ) { - fastf_t pos; /* Current interval start pos */ - int nstart = 0; - int nend = 0; - struct bu_hist *shp = &start_hist[i]; - struct bu_hist *ehp = &end_hist[i]; - int hindex = 0; - int axi = 0; + for (i=0; i<3; i++) { + fastf_t pos; /* Current interval start pos */ + int nstart = 0; + int nend = 0; + struct bu_hist *shp = &start_hist[i]; + struct bu_hist *ehp = &end_hist[i]; + int hindex = 0; + int axi = 0; - if ( shp->hg_min != ehp->hg_min ) + if (shp->hg_min != ehp->hg_min) bu_bomb("cut_it: hg_min error\n"); pos = shp->hg_min; nugnp->nu_axis[i][axi].nu_spos = pos; - for ( hindex = 0; hindex < shp->hg_nbins; hindex++ ) { - if ( pos > shp->hg_max ) break; + for (hindex = 0; hindex < shp->hg_nbins; hindex++) { + if (pos > shp->hg_max) break; /* Advance interval one more histogram entry */ /* NOTE: Peeks into histogram structures! */ nstart += shp->hg_bins[hindex]; nend += ehp->hg_bins[hindex]; pos += shp->hg_clumpsize; #if 1 - if ( nstart < nu_sol_per_cell && - nend < nu_sol_per_cell ) continue; + if (nstart < nu_sol_per_cell && + nend < nu_sol_per_cell) continue; #else - if ( nstart + nend < 2 * nu_sol_per_cell ) + if (nstart + nend < 2 * nu_sol_per_cell) continue; #endif /* End current interval, start new one */ nugnp->nu_axis[i][axi].nu_epos = pos; nugnp->nu_axis[i][axi].nu_width = pos - nugnp->nu_axis[i][axi].nu_spos; - if ( axi >= nu_max_ncells-1 ) { + if (axi >= nu_max_ncells-1) { bu_log("NUgrid ran off end, axis=%d, axi=%d\n", i, axi); pos = shp->hg_max+1; @@ -431,9 +417,9 @@ } /* Finished with temporary data structures */ - for ( i=0; i<3; i++ ) { - bu_hist_free( &start_hist[i] ); - bu_hist_free( &end_hist[i] ); + for (i=0; i<3; i++) { + bu_hist_free(&start_hist[i]); + bu_hist_free(&end_hist[i]); } #else { @@ -442,19 +428,19 @@ register int nstart, nend, axi, len = fromp->bn_len; register fastf_t pos; - list_min = (struct soltab **)bu_malloc( len * - sizeof(struct soltab *), - "min solid list" ); - list_max = (struct soltab **)bu_malloc( len * - sizeof(struct soltab *), - "max solid list" ); + list_min = (struct soltab **)bu_malloc(len * + sizeof(struct soltab *), + "min solid list"); + list_max = (struct soltab **)bu_malloc(len * + sizeof(struct soltab *), + "max solid list"); memcpy(fromp->bn_list, list_min, len*sizeof(struct soltab *)); memcpy(fromp->bn_list, list_max, len*sizeof(struct soltab *)); - for ( i=0; i<3; i++ ) { - qsort( (genptr_t)list_min, len, - sizeof(struct soltab *), pairs[i].cmp_min ); - qsort( (genptr_t)list_max, len, - sizeof(struct soltab *), pairs[i].cmp_max ); + for (i=0; i<3; i++) { + qsort((genptr_t)list_min, len, + sizeof(struct soltab *), pairs[i].cmp_min); + qsort((genptr_t)list_max, len, + sizeof(struct soltab *), pairs[i].cmp_max); nstart = nend = axi = 0; l1 = list_min; l2 = list_max; @@ -462,11 +448,11 @@ pos = fromp->bn_min[i]; nugnp->nu_axis[i][axi].nu_spos = pos; - while ( l1-list_min < len || - l2-list_max < len ) { - if ( l2-list_max >= len || - (l1-list_min < len && - (*l1)->st_min[i] < (*l2)->st_max[i]) ) { + while (l1-list_min < len || + l2-list_max < len) { + if (l2-list_max >= len || + (l1-list_min < len && + (*l1)->st_min[i] < (*l2)->st_max[i])) { pos = (*l1++)->st_min[i]; ++nstart; } else { @@ -475,53 +461,53 @@ } #if 1 - if ( nstart < nu_sol_per_cell && - nend < nu_sol_per_cell ) + if (nstart < nu_sol_per_cell && + nend < nu_sol_per_cell) #else - if ( nstart + nend < nu_sol_per_cell ) + if (nstart + nend < nu_sol_per_cell) #endif continue; /* Don't make really teeny intervals. */ - if ( pos <= nugnp->nu_axis[i][axi].nu_spos + if (pos <= nugnp->nu_axis[i][axi].nu_spos #if 1 - + 1.0 + + 1.0 #endif - + rtip->rti_tol.dist ) + + rtip->rti_tol.dist) continue; /* don't make any more cuts if we've gone past the end. */ - if ( pos >= fromp->bn_max[i] + if (pos >= fromp->bn_max[i] #if 1 - - 1.0 + - 1.0 #endif - - rtip->rti_tol.dist ) + - rtip->rti_tol.dist) continue; /* End current interval, start new one */ nugnp->nu_axis[i][axi].nu_epos = pos; nugnp->nu_axis[i][axi].nu_width = pos - nugnp->nu_axis[i][axi].nu_spos; - if ( axi >= nu_max_ncells-1 ) { + if (axi >= nu_max_ncells-1) { bu_log( "NUgrid ran off end, axis=%d, axi=%d\n", i, axi); - bu_bomb( "rt_nugrid_cut: NUgrid ran off end" ); + bu_bomb("rt_nugrid_cut: NUgrid ran off end"); } nugnp->nu_axis[i][++axi].nu_spos = pos; nstart = 0; nend = 0; } /* End final interval */ - if ( pos < fromp->bn_max[i] ) pos = fromp->bn_max[i]; + if (pos < fromp->bn_max[i]) pos = fromp->bn_max[i]; nugnp->nu_axis[i][axi].nu_epos = pos; nugnp->nu_axis[i][axi].nu_width = pos - nugnp->nu_axis[i][axi].nu_spos; nugnp->nu_cells_per_axis[i] = axi+1; } - bu_free( (genptr_t)list_min, "solid list min sort" ); - bu_free( (genptr_t)list_max, "solid list max sort" ); + bu_free((genptr_t)list_min, "solid list min sort"); + bu_free((genptr_t)list_max, "solid list max sort"); } #endif @@ -533,111 +519,112 @@ nugnp->nu_stepsize[Y]; /* For debugging */ - if ( RT_G_DEBUG&DEBUG_CUT ) for ( i=0; i<3; i++ ) { + if (RT_G_DEBUG&DEBUG_CUT) for (i=0; i<3; i++) { register int j; - bu_log( "NUgrid %c axis: %d cells\n", "XYZ*"[i], - nugnp->nu_cells_per_axis[i] ); - for ( j=0; j<nugnp->nu_cells_per_axis[i]; j++ ) { - bu_log( " %g .. %g, w=%g\n", - nugnp->nu_axis[i][j].nu_spos, - nugnp->nu_axis[i][j].nu_epos, - nugnp->nu_axis[i][j].nu_width ); + bu_log("NUgrid %c axis: %d cells\n", "XYZ*"[i], + nugnp->nu_cells_per_axis[i]); + for (j=0; j<nugnp->nu_cells_per_axis[i]; j++) { + bu_log(" %g .. %g, w=%g\n", + nugnp->nu_axis[i][j].nu_spos, + nugnp->nu_axis[i][j].nu_epos, + nugnp->nu_axis[i][j].nu_width); } } - /* If we were just asked to collect info, we are done. - The binary space partioning algorithm (sometimes) needs just this.*/ + /* If we were just asked to collect info, we are done. The binary + * space partioning algorithm (sometimes) needs just this. + */ - if ( just_collect_info ) return; + if (just_collect_info) return; /* For the moment, re-use "union cutter" */ nugnp->nu_grid = (union cutter *)bu_malloc( nugnp->nu_cells_per_axis[X] * nugnp->nu_cells_per_axis[Y] * nugnp->nu_cells_per_axis[Z] * sizeof(union cutter), - "3-D NUgrid union cutter []" ); + "3-D NUgrid union cutter []"); nu_xbox.bn_len = 0; nu_xbox.bn_maxlen = fromp->bn_len; nu_xbox.bn_list = (struct soltab **)bu_malloc( nu_xbox.bn_maxlen * sizeof(struct soltab *), - "xbox boxnode []" ); + "xbox boxnode []"); nu_ybox.bn_len = 0; nu_ybox.bn_maxlen = fromp->bn_len; nu_ybox.bn_list = (struct soltab **)bu_malloc( nu_ybox.bn_maxlen * sizeof(struct soltab *), - "ybox boxnode []" ); + "ybox boxnode []"); nu_zbox.bn_len = 0; nu_zbox.bn_maxlen = fromp->bn_len; nu_zbox.bn_list = (struct soltab **)bu_malloc( nu_zbox.bn_maxlen * sizeof(struct soltab *), - "zbox boxnode []" ); + "zbox boxnode []"); /* Build each of the X slices */ - for ( xp = 0; xp < nugnp->nu_cells_per_axis[X]; xp++ ) { - VMOVE( xmin, fromp->bn_min ); - VMOVE( xmax, fromp->bn_max ); + for (xp = 0; xp < nugnp->nu_cells_per_axis[X]; xp++) { + VMOVE(xmin, fromp->bn_min); + VMOVE(xmax, fromp->bn_max); xmin[X] = nugnp->nu_axis[X][xp].nu_spos; xmax[X] = nugnp->nu_axis[X][xp].nu_epos; - VMOVE( nu_xbox.bn_min, xmin ); - VMOVE( nu_xbox.bn_max, xmax ); + VMOVE(nu_xbox.bn_min, xmin); + VMOVE(nu_xbox.bn_max, xmax); nu_xbox.bn_len = 0; /* Search all solids for those in this X slice */ - for ( i = 0, stpp = fromp->bn_list; - i < fromp->bn_len; - i++, stpp++ ) { - if ( !rt_ck_overlap( xmin, xmax, *stpp, rtip ) ) + for (i = 0, stpp = fromp->bn_list; + i < fromp->bn_len; + i++, stpp++) { + if (!rt_ck_overlap(xmin, xmax, *stpp, rtip)) continue; nu_xbox.bn_list[nu_xbox.bn_len++] = *stpp; } /* Build each of the Y slices in this X slice */ - for ( yp = 0; yp < nugnp->nu_cells_per_axis[Y]; yp++ ) { - VMOVE( ymin, xmin ); - VMOVE( ymax, xmax ); + for (yp = 0; yp < nugnp->nu_cells_per_axis[Y]; yp++) { + VMOVE(ymin, xmin); + VMOVE(ymax, xmax); ymin[Y] = nugnp->nu_axis[Y][yp].nu_spos; ymax[Y] = nugnp->nu_axis[Y][yp].nu_epos; - VMOVE( nu_ybox.bn_min, ymin ); - VMOVE( nu_ybox.bn_max, ymax ); + VMOVE(nu_ybox.bn_min, ymin); + VMOVE(nu_ybox.bn_max, ymax); nu_ybox.bn_len = 0; /* Search X slice for membs of this Y slice */ - for ( i=0; i<nu_xbox.bn_len; i++ ) { - if ( !rt_ck_overlap( ymin, ymax, - nu_xbox.bn_list[i], - rtip ) ) + for (i=0; i<nu_xbox.bn_len; i++) { + if (!rt_ck_overlap(ymin, ymax, + nu_xbox.bn_list[i], + rtip)) continue; nu_ybox.bn_list[nu_ybox.bn_len++] = nu_xbox.bn_list[i]; } /* Build each of the Z slices in this Y slice*/ /* Each of these will be a final cell */ - for ( zp = 0; zp < nugnp->nu_cells_per_axis[Z]; zp++ ) { + for (zp = 0; zp < nugnp->nu_cells_per_axis[Z]; zp++) { register union cutter *cutp = &nugnp->nu_grid[ zp*nugnp->nu_stepsize[Z] + yp*nugnp->nu_stepsize[Y] + xp*nugnp->nu_stepsize[X]]; - VMOVE( zmin, ymin ); - VMOVE( zmax, ymax ); + VMOVE(zmin, ymin); + VMOVE(zmax, ymax); zmin[Z] = nugnp->nu_axis[Z][zp].nu_spos; zmax[Z] = nugnp->nu_axis[Z][zp].nu_epos; cutp->cut_type = CUT_BOXNODE; - VMOVE( cutp->bn.bn_min, zmin ); - VMOVE( cutp->bn.bn_max, zmax ); + VMOVE(cutp->bn.bn_min, zmin); + VMOVE(cutp->bn.bn_max, zmax); /* Build up a temporary list in nu_zbox first, * then copy list over to cutp->bn */ nu_zbox.bn_len = 0; /* Search Y slice for members of this Z slice*/ - for ( i=0; i<nu_ybox.bn_len; i++ ) { - if ( !rt_ck_overlap( zmin, zmax, - nu_ybox.bn_list[i], - rtip ) ) + for (i=0; i<nu_ybox.bn_len; i++) { + if (!rt_ck_overlap(zmin, zmax, + nu_ybox.bn_list[i], + rtip)) continue; nu_zbox.bn_list[nu_zbox.bn_len++] = nu_ybox.bn_list[i]; } - if ( nu_zbox.bn_len <= 0 ) { + if (nu_zbox.bn_len <= 0) { /* Empty cell */ cutp->bn.bn_list = (struct soltab **)0; cutp->bn.bn_len = 0; @@ -651,22 +638,22 @@ (struct soltab **)bu_malloc( nu_zbox.bn_len * sizeof(struct soltab *), - "NUgrid cell bn_list[]" ); + "NUgrid cell bn_list[]"); cutp->bn.bn_len = cutp->bn.bn_maxlen = nu_zbox.bn_len; memcpy((char *)cutp->bn.bn_list, (char *)nu_zbox.bn_list, nu_zbox.bn_len * - sizeof(struct soltab *) ); + sizeof(struct soltab *)); - if ( rtip->rti_nugrid_dimlimit > 0 ) { + if (rtip->rti_nugrid_dimlimit > 0) { #if 1 - rt_ct_optim( rtip, cutp, pseudo_depth); + rt_ct_optim(rtip, cutp, pseudo_depth); #else /* Recurse, but only if we're cutting down on the cellsize. */ - if ( cutp->bn.bn_len > 5 && - cutp->bn.bn_len < fromp->bn_len>>1 ) { + if (cutp->bn.bn_len > 5 && + cutp->bn.bn_len < fromp->bn_len>>1) { /* Make a little NUGRID node here to clean things up */ @@ -675,9 +662,9 @@ temp = *cutp; /* union copy */ cutp->cut_type = CUT_NUGRIDNODE; /* recursive call! */ - rt_nugrid_cut( &cutp->nugn, - &temp.bn, rtip, 0, - depth+1 ); + rt_nugrid_cut(&cutp->nugn, + &temp.bn, rtip, 0, + depth+1); } #endif } @@ -685,13 +672,13 @@ } } - bu_free( (genptr_t)nu_zbox.bn_list, "nu_zbox bn_list[]" ); - bu_free( (genptr_t)nu_ybox.bn_list, "nu_ybox bn_list[]" ); - bu_free( (genptr_t)nu_xbox.bn_list, "nu_xbox bn_list[]" ); + bu_free((genptr_t)nu_zbox.bn_list, "nu_zbox bn_list[]"); + bu_free((genptr_t)nu_ybox.bn_list, "nu_ybox bn_list[]"); + bu_free((genptr_t)nu_xbox.bn_list, "nu_xbox bn_list[]"); } int -rt_split_mostly_empty_cells( struct rt_i *rtip, union cutter *cutp ) +rt_split_mostly_empty_cells(struct rt_i *rtip, union cutter *cutp) { point_t max, min; struct soltab *stp; @@ -703,113 +690,114 @@ int i; int num_splits=0; - switch ( cutp->cut_type ) { + switch (cutp->cut_type) { case CUT_CUTNODE: - num_splits += rt_split_mostly_empty_cells( rtip, cutp->cn.cn_l ); - num_splits += rt_split_mostly_empty_cells( rtip, cutp->cn.cn_r ); + num_splits += rt_split_mostly_empty_cells(rtip, cutp->cn.cn_l); + num_splits += rt_split_mostly_empty_cells(rtip, cutp->cn.cn_r); break; case CUT_BOXNODE: /* find the actual bounds of stuff in this cell */ - if ( cutp->bn.bn_len == 0 && cutp->bn.bn_piecelen == 0 ) { + if (cutp->bn.bn_len == 0 && cutp->bn.bn_piecelen == 0) { break; } - VSETALL( min, MAX_FASTF ); - VREVERSE( max, min ); + VSETALL(min, MAX_FASTF); + VREVERSE(max, min); - for ( i=0; i<cutp->bn.bn_len; i++ ) { + for (i=0; i<cutp->bn.bn_len; i++) { stp = cutp->bn.bn_list[i]; - VMIN( min, stp->st_min ); - VMAX( max, stp->st_max ); + VMIN(min, stp->st_min); + VMAX(max, stp->st_max); } - for ( i=0; i<cutp->bn.bn_piecelen; i++ ) { + for (i=0; i<cutp->bn.bn_piecelen; i++) { int j; pl = cutp->bn.bn_piecelist[i]; - for ( j=0; j<pl.npieces; j++ ) { + for (j=0; j<pl.npieces; j++) { int piecenum; piecenum = pl.pieces[j]; - VMIN( min, pl.stp->st_piece_rpps[piecenum].min ); - VMAX( max, pl.stp->st_piece_rpps[piecenum].max ); + VMIN(min, pl.stp->st_piece_rpps[piecenum].min); + VMAX(max, pl.stp->st_piece_rpps[piecenum].max); } } /* clip min and max to the bounds of this cell */ - for ( i=X; i<=Z; i++ ) { - if ( min[i] < cutp->bn.bn_min[i] ) { + for (i=X; i<=Z; i++) { + if (min[i] < cutp->bn.bn_min[i]) { min[i] = cutp->bn.bn_min[i]; } - if ( max[i] > cutp->bn.bn_max[i] ) { + if (max[i] > cutp->bn.bn_max[i]) { max[i] = cutp->bn.bn_max[i]; } } /* min and max now have the real bounds of data in this cell */ - VSUB2( range, cutp->bn.bn_max, cutp->bn.bn_min ); - for ( i=X; i<=Z; i++ ) { + VSUB2(range, cutp->bn.bn_max, cutp->bn.bn_min); + for (i=X; i<=Z; i++) { empty[i] = cutp->bn.bn_max[i] - max[i]; upper_or_lower[i] = 1; /* upper section is empty */ tmp = min[i] - cutp->bn.bn_min[i]; - if ( tmp > empty[i] ) { + if (tmp > empty[i]) { empty[i] = tmp; upper_or_lower[i] = 0; /* lower section is empty */ } } max_empty = empty[X]; max_empty_dir = X; - if ( empty[Y] > max_empty ) { + if (empty[Y] > max_empty) { max_empty = empty[Y]; max_empty_dir = Y; } - if ( empty[Z] > max_empty ) { + if (empty[Z] > max_empty) { max_empty = empty[Z]; max_empty_dir = Z; } - if ( max_empty / range[max_empty_dir] > 0.5 ) { + if (max_empty / range[max_empty_dir] > 0.5) { /* this cell is over 50% empty in this direction, split it */ fastf_t where; /* select cutting plane, but move it slightly off any geometry */ - if ( upper_or_lower[max_empty_dir] ) { + if (upper_or_lower[max_empty_dir]) { where = max[max_empty_dir] + rtip->rti_tol.dist; - if ( where >= cutp->bn.bn_max[max_empty_dir] ) { - return( num_splits ); + if (where >= cutp->bn.bn_max[max_empty_dir]) { + return(num_splits); } } else { where = min[max_empty_dir] - rtip->rti_tol.dist; - if ( where <= cutp->bn.bn_min[max_empty_dir] ) { - return( num_splits ); + if (where <= cutp->bn.bn_min[max_empty_dir]) { + return(num_splits); } } - if ( where - cutp->bn.bn_min[max_empty_dir] < 2.0 || - cutp->bn.bn_max[max_empty_dir] - where < 2.0 ) { + if (where - cutp->bn.bn_min[max_empty_dir] < 2.0 || + cutp->bn.bn_max[max_empty_dir] - where < 2.0) { /* will make a box too small */ - return( num_splits ); + return(num_splits); } - if ( rt_ct_box( rtip, cutp, max_empty_dir, where, 1 ) ) { + if (rt_ct_box(rtip, cutp, max_empty_dir, where, 1)) { num_splits++; - num_splits += rt_split_mostly_empty_cells( rtip, cutp->cn.cn_l ); - num_splits += rt_split_mostly_empty_cells( rtip, cutp->cn.cn_r ); + num_splits += rt_split_mostly_empty_cells(rtip, cutp->cn.cn_l); + num_splits += rt_split_mostly_empty_cells(rtip, cutp->cn.cn_r); } } break; } - return( num_splits ); + return(num_splits); } -/* - * R T _ C U T _ I T +/** + * R T _ C U T _ I T * - * Go through all the solids in the model, given the model mins and maxes, - * and generate a cutting tree. A strategy better than incrementally - * cutting each solid is to build a box node which contains everything - * in the model, and optimize it. + * Go through all the solids in the model, given the model mins and + * maxes, and generate a cutting tree. A strategy better than + * incrementally cutting each solid is to build a box node which + * contains everything in the model, and optimize it. * - * This is the main entry point into space partitioning from rt_prep(). + * This is the main entry point into space partitioning from + * rt_prep(). */ void rt_cut_it(register struct rt_i *rtip, int ncpu) @@ -820,28 +808,28 @@ int num_splits=0; /* Make a list of all solids into one special boxnode, then refine. */ - BU_GETUNION( finp, cutter ); + BU_GETUNION(finp, cutter); finp->cut_type = CUT_BOXNODE; - VMOVE( finp->bn.bn_min, rtip->mdl_min ); - VMOVE( finp->bn.bn_max, rtip->mdl_max ); + VMOVE(finp->bn.bn_min, rtip->mdl_min); + VMOVE(finp->bn.bn_max, rtip->mdl_max); finp->bn.bn_len = 0; finp->bn.bn_maxlen = rtip->nsolids+1; finp->bn.bn_list = (struct soltab **)bu_malloc( finp->bn.bn_maxlen * sizeof(struct soltab *), - "rt_cut_it: initial list alloc" ); + "rt_cut_it: initial list alloc"); rtip->rti_inf_box.cut_type = CUT_BOXNODE; - RT_VISIT_ALL_SOLTABS_START( stp, rtip ) { + 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; /* Infinite and finite solids all get lumpped together */ - rt_cut_extend( finp, stp, rtip ); + rt_cut_extend(finp, stp, rtip); - if ( stp->st_aradius >= INFINITY ) { + if (stp->st_aradius >= INFINITY) { /* Also add infinite solids to a special BOXNODE */ - rt_cut_extend( &rtip->rti_inf_box, stp, rtip ); + rt_cut_extend(&rtip->rti_inf_box, stp, rtip); } } RT_VISIT_ALL_SOLTABS_END; @@ -851,47 +839,49 @@ */ rtip->rti_cutlen = (int)log((double)(rtip->nsolids+1)); /* ln ~= log2, nsolids+1 to avoid log(0) */ rtip->rti_cutdepth = 2 * rtip->rti_cutlen; - if ( rtip->rti_cutlen < 3 ) rtip->rti_cutlen = 3; - if ( rtip->rti_cutdepth < 12 ) rtip->rti_cutdepth = 12; - if ( rtip->rti_cutdepth > 24 ) rtip->rti_cutdepth = 24; /* !! */ - if ( RT_G_DEBUG&DEBUG_CUT ) - bu_log( "Before Space Partitioning: Max Tree Depth=%d, Cuttoff primitive count=%d\n", - rtip->rti_cutdepth, rtip->rti_cutlen ); + if (rtip->rti_cutlen < 3) rtip->rti_cutlen = 3; + if (rtip->rti_cutdepth < 12) rtip->rti_cutdepth = 12; + if (rtip->rti_cutdepth > 24) rtip->rti_cutdepth = 24; /* !! */ + if (RT_G_DEBUG&DEBUG_CUT) + bu_log("Before Space Partitioning: Max Tree Depth=%d, Cuttoff primitive count=%d\n", + rtip->rti_cutdepth, rtip->rti_cutlen); - bu_ptbl_init( &rtip->rti_cuts_waiting, rtip->nsolids, - "rti_cuts_waiting ptbl" ); + bu_ptbl_init(&rtip->rti_cuts_waiting, rtip->nsolids, + "rti_cuts_waiting ptbl"); - if ( rtip->rti_hasty_prep ) { + if (rtip->rti_hasty_prep) { rtip->rti_space_partition = RT_PART_NUBSPT; rtip->rti_cutdepth = 6; } - switch ( rtip->rti_space_partition ) { + switch (rtip->rti_space_partition) { case RT_PART_NUGRID: rtip->rti_CutHead.cut_type = CUT_NUGRIDNODE; - rt_nugrid_cut( &rtip->rti_CutHead.nugn, &finp->bn, rtip, 0, 0 ); - rt_fr_cut( rtip, finp ); /* done with finite solids box */ + rt_nugrid_cut(&rtip->rti_CutHead.nugn, &finp->bn, rtip, 0, 0); + rt_fr_cut(rtip, finp); /* done with finite solids box */ break; case RT_PART_NUBSPT: { #ifdef NEW_WAY struct nugridnode nuginfo; - /* Collect statistics to assist binary space partition tree - construction */ + /* Collect statistics to assist binary space partition + * tree construction + */ nuginfo.nu_type = CUT_NUGRIDNODE; - rt_nugrid_cut( &nuginfo, &fin_box, rtip, 1, 0 ); + rt_nugrid_cut(&nuginfo, &fin_box, rtip, 1, 0); #endif rtip->rti_CutHead = *finp; /* union copy */ #ifdef NEW_WAY - if ( rtip->nsolids < 50000 ) { + if (rtip->nsolids < 50000) { #endif /* Old way, non-parallel */ - /* For some reason, this algorithm produces a substantial - * performance improvement over the parallel way, below. The - * benchmark tests seem to be very sensitive to how the space - * partitioning is laid out. Until we go to full NUgrid, this - * will have to do. */ - rt_ct_optim( rtip, &rtip->rti_CutHead, 0 ); + /* For some reason, this algorithm produces a + * substantial performance improvement over the + * parallel way, below. The benchmark tests seem to + * be very sensitive to how the space partitioning is + * laid out. Until we go to full NUgrid, this will + * have to do. */ + rt_ct_optim(rtip, &rtip->rti_CutHead, 0); #ifdef NEW_WAY } else { @@ -899,79 +889,80 @@ NUgrid changes were made /* New way, mostly parallel */ - union cutter *head; - int i; + union cutter *head; + int i; - head = rt_cut_one_axis( &rtip->rti_cuts_waiting, rtip, - Y, 0, nuginfo.nu_cells_per_axis[Y]-1, &nuginfo ); + head = rt_cut_one_axis(&rtip->rti_cuts_waiting, rtip, + Y, 0, nuginfo.nu_cells_per_axis[Y]-1, &nuginfo); rtip->rti_CutHead = *head; /* struct copy */ - bu_free( (char *)head, "union cutter" ); + bu_free((char *)head, "union cutter"); - if (RT_G_DEBUG&DEBUG_CUTDETAIL) { - for ( i=0; i<3; i++ ) { + if (RT_G_DEBUG&DEBUG_CUTDETAIL) { + for (i=0; i<3; i++) { bu_log("\nNUgrid %c axis: %d cells\n", - "XYZ*"[i], nuginfo.nu_cells_per_axis[i] ); + "XYZ*"[i], nuginfo.nu_cells_per_axis[i]); } - rt_pr_cut( &rtip->rti_CutHead, 0 ); + rt_pr_cut(&rtip->rti_CutHead, 0); } - if ( ncpu <= 1 ) { + if (ncpu <= 1) { rt_cut_optimize_parallel(0, rtip); } else { - bu_parallel( rt_cut_optimize_parallel, ncpu, rtip ); + bu_parallel(rt_cut_optimize_parallel, ncpu, rtip); } } #endif /* one more pass to find cells that are mostly empty */ - num_splits = rt_split_mostly_empty_cells( rtip, &rtip->rti_CutHead ); + num_splits = rt_split_mostly_empty_cells(rtip, &rtip->rti_CutHead); - if ( RT_G_DEBUG&DEBUG_CUT ) { - bu_log( "rt_split_mostly_empty_cells(): split %d cells\n", num_splits ); + if (RT_G_DEBUG&DEBUG_CUT) { + bu_log("rt_split_mostly_empty_cells(): split %d cells\n", num_splits); } break; } default: - bu_bomb( "rt_cut_it: unknown space partitioning method\n" ); + bu_bomb("rt_cut_it: unknown space partitioning method\n"); } - bu_free( (genptr_t)finp, "finite solid box" ); + bu_free((genptr_t)finp, "finite solid box"); /* Measure the depth of tree, find max # of RPPs in a cut node */ - bu_hist_init( &rtip->rti_hist_cellsize, 0.0, 400.0, 400 ); - bu_hist_init( &rtip->rti_hist_cell_pieces, 0.0, 400.0, 400 ); - bu_hist_init( &rtip->rti_hist_cutdepth, 0.0, - (fastf_t)rtip->rti_cutdepth+1, rtip->rti_cutdepth+1 ); + bu_hist_init(&rtip->rti_hist_cellsize, 0.0, 400.0, 400); + bu_hist_init(&rtip->rti_hist_cell_pieces, 0.0, 400.0, 400); + bu_hist_init(&rtip->rti_hist_cutdepth, 0.0, + (fastf_t)rtip->rti_cutdepth+1, rtip->rti_cutdepth+1); memset(rtip->rti_ncut_by_type, 0, sizeof(rtip->rti_ncut_by_type)); - rt_ct_measure( rtip, &rtip->rti_CutHead, 0 ); - if ( RT_G_DEBUG&DEBUG_CUT ) { - rt_pr_cut_info( rtip, "Cut" ); + rt_ct_measure(rtip, &rtip->rti_CutHead, 0); + if (RT_G_DEBUG&DEBUG_CUT) { + rt_pr_cut_info(rtip, "Cut"); } - if ( RT_G_DEBUG&DEBUG_CUTDETAIL ) { + if (RT_G_DEBUG&DEBUG_CUTDETAIL) { /* Produce a voluminous listing of the cut tree */ - rt_pr_cut( &rtip->rti_CutHead, 0 ); + rt_pr_cut(&rtip->rti_CutHead, 0); } - if ( RT_G_DEBUG&DEBUG_PLOTBOX ) { + if (RT_G_DEBUG&DEBUG_PLOTBOX) { /* Debugging code to plot cuts */ - if ( (plotfp=fopen("rtcut.pl", "wb"))!=NULL ) { - pdv_3space( plotfp, rtip->rti_pmin, rtip->rti_pmax ); + if ((plotfp=fopen("rtcut.pl", "wb"))!=NULL) { + pdv_3space(plotfp, rtip->rti_pmin, rtip->rti_pmax); /* Plot all the cutting boxes */ - rt_plot_cut( plotfp, rtip, &rtip->rti_CutHead, 0 ); + rt_plot_cut(plotfp, rtip, &rtip->rti_CutHead, 0); (void)fclose(plotfp); } } } -/* - * R T _ C U T _ E X T E N D + +/** + * R T _ C U T _ E X T E N D * - * Add a solid into a given boxnode, extending the lists there. - * This is used only for building the root node, which will then - * be subdivided. + * Add a solid into a given boxnode, extending the lists there. This + * is used only for building the root node, which will then be + * subdivided. * - * Solids with pieces go onto a special list. + * Solids with pieces go onto a special list. */ void rt_cut_extend(register union cutter *cutp, struct soltab *stp, const struct rt_i *rtip) @@ -979,23 +970,23 @@ RT_CK_SOLTAB(stp); RT_CK_RTI(rtip); - BU_ASSERT( cutp->cut_type == CUT_BOXNODE ); + BU_ASSERT(cutp->cut_type == CUT_BOXNODE); - if (RT_G_DEBUG&DEBUG_CUTDETAIL) { + if (RT_G_DEBUG&DEBUG_CUTDETAIL) { bu_log("rt_cut_extend(cutp=x%x) %s npieces=%d\n", cutp, stp->st_name, stp->st_npieces); } - if ( stp->st_npieces > 0 ) { + if (stp->st_npieces > 0) { struct rt_piecelist *plp; register int i; - if ( cutp->bn.bn_piecelist == NULL ) { + if (cutp->bn.bn_piecelist == NULL) { /* Allocate enough piecelist's to hold all solids */ - BU_ASSERT( rtip->nsolids > 0 ); + BU_ASSERT(rtip->nsolids > 0); cutp->bn.bn_piecelist = (struct rt_piecelist *) bu_malloc( sizeof(struct rt_piecelist) * (rtip->nsolids + 2), - "rt_ct_box bn_piecelist (root node)" ); + "rt_ct_box bn_piecelist (root node)"); cutp->bn.bn_piecelen = 0; /* sanity */ cutp->bn.bn_maxpiecelen = rtip->nsolids + 2; } @@ -1007,172 +998,173 @@ plp->npieces = stp->st_npieces; plp->pieces = (long *)bu_malloc( sizeof(long) * plp->npieces, - "pieces[]" ); - for ( i = stp->st_npieces-1; i >= 0; i-- ) + "pieces[]"); + for (i = stp->st_npieces-1; i >= 0; i--) plp->pieces[i] = i; return; } /* No pieces, list the entire solid on bn_list */ - if ( cutp->bn.bn_len >= cutp->bn.bn_maxlen ) { + if (cutp->bn.bn_len >= cutp->bn.bn_maxlen) { /* Need to get more space in list. */ - if ( cutp->bn.bn_maxlen <= 0 ) { + if (cutp->bn.bn_maxlen <= 0) { /* Initial allocation */ - if ( rtip->rti_cutlen > rtip->nsolids ) + if (rtip->rti_cutlen > rtip->nsolids) cutp->bn.bn_maxlen = rtip->rti_cutlen; else cutp->bn.bn_maxlen = rtip->nsolids + 2; cutp->bn.bn_list = (struct soltab **)bu_malloc( cutp->bn.bn_maxlen * sizeof(struct soltab *), - "rt_cut_extend: initial list alloc" ); + "rt_cut_extend: initial list alloc"); } else { cutp->bn.bn_maxlen *= 8; cutp->bn.bn_list = (struct soltab **) bu_realloc( (genptr_t)cutp->bn.bn_list, sizeof(struct soltab *) * cutp->bn.bn_maxlen, - "rt_cut_extend: list extend" ); + "rt_cut_extend: list extend"); } } cutp->bn.bn_list[cutp->bn.bn_len++] = stp; } -/* - * R T _ C T _ P L A N + +/** + * R T _ C T _ P L A N * - * Attempt to make an "optimal" cut of the given boxnode. - * Consider cuts along all three axis planes, and choose - * the one with the smallest "offcenter" metric. + * Attempt to make an "optimal" cut of the given boxnode. Consider + * cuts along all three axis planes, and choose the one with the + * smallest "offcenter" metric. * - * Returns - - * -1 No cut is possible - * 0 Node has been cut + * Returns - + * -1 No cut is possible + * 0 Node has been cut */ HIDDEN int rt_ct_plan(struct rt_i *rtip, union cutter *cutp, int depth) { - int axis; - int status[3]; - double where[3]; - double offcenter[3]; - int best; - double bestoff; + int axis; + int status[3]; + double where[3]; + double offcenter[3]; + int best; + double bestoff; RT_CK_RTI(rtip); - for ( axis = X; axis <= Z; axis++ ) { + for (axis = X; axis <= Z; axis++) { #if 0 /* New way */ status[axis] = rt_ct_assess( - cutp, axis, &where[axis], &offcenter[axis] ); + cutp, axis, &where[axis], &offcenter[axis]); #else /* Old way */ status[axis] = rt_ct_old_assess( - cutp, axis, &where[axis], &offcenter[axis] ); + cutp, axis, &where[axis], &offcenter[axis]); #endif } - for (;;) { + for (;;) { best = -1; bestoff = INFINITY; - for ( axis = X; axis <= Z; axis++ ) { - if ( status[axis] <= 0 ) continue; - if ( offcenter[axis] >= bestoff ) continue; + for (axis = X; axis <= Z; axis++) { + if (status[axis] <= 0) continue; + if (offcenter[axis] >= bestoff) continue; /* This one is better than previous ones */ best = axis; bestoff = offcenter[axis]; } - if ( best < 0 ) return(-1); /* No cut is possible */ + if (best < 0) return(-1); /* No cut is possible */ - if ( rt_ct_box( rtip, cutp, best, where[best], 0 ) > 0 ) + if (rt_ct_box(rtip, cutp, best, where[best], 0) > 0) return(0); /* OK */ /* - * This cut failed to reduce complexity on either side. - * Mark this status as bad, and try the next-best - * opportunity, if any. + * This cut failed to reduce complexity on either side. Mark + * this status as bad, and try the next-best opportunity, if + * any. */ status[best] = 0; } } -/* - * R T _ C T _ A S S E S S + +/** + * R T _ C T _ A S S E S S * - * Assess the possibility of making a cut along the indicated axis. + * Assess the possibility of making a cut along the indicated axis. * - * Returns - - * 0 if a cut along this axis is not possible - * 1 if a cut along this axis *is* possible, plus: - * *where is proposed cut point, and - * *offcenter is distance from "optimum" cut location. + * Returns - + * 0 if a cut along this axis is not possible + * 1 if a cut along this axis *is* possible, plus: + * 'where' is proposed cut point, and + * 'offcenter' is distance from "optimum" cut location. */ HIDDEN int rt_ct_assess(register union cutter *cutp, register int axis, double *where_p, double *offcenter_p) { - register int i; - register double val; - register double where; - register double offcenter; /* Closest distance from midpoint */ - register double middle; /* midpoint */ - register double left, right; + register int i; + register double val; + register double where; + register double offcenter; /* Closest distance from midpoint */ + register double middle; /* midpoint */ + register double left, right; - if ( cutp->bn.bn_len <= 1 ) return(0); /* Forget it */ + if (cutp->bn.bn_len <= 1) return(0); /* Forget it */ /* - * In absolute terms, each box must be at least 1mm wide after cut, - * so there is no need subdividing anything smaller than twice that. + * In absolute terms, each box must be at least 1mm wide after + * cut, so there is no need subdividing anything smaller than + * twice that. */ - if ( (right=cutp->bn.bn_max[axis])-(left=cutp->bn.bn_min[axis]) <= 2.0 ) + if ((right=cutp->bn.bn_max[axis])-(left=cutp->bn.bn_min[axis]) <= 2.0) return(0); /* - * Split distance between min and max in half. - * Find the closest edge of a solid's bounding RPP - * to the mid-point, and split there. - * This should ordinarily guarantee that at least one side of the - * cut has one less item in it. + * Split distance between min and max in half. Find the closest + * edge of a solid's bounding RPP to the mid-point, and split + * there. This should ordinarily guarantee that at least one side + * of the cut has one less item in it. * * XXX This should be much more sophisticated. - * XXX Consider making a list of candidate cut points - * (max and min of each bn_list[] element) with - * the subscript stored. - * Eliminaate candidates outside the current range. - * Sort the list. - * Eliminate duplicate candidates. - * The the element in the middle of the candidate list. - * Compute offcenter from middle of range as now. + * XXX Consider making a list of candidate cut points (max and min + * of each bn_list[] element) with the subscript stored. + * + * Eliminaate candidates outside the current range. Sort the + * list. Eliminate duplicate candidates. The the element in the + * middle of the candidate list. Compute offcenter from middle of + * range as now. */ middle = (left + right) * 0.5; where = offcenter = INFINITY; - for ( i=0; i < cutp->bn.bn_len; i++ ) { + for (i=0; i < cutp->bn.bn_len; i++) { /* left (min) edge */ val = cutp->bn.bn_list[i]->st_min[axis]; - if ( val > left && val < right ) { - register double d; - if ( (d = val - middle) < 0 ) d = (-d); - if ( d < offcenter ) { + if (val > left && val < right) { + register double d; + if ((d = val - middle) < 0) d = (-d); + if (d < offcenter) { offcenter = d; where = val; } } /* right (max) edge */ val = cutp->bn.bn_list[i]->st_max[axis]; - if ( val > left && val < right ) { - register double d; - if ( (d = val - middle) < 0 ) d = (-d); - if ( d < offcenter ) { + if (val > left && val < right) { + register double d; + if ((d = val - middle) < 0) d = (-d); + if (d < offcenter) { offcenter = d; where = val; } } } - if ( offcenter >= INFINITY ) + if (offcenter >= INFINITY) return(0); /* no candidates? */ - if ( where <= left || where >= right ) + if (where <= left || where >= right) return(0); /* not reasonable */ - if ( where - left <= 1.0 || right - where <= 1.0 ) + if (where - left <= 1.0 || right - where <= 1.0) return(0); /* cut will be too small */ *where_p = where; @@ -1180,47 +1172,48 @@ return(1); /* OK */ } -#define PIECE_BLOCK 512 +#define PIECE_BLOCK 512 -/* - * R T _ C T _ P O P U L A T E _ B O X + +/** + * R T _ C T _ P O P U L A T E _ B O X * - * Given that 'outp' has been given a bounding box smaller than - * that of 'inp', copy over everything which still fits in the smaller box. + * Given that 'outp' has been given a bounding box smaller than that + * of 'inp', copy over everything which still fits in the smaller box. * - * Returns - - * 0 if outp has the same number of items as inp - * 1 if outp has fewer items than inp + * Returns - + * 0 if outp has the same number of items as inp + * 1 if outp has fewer items than inp */ HIDDEN int rt_ct_populate_box(union cutter *outp, const union cutter *inp, struct rt_i *rtip) { - register int i; + register int i; int success = 0; const struct bn_tol *tol = &rtip->rti_tol; /* Examine the solids */ outp->bn.bn_len = 0; outp->bn.bn_maxlen = inp->bn.bn_len; - if ( outp->bn.bn_maxlen > 0 ) { + if (outp->bn.bn_maxlen > 0) { outp->bn.bn_list = (struct soltab **) bu_malloc( sizeof(struct soltab *) * outp->bn.bn_maxlen, - "bn_list" ); - for ( i = inp->bn.bn_len-1; i >= 0; i-- ) { + "bn_list"); + for (i = inp->bn.bn_len-1; i >= 0; i--) { struct soltab *stp = inp->bn.bn_list[i]; - if ( !rt_ck_overlap(outp->bn.bn_min, outp->bn.bn_max, - stp, rtip)) + if (!rt_ck_overlap(outp->bn.bn_min, outp->bn.bn_max, + stp, rtip)) continue; outp->bn.bn_list[outp->bn.bn_len++] = stp; } - if ( outp->bn.bn_len < inp->bn.bn_len ) success = 1; + if (outp->bn.bn_len < inp->bn.bn_len) success = 1; } else { outp->bn.bn_list = (struct soltab **)NULL; } /* Examine the solid pieces */ outp->bn.bn_piecelen = 0; - if ( inp->bn.bn_piecelen <= 0 ) { + if (inp->bn.bn_piecelen <= 0) { outp->bn.bn_piecelist = (struct rt_piecelist *)NULL; outp->bn.bn_maxpiecelen = 0; return success; @@ -1228,10 +1221,10 @@ outp->bn.bn_piecelist = (struct rt_piecelist *) bu_malloc( sizeof(struct rt_piecelist) * inp->bn.bn_piecelen, - "rt_piecelist" ); + "rt_piecelist"); outp->bn.bn_maxpiecelen = inp->bn.bn_piecelen; #if 0 - for ( i = inp->bn.bn_piecelen-1; i >= 0; i-- ) { + for (i = inp->bn.bn_piecelen-1; i >= 0; i--) { struct rt_piecelist *plp = &inp->bn.bn_piecelist[i]; /* input */ struct soltab *stp = plp->stp; struct rt_piecelist *olp = &outp->bn.bn_piecelist[outp->bn.bn_piecelen]; /* output */ @@ -1241,33 +1234,33 @@ RT_CK_SOLTAB(stp); olp->pieces = (long *)bu_malloc( sizeof(long) * plp->npieces, - "olp->pieces[]" ); + "olp->pieces[]"); olp->npieces = 0; /* Loop for every piece of this solid */ - for ( j = plp->npieces-1; j >= 0; j-- ) { + for (j = plp->npieces-1; j >= 0; j--) { long indx = plp->pieces[j]; struct bound_rpp *rpp = &stp->st_piece_rpps[indx]; - if ( !V3RPP_OVERLAP_TOL( - outp->bn.bn_min, outp->bn.bn_max, - rpp->min, rpp->max, tol) ) + if (!V3RPP_OVERLAP_TOL( + outp->bn.bn_min, outp->bn.bn_max, + rpp->min, rpp->max, tol)) continue; olp->pieces[olp->npieces++] = indx; } - if ( olp->npieces > 0 ) { + if (olp->npieces > 0) { /* This solid contributed pieces to the output box */ olp->magic = RT_PIECELIST_MAGIC; olp->stp = stp; outp->bn.bn_piecelen++; - if ( olp->npieces < plp->npieces ) success = 1; + if (olp->npieces < plp->npieces) success = 1; } else { - bu_free( (char *)olp->pieces, "olp->pieces[]"); + bu_free((char *)olp->pieces, "olp->pieces[]"); olp->pieces = NULL; } } #else - for ( i = inp->bn.bn_piecelen-1; i >= 0; i-- ) { + for (i = inp->bn.bn_piecelen-1; i >= 0; i--) { struct rt_piecelist *plp = &inp->bn.bn_piecelist[i]; /* input */ struct soltab *stp = plp->stp; struct rt_piecelist *olp = &outp->bn.bn_piecelist[outp->bn.bn_piecelen]; /* output */ @@ -1282,46 +1275,46 @@ RT_CK_SOLTAB(stp); /* Loop for every piece of this solid */ - for ( j = plp->npieces-1; j >= 0; j-- ) { + for (j = plp->npieces-1; j >= 0; j--) { long indx = plp->pieces[j]; struct bound_rpp *rpp = &stp->st_piece_rpps[indx]; - if ( !V3RPP_OVERLAP_TOL( - outp->bn.bn_min, outp->bn.bn_max, - rpp->min, rpp->max, tol) ) + if (!V3RPP_OVERLAP_TOL( + outp->bn.bn_min, outp->bn.bn_max, + rpp->min, rpp->max, tol)) continue; - if ( piece_count < PIECE_BLOCK ) { + if (piece_count < PIECE_BLOCK) { piece_list[piece_count++] = indx; - } else if ( more_piece_count >= more_piece_len ) { + } else if (more_piece_count >= more_piece_len) { /* this should be an extemely rare occurrence */ more_piece_len += PIECE_BLOCK; - more_pieces = (long *)bu_realloc( more_pieces, more_piece_len * sizeof( long ), - "more_pieces" ); + more_pieces = (long *)bu_realloc(more_pieces, more_piece_len * sizeof(long), + "more_pieces"); more_pieces[more_piece_count++] = indx; } else { more_pieces[more_piece_count++] = indx; } } olp->npieces = piece_count + more_piece_count; - if ( olp->npieces > 0 ) { + if (olp->npieces > 0) { /* This solid contributed pieces to the output box */ olp->magi... [truncated message content] |
From: <br...@us...> - 2009-11-23 20:30:59
|
Revision: 36598 http://brlcad.svn.sourceforge.net/brlcad/?rev=36598&view=rev Author: brlcad Date: 2009-11-23 20:30:52 +0000 (Mon, 23 Nov 2009) Log Message: ----------- quell a slew of verbose/strict warnings Modified Paths: -------------- brlcad/trunk/src/librt/Makefile.am brlcad/trunk/src/librt/bool.c brlcad/trunk/src/librt/bundle.c brlcad/trunk/src/librt/cut.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/db5_io.c brlcad/trunk/src/librt/db5_scan.c brlcad/trunk/src/librt/db5_types.c Modified: brlcad/trunk/src/librt/Makefile.am =================================================================== --- brlcad/trunk/src/librt/Makefile.am 2009-11-23 18:31:24 UTC (rev 36597) +++ brlcad/trunk/src/librt/Makefile.am 2009-11-23 20:30:52 UTC (rev 36598) @@ -28,6 +28,8 @@ ${BREP_CPPFLAGS} \ ${DM_RTGL_CPPFLAGS} +AM_CFLAGS = ${STRICT_FLAGS} + noinst_PROGRAMS = \ comb \ nurb_example \ Modified: brlcad/trunk/src/librt/bool.c =================================================================== --- brlcad/trunk/src/librt/bool.c 2009-11-23 18:31:24 UTC (rev 36597) +++ brlcad/trunk/src/librt/bool.c 2009-11-23 20:30:52 UTC (rev 36598) @@ -422,7 +422,7 @@ bu_log("newpp starts at %.12e, pp starts at %.12e\n", newpp->pt_inhit->hit_dist, pp->pt_inhit->hit_dist); - bu_log("newpp = x%x, pp = x%x\n", newpp, pp); + bu_log("newpp = %p, pp = %p\n", (void *)newpp, (void *)pp); } goto equal_start; } @@ -514,7 +514,7 @@ bu_log("newpp starts at %.12e, pp starts at %.12e\n", newpp->pt_inhit->hit_dist, pp->pt_inhit->hit_dist); - bu_log("newpp = x%x, pp = x%x\n", newpp, pp); + bu_log("newpp = %p, pp = %p\n", (void *)newpp, (void *)pp); } goto done_weave; } @@ -1176,22 +1176,25 @@ /* * Destroy the whole partition. */ - if (RT_G_DEBUG&DEBUG_PARTITION) bu_log("rt_default_multioverlap: overlap code=0, partition=x%x deleted\n", pp); + if (RT_G_DEBUG&DEBUG_PARTITION) + bu_log("rt_default_multioverlap: overlap code=0, partition=%p deleted\n", (void *)pp); bu_ptbl_reset(regiontable); return; } else if (code == 1) { code1: /* Keep partition, claiming region = lastregion */ - if (RT_G_DEBUG&DEBUG_PARTITION) bu_log("rt_default_multioverlap: overlap policy=1, code=%d, p retained in region=%s\n", - code, lastregion->reg_name); + if (RT_G_DEBUG&DEBUG_PARTITION) + bu_log("rt_default_multioverlap: overlap policy=1, code=%d, p retained in region=%s\n", + code, lastregion->reg_name); BU_PTBL_CLEAR_I(regiontable, i); } else { code2: /* Keep partition, claiming region = regp */ bu_ptbl_zero(regiontable, (long *)lastregion); lastregion = regp; - if (RT_G_DEBUG&DEBUG_PARTITION) bu_log("rt_default_multioverlap: overlap policy!=(0, 1) code=%d, p retained in region=%s\n", - code, lastregion->reg_name); + if (RT_G_DEBUG&DEBUG_PARTITION) + bu_log("rt_default_multioverlap: overlap policy!=(0, 1) code=%d, p retained in region=%s\n", + code, lastregion->reg_name); } } } @@ -1505,7 +1508,7 @@ treep = treep->tr_b.tb_left; goto stack; default: - bu_log("rt_booleval: bad stack op x%x\n", treep->tr_op); + bu_log("rt_booleval: bad stack op [%d]\n", treep->tr_op); return(BOOL_TRUE); /* screw up output */ } pop: @@ -1596,7 +1599,7 @@ } goto pop; default: - bu_log("rt_booleval: bad pop op x%x\n", treep->tr_op); + bu_log("rt_booleval: bad pop op [%d]\n", treep->tr_op); return(BOOL_TRUE); /* screw up output */ } /* NOTREACHED */ @@ -1784,8 +1787,8 @@ /* Sanity checks on sorting. */ if (pp->pt_inhit->hit_dist > pp->pt_outhit->hit_dist) { - bu_log("rt_boolfinal: inverted partition %.8x x%d y%d lvl%d\n", - pp, + bu_log("rt_boolfinal: inverted partition %p x%d y%d lvl%d\n", + (void *)pp, ap->a_x, ap->a_y, ap->a_level); rt_pr_partitions(ap->a_rt_i, InputHdp, "With problem"); } @@ -1793,16 +1796,16 @@ diff = pp->pt_outhit->hit_dist - pp->pt_forw->pt_inhit->hit_dist; if (!NEAR_ZERO(diff, SMALL_FASTF)) { if (NEAR_ZERO(diff, ap->a_rt_i->rti_tol.dist)) { - if (RT_G_DEBUG&DEBUG_PARTITION) bu_log("rt_boolfinal: fusing 2 partitions x%x x%x\n", - pp, pp->pt_forw); + if (RT_G_DEBUG&DEBUG_PARTITION) bu_log("rt_boolfinal: fusing 2 partitions %p %p\n", + (void *)pp, (void *)pp->pt_forw); pp->pt_forw->pt_inhit->hit_dist = pp->pt_outhit->hit_dist; } else if (diff > 0) { bu_log("rt_boolfinal: sorting defect %e > %e! x%d y%d lvl%d, diff = %g\n", pp->pt_outhit->hit_dist, pp->pt_forw->pt_inhit->hit_dist, ap->a_x, ap->a_y, ap->a_level, diff); - bu_log("sort defect is between parts x%x and x%x\n", - pp, pp->pt_forw); + bu_log("sort defect is between parts %p and %p\n", + (void *)pp, (void *)pp->pt_forw); if (!(RT_G_DEBUG & DEBUG_PARTITION)) rt_pr_partitions(ap->a_rt_i, InputHdp, "With DEFECT"); ret = 0; @@ -1820,9 +1823,9 @@ */ if (pp->pt_outhit->hit_dist <= 0.001 /* milimeters */) { register struct partition *zap_pp; - if (RT_G_DEBUG&DEBUG_PARTITION)bu_log( - "discarding partition x%x behind ray start, out dist=%g\n", - pp, pp->pt_outhit->hit_dist); + if (RT_G_DEBUG&DEBUG_PARTITION) + bu_log("discarding partition %p behind ray start, out dist=%g\n", + (void *)pp, pp->pt_outhit->hit_dist); zap_pp = pp; pp = pp->pt_forw; DEQUEUE_PT(zap_pp); @@ -1837,8 +1840,8 @@ */ diff = pp->pt_inhit->hit_dist - enddist; if (diff > ap->a_rt_i->rti_tol.dist) { - if (RT_G_DEBUG&DEBUG_PARTITION)bu_log( - "partition begins %g beyond current box end, returning\n", diff); + if (RT_G_DEBUG&DEBUG_PARTITION) + bu_log("partition begins %g beyond current box end, returning\n", diff); reason = "partition begins beyond current box end"; ret = 0; goto out; @@ -1853,8 +1856,8 @@ */ diff = pp->pt_outhit->hit_dist - enddist; if (diff > ap->a_rt_i->rti_tol.dist) { - if (RT_G_DEBUG&DEBUG_PARTITION)bu_log( - "partition ends beyond current box end\n"); + if (RT_G_DEBUG&DEBUG_PARTITION) + bu_log("partition ends beyond current box end\n"); if (ap->a_onehit != 1) { ret = 0; reason = "a_onehit != 1, trace remaining boxes"; @@ -1903,8 +1906,8 @@ } if (indefinite_outpt) { - if (RT_G_DEBUG&DEBUG_PARTITION)bu_log( - "indefinite out point, checking partition eligibility for early evaluation.\n"); + if (RT_G_DEBUG&DEBUG_PARTITION) + bu_log("indefinite out point, checking partition eligibility for early evaluation.\n"); /* * More hits still needed. HITS_TODO > 0. If every solid * in every region participating in this partition has @@ -1915,8 +1918,8 @@ reason = "Partition not yet eligible for evaluation"; goto out; } - if (RT_G_DEBUG&DEBUG_PARTITION)bu_log( - "Partition is eligibile for evaluation.\n"); + if (RT_G_DEBUG&DEBUG_PARTITION) + bu_log("Partition is eligibile for evaluation.\n"); } /* Evaluate the boolean trees of any regions involved */ @@ -1931,33 +1934,36 @@ rt_pr_tree_val(regp->reg_treetop, pp, 2, 0); rt_pr_tree_val(regp->reg_treetop, pp, 1, 0); rt_pr_tree_val(regp->reg_treetop, pp, 0, 0); - bu_log("%.8x=bit%d, %s: ", - regp, regp->reg_bit, - regp->reg_name); + bu_log("%p=bit%d, %s: ", (void *)regp, regp->reg_bit, regp->reg_name); } if (regp->reg_all_unions) { - if (RT_G_DEBUG&DEBUG_PARTITION) bu_log("BOOL_TRUE (all union)\n"); + if (RT_G_DEBUG&DEBUG_PARTITION) + bu_log("BOOL_TRUE (all union)\n"); claiming_regions++; lastregion = regp; continue; } if (rt_booleval(regp->reg_treetop, pp, TrueRg, ap->a_resource) == BOOL_FALSE) { - if (RT_G_DEBUG&DEBUG_PARTITION) bu_log("BOOL_FALSE\n"); + if (RT_G_DEBUG&DEBUG_PARTITION) + bu_log("BOOL_FALSE\n"); /* Null out non-claiming region's pointer */ *regpp = REGION_NULL; continue; } /* This region claims partition */ - if (RT_G_DEBUG&DEBUG_PARTITION) bu_log("BOOL_TRUE (eval)\n"); + if (RT_G_DEBUG&DEBUG_PARTITION) + bu_log("BOOL_TRUE (eval)\n"); claiming_regions++; lastregion = regp; } } - if (RT_G_DEBUG&DEBUG_PARTITION) bu_log("rt_boolfinal: claiming_regions=%d (%g <-> %g)\n", - claiming_regions, pp->pt_inhit->hit_dist, pp->pt_outhit->hit_dist); + if (RT_G_DEBUG&DEBUG_PARTITION) + bu_log("rt_boolfinal: claiming_regions=%d (%g <-> %g)\n", + claiming_regions, pp->pt_inhit->hit_dist, pp->pt_outhit->hit_dist); if (claiming_regions == 0) { - if (RT_G_DEBUG&DEBUG_PARTITION)bu_log("rt_boolfinal moving past partition x%x\n", pp); + if (RT_G_DEBUG&DEBUG_PARTITION) + bu_log("rt_boolfinal moving past partition %p\n", (void *)pp); pp = pp->pt_forw; /* onwards! */ continue; } @@ -1968,7 +1974,7 @@ * multi-overlap handler. */ if (RT_G_DEBUG&DEBUG_PARTITION) - bu_log("rt_boolfinal: invoking a_multioverlap() pp=x%x\n", pp); + bu_log("rt_boolfinal: invoking a_multioverlap() pp=%p\n", (void *)pp); bu_ptbl_rm(regiontable, (long *)NULL); ap->a_logoverlap(ap, pp, regiontable, InputHdp); ap->a_multioverlap(ap, pp, regiontable, InputHdp); @@ -1998,7 +2004,8 @@ if (claiming_regions != 1) { register struct partition *zap_pp; - if (RT_G_DEBUG&DEBUG_PARTITION)bu_log("rt_boolfinal discarding overlap partition x%x\n", pp); + if (RT_G_DEBUG&DEBUG_PARTITION) + bu_log("rt_boolfinal discarding overlap partition %p\n", (void *)pp); zap_pp = pp; pp = pp->pt_forw; /* onwards! */ DEQUEUE_PT(zap_pp); @@ -2042,11 +2049,13 @@ newpp->pt_overlap_reg)) ) { /* same region, merge by extending last final partition */ - if (RT_G_DEBUG&DEBUG_PARTITION)bu_log("rt_boolfinal 'exact match', extending last partition, discarding x%x\n", newpp); + if (RT_G_DEBUG&DEBUG_PARTITION) + bu_log("rt_boolfinal 'exact match', extending last partition, discarding %p\n", (void *)newpp); RT_CK_PT(lastpp); RT_CHECK_SEG(lastpp->pt_inseg); /* sanity */ RT_CHECK_SEG(lastpp->pt_outseg);/* sanity */ - if (RT_G_DEBUG&DEBUG_PARTITION)bu_log("rt_boolfinal collapsing %x %x\n", lastpp, newpp); + if (RT_G_DEBUG&DEBUG_PARTITION) + bu_log("rt_boolfinal collapsing %p %p\n", (void *)lastpp, (void *)newpp); lastpp->pt_outhit = newpp->pt_outhit; lastpp->pt_outflip = newpp->pt_outflip; lastpp->pt_outseg = newpp->pt_outseg; Modified: brlcad/trunk/src/librt/bundle.c =================================================================== --- brlcad/trunk/src/librt/bundle.c 2009-11-23 18:31:24 UTC (rev 36597) +++ brlcad/trunk/src/librt/bundle.c 2009-11-23 20:30:52 UTC (rev 36598) @@ -165,7 +165,7 @@ if ( BU_LIST_UNINITIALIZED( &resp->re_parthead ) ) { /* XXX This shouldn't happen any more */ - bu_log("rt_shootray_bundle() resp=x%x uninitialized, fixing it\n", resp); + bu_log("rt_shootray_bundle() resp=%p uninitialized, fixing it\n", (void *)resp); /* * We've been handed a mostly un-initialized resource struct, * with only a magic number and a cpu number filled in. @@ -197,7 +197,6 @@ f = MAGSQ(ap->a_ray.r_dir); if ( NEAR_ZERO(f, 0.0001) ) { bu_bomb("rt_shootray_bundle: zero length dir vector\n"); - return(0); } diff = f - 1; if ( !NEAR_ZERO( diff, 0.0001 ) ) { Modified: brlcad/trunk/src/librt/cut.c =================================================================== --- brlcad/trunk/src/librt/cut.c 2009-11-23 18:31:24 UTC (rev 36597) +++ brlcad/trunk/src/librt/cut.c 2009-11-23 20:30:52 UTC (rev 36598) @@ -141,6 +141,9 @@ union cutter *cp; int i; + if (!arg && RT_G_DEBUG&DEBUG_CUT) + bu_log("rt_cut_optimized_parallel(%d): NULL rtip\n", cpu); + RT_CK_RTI(rtip); for (;;) { @@ -807,6 +810,8 @@ FILE *plotfp; int num_splits=0; + if (ncpu < 1) ncpu = 1; /* sanity */ + /* Make a list of all solids into one special boxnode, then refine. */ BU_GETUNION(finp, cutter); finp->cut_type = CUT_BOXNODE; @@ -973,8 +978,8 @@ BU_ASSERT(cutp->cut_type == CUT_BOXNODE); if (RT_G_DEBUG&DEBUG_CUTDETAIL) { - bu_log("rt_cut_extend(cutp=x%x) %s npieces=%d\n", - cutp, stp->st_name, stp->st_npieces); + bu_log("rt_cut_extend(cutp=%p) %s npieces=%ld\n", + (void *)cutp, stp->st_name, stp->st_npieces); } if (stp->st_npieces > 0) { @@ -1041,7 +1046,7 @@ * 0 Node has been cut */ HIDDEN int -rt_ct_plan(struct rt_i *rtip, union cutter *cutp, int depth) +rt_ct_plan(struct rt_i *rtip, union cutter *cutp) { int axis; int status[3]; @@ -1348,8 +1353,8 @@ RT_CK_RTI(rtip); if (RT_G_DEBUG&DEBUG_CUTDETAIL) { - bu_log("rt_ct_box(x%x, %c) %g .. %g .. %g\n", - cutp, "XYZ345"[axis], + bu_log("rt_ct_box(%p, %c) %g .. %g .. %g\n", + (void *)cutp, "XYZ345"[axis], cutp->bn.bn_min[axis], where, cutp->bn.bn_max[axis]); @@ -1498,12 +1503,13 @@ return; } if (cutp->cut_type != CUT_BOXNODE) { - bu_log("rt_ct_optim: bad node x%x\n", cutp->cut_type); + bu_log("rt_ct_optim: bad node [%d]\n", cutp->cut_type); return; } oldlen = rt_ct_piececount(cutp); /* save before rt_ct_box() */ - if (RT_G_DEBUG&DEBUG_CUTDETAIL) bu_log("rt_ct_optim(cutp=x%x, depth=%d) piececount=%d\n", cutp, depth, oldlen); + if (RT_G_DEBUG&DEBUG_CUTDETAIL) + bu_log("rt_ct_optim(cutp=%p, depth=%d) piececount=%d\n", (void *)cutp, depth, oldlen); /* * BOXNODE (leaf) @@ -1516,12 +1522,12 @@ /**** XXX This test can be improved ****/ if (depth >= 6 && oldlen <= rtip->rti_cutlen) return; /* Fine enough */ -#if NEW_WAY +#ifdef NEW_WAY /* New way */ /* * Attempt to make an optimal cut */ - if (rt_ct_plan(rtip, cutp, depth) < 0) { + if (rt_ct_plan(rtip, cutp) < 0) { /* Unable to further subdivide this box node */ return; } @@ -1579,8 +1585,8 @@ if (rt_ct_piececount(cutp->cn.cn_l) >= oldlen && rt_ct_piececount(cutp->cn.cn_r) >= oldlen) { if (RT_G_DEBUG&DEBUG_CUTDETAIL) - bu_log("rt_ct_optim(cutp=x%x, depth=%d) oldlen=%d, lhs=%d, rhs=%d, hopeless\n", - cutp, depth, oldlen, + bu_log("rt_ct_optim(cutp=%p, depth=%d) oldlen=%d, lhs=%d, rhs=%d, hopeless\n", + (void *)cutp, depth, oldlen, rt_ct_piececount(cutp->cn.cn_l), rt_ct_piececount(cutp->cn.cn_r)); return; /* hopeless */ @@ -1614,7 +1620,8 @@ register int i; register double left, right; - if (RT_G_DEBUG&DEBUG_CUTDETAIL)bu_log("rt_ct_old_assess(x%x, %c)\n", cutp, "XYZ345"[axis]); + if (RT_G_DEBUG&DEBUG_CUTDETAIL) + bu_log("rt_ct_old_assess(%p, %c)\n", (void *)cutp, "XYZ345"[axis]); /* In absolute terms, each box must be at least 1mm wide after cut. */ if ((right=cutp->bn.bn_max[axis])-(left=cutp->bn.bn_min[axis]) < 2.0) @@ -1728,9 +1735,9 @@ bu_ptbl_init(&rtip->rti_busy_cutter_nodes, 128, "rti_busy_cutter_nodes"); if (rtip->rti_CutFree == CUTTER_NULL) { - register int bytes; + size_t bytes; - bytes = bu_malloc_len_roundup(64*sizeof(union cutter)); + bytes = (size_t)bu_malloc_len_roundup(64*sizeof(union cutter)); cutp = (union cutter *)bu_malloc(bytes, " rt_ct_get"); /* Remember this allocation for later */ bu_ptbl_ins(&rtip->rti_busy_cutter_nodes, (long *)cutp); @@ -1799,7 +1806,7 @@ break; default: - bu_log("rt_ct_release_storage: Unknown type=x%x\n", cutp->cut_type); + bu_log("rt_ct_release_storage: Unknown type [%d]\n", cutp->cut_type); break; } } @@ -1829,15 +1836,15 @@ * R T _ P R _ C U T * * Print out a cut tree. + * + * lvl is recursion level. */ void -rt_pr_cut(register const union cutter *cutp, int lvl) - - /* recursion level */ +rt_pr_cut(const union cutter *cutp, int lvl) { - register int i, j; + int i, j; - bu_log("%.8x ", cutp); + bu_log("%p ", (void *)cutp); for (i=lvl; i>0; i--) bu_log(" "); @@ -1854,7 +1861,7 @@ cutp->cn.cn_point); rt_pr_cut(cutp->cn.cn_l, lvl+1); - bu_log("%.8x ", cutp); + bu_log("%p ", (void *)cutp); for (i=lvl; i>0; i--) bu_log(" "); bu_log("CUT R %c >= %f\n", @@ -1889,7 +1896,6 @@ for (i=0; i < cutp->bn.bn_piecelen; i++) { struct rt_piecelist *plp = &(cutp->bn.bn_piecelist[i]); struct soltab *stp; - int j; RT_CK_PIECELIST(plp); stp = plp->stp; @@ -1898,7 +1904,7 @@ bu_log(" "); for (j=lvl; j>0; j--) bu_log(" "); - bu_log(" %s, %d pieces: ", + bu_log(" %s, %ld pieces: ", stp->st_name, plp->npieces); /* Loop for every piece of this solid */ @@ -1913,7 +1919,7 @@ case CUT_NUGRIDNODE: /* not implemented yet */ default: - bu_log("Unknown type=x%x\n", cutp->cut_type); + bu_log("Unknown type [%d]\n", cutp->cut_type); break; } return; @@ -1969,7 +1975,7 @@ return; } default: - bu_log("rt_fr_cut: Unknown type=x%x\n", cutp->cut_type); + bu_log("rt_fr_cut: Unknown type [%d]\n", cutp->cut_type); break; } return; @@ -2172,7 +2178,7 @@ } return; default: - bu_log("rt_ct_measure: bad node x%x\n", cutp->cut_type); + bu_log("rt_ct_measure: bad node [%d]\n", cutp->cut_type); return; } } @@ -2221,7 +2227,7 @@ RT_CK_RTI(rtip); - bu_log("%s %s: %d nu, %d cut, %d box (%d empty)\n", + bu_log("%s %s: %d nu, %d cut, %d box (%ld empty)\n", str, rtip->rti_space_partition == RT_PART_NUGRID ? "NUGrid" : "NUBSP", @@ -2271,7 +2277,7 @@ void remove_from_bsp(struct soltab *stp, union cutter *cutp, struct bn_tol *tol) { - int index; + int idx; int i; switch (cutp->cut_type) { @@ -2280,10 +2286,10 @@ int remove_count, new_count; struct rt_piecelist *new_piece_list; - index = 0; + idx = 0; remove_count = 0; - for (index=0; index<cutp->bn.bn_piecelen; index++) { - if (cutp->bn.bn_piecelist[index].stp == stp) { + for (idx=0; idx<cutp->bn.bn_piecelen; idx++) { + if (cutp->bn.bn_piecelist[idx].stp == stp) { remove_count++; } } @@ -2297,9 +2303,9 @@ "bn_piecelist"); i = 0; - for (index=0; index<cutp->bn.bn_piecelen; index++) { - if (cutp->bn.bn_piecelist[index].stp != stp) { - new_piece_list[i] = cutp->bn.bn_piecelist[index]; + for (idx=0; idx<cutp->bn.bn_piecelen; idx++) { + if (cutp->bn.bn_piecelist[idx].stp != stp) { + new_piece_list[i] = cutp->bn.bn_piecelist[idx]; i++; } } @@ -2308,9 +2314,9 @@ new_piece_list = NULL; } - for (index=0; index<cutp->bn.bn_piecelen; index++) { - if (cutp->bn.bn_piecelist[index].stp == stp) { - bu_free(cutp->bn.bn_piecelist[index].pieces, "pieces"); + for (idx=0; idx<cutp->bn.bn_piecelen; idx++) { + if (cutp->bn.bn_piecelist[idx].stp == stp) { + bu_free(cutp->bn.bn_piecelist[idx].pieces, "pieces"); } } bu_free(cutp->bn.bn_piecelist, "piecelist"); @@ -2319,11 +2325,11 @@ cutp->bn.bn_maxpiecelen = new_count; } } else { - for (index=0; index < cutp->bn.bn_len; index++) { - if (cutp->bn.bn_list[index] == stp) { + for (idx=0; idx < cutp->bn.bn_len; idx++) { + if (cutp->bn.bn_list[idx] == stp) { /* found it, now remove it */ cutp->bn.bn_len--; - for (i=index; i < cutp->bn.bn_len; i++) { + for (i=idx; i < cutp->bn.bn_len; i++) { cutp->bn.bn_list[i] = cutp->bn.bn_list[i+1]; } return; @@ -2342,8 +2348,8 @@ } break; default: - bu_log("remove_from_bsp(): unrecognized cut type (%d) in BSP!!!\n"); - bu_bomb("remove_from_bsp(): unrecognized cut type in BSP!!!\n"); + bu_log("remove_from_bsp(): unrecognized cut type (%d) in BSP!\n", cutp->cut_type); + bu_bomb("remove_from_bsp(): unrecognized cut type in BSP!\n"); } } @@ -2440,8 +2446,8 @@ } break; default: - bu_log("insert_in_bsp(): unrecognized cut type (%d) in BSP!!!\n"); - bu_bomb("insert_in_bsp(): unrecognized cut type in BSP!!!\n"); + bu_log("insert_in_bsp(): unrecognized cut type (%d) in BSP!\n", cutp->cut_type); + bu_bomb("insert_in_bsp(): unrecognized cut type in BSP!\n"); } } @@ -2476,8 +2482,8 @@ fill_out_bsp(rtip, cutp->cn.cn_l, resp, bb2); break; default: - bu_log("fill_out_bsp(): unrecognized cut type (%d) in BSP!!!\n"); - bu_bomb("fill_out_bsp(): unrecognized cut type in BSP!!!\n"); + bu_log("fill_out_bsp(): unrecognized cut type (%d) in BSP!\n", cutp->cut_type); + bu_bomb("fill_out_bsp(): unrecognized cut type in BSP!\n"); } } Modified: brlcad/trunk/src/librt/db5_alloc.c =================================================================== --- brlcad/trunk/src/librt/db5_alloc.c 2009-11-23 18:31:24 UTC (rev 36597) +++ brlcad/trunk/src/librt/db5_alloc.c 2009-11-23 20:30:52 UTC (rev 36598) @@ -139,13 +139,15 @@ RT_CK_DBI(dbip); RT_CK_DIR(dp); BU_CK_EXTERNAL(ep); - if (RT_G_DEBUG&DEBUG_DB) bu_log("db5_realloc(%s) dbip=x%x, dp=x%x, ext_nbytes=%ld\n", - dp->d_namep, dbip, dp, ep->ext_nbytes ); + if (RT_G_DEBUG&DEBUG_DB) + bu_log("db5_realloc(%s) dbip=%p, dp=%p, ext_nbytes=%ld\n", + dp->d_namep, (void *)dbip, (void *)dp, ep->ext_nbytes ); BU_ASSERT_LONG( ep->ext_nbytes&7, ==, 0 ); if ( dp->d_addr != RT_DIR_PHONY_ADDR && ep->ext_nbytes == dp->d_len ) { - if (RT_G_DEBUG&DEBUG_DB) bu_log("db5_realloc(%s) current allocation is exactly right.\n", dp->d_namep); + if (RT_G_DEBUG&DEBUG_DB) + bu_log("db5_realloc(%s) current allocation is exactly right.\n", dp->d_namep); return 0; } if ( dp->d_addr == RT_DIR_PHONY_ADDR ) BU_ASSERT_LONG( dp->d_len, ==, 0 ); @@ -155,11 +157,13 @@ if ( dp->d_flags & RT_DIR_INMEM ) { if ( dp->d_un.ptr ) { - if (RT_G_DEBUG&DEBUG_DB) bu_log("db5_realloc(%s) bu_realloc()ing memory resident object\n", dp->d_namep); + if (RT_G_DEBUG&DEBUG_DB) + bu_log("db5_realloc(%s) bu_realloc()ing memory resident object\n", dp->d_namep); dp->d_un.ptr = bu_realloc( dp->d_un.ptr, ep->ext_nbytes, "db5_realloc() d_un.ptr" ); } else { - if (RT_G_DEBUG&DEBUG_DB) bu_log("db5_realloc(%s) bu_malloc()ing memory resident object\n", dp->d_namep); + if (RT_G_DEBUG&DEBUG_DB) + bu_log("db5_realloc(%s) bu_malloc()ing memory resident object\n", dp->d_namep); dp->d_un.ptr = bu_malloc( ep->ext_nbytes, "db5_realloc() d_un.ptr" ); } dp->d_len = ep->ext_nbytes; @@ -173,7 +177,8 @@ /* If the object is getting smaller... */ if ( ep->ext_nbytes < dp->d_len ) { - if (RT_G_DEBUG&DEBUG_DB) bu_log("db5_realloc(%s) object is getting smaller\n", dp->d_namep); + if (RT_G_DEBUG&DEBUG_DB) + bu_log("db5_realloc(%s) object is getting smaller\n", dp->d_namep); /* First, erase front half of storage to desired size. */ dp->d_len = ep->ext_nbytes; @@ -195,7 +200,8 @@ /* Start by zapping existing database object into a free object */ if ( dp->d_addr != RT_DIR_PHONY_ADDR ) { - if (RT_G_DEBUG&DEBUG_DB) bu_log("db5_realloc(%s) releasing storage at x%x, len=%d\n", dp->d_namep, dp->d_addr, dp->d_len); + if (RT_G_DEBUG&DEBUG_DB) + bu_log("db5_realloc(%s) releasing storage at x%x, len=%d\n", dp->d_namep, dp->d_addr, dp->d_len); rt_memfree( &(dbip->dbi_freep), dp->d_len, dp->d_addr ); if ( db5_write_free( dbip, dp, dp->d_len ) < 0 ) return -1; @@ -211,20 +217,22 @@ long newaddr; if ( (mmp = rt_memalloc_nosplit( &(dbip->dbi_freep), ep->ext_nbytes )) != MAP_NULL ) { - if (RT_G_DEBUG&DEBUG_DB) bu_log("db5_realloc(%s) obtained free block at x%x, len=%d\n", dp->d_namep, mmp->m_addr, mmp->m_size ); - BU_ASSERT_LONG( mmp->m_size, >=, ep->ext_nbytes ); - if ( mmp->m_size == ep->ext_nbytes ) { + if (RT_G_DEBUG&DEBUG_DB) + bu_log("db5_realloc(%s) obtained free block at x%x, len=%d\n", dp->d_namep, mmp->m_addr, mmp->m_size ); + BU_ASSERT_LONG( (size_t)mmp->m_size, >=, (size_t)ep->ext_nbytes ); + if ( (size_t)mmp->m_size == (size_t)ep->ext_nbytes ) { /* No need to reformat, existing free object is perfect */ dp->d_addr = mmp->m_addr; dp->d_len = ep->ext_nbytes; return 0; } newaddr = mmp->m_addr; - if ( mmp->m_size > ep->ext_nbytes ) { + if ( (size_t)mmp->m_size > (size_t)ep->ext_nbytes ) { /* Reformat and free the surplus */ dp->d_addr = mmp->m_addr + ep->ext_nbytes; dp->d_len = mmp->m_size - ep->ext_nbytes; - if (RT_G_DEBUG&DEBUG_DB) bu_log("db5_realloc(%s) returning surplus at x%x, len=%d\n", dp->d_namep, dp->d_addr, dp->d_len ); + if (RT_G_DEBUG&DEBUG_DB) + bu_log("db5_realloc(%s) returning surplus at x%x, len=%d\n", dp->d_namep, dp->d_addr, dp->d_len ); if ( db5_write_free( dbip, dp, dp->d_len ) < 0 ) return -1; rt_memfree( &(dbip->dbi_freep), dp->d_len, dp->d_addr ); /* mmp is invalid beyond here! */ @@ -232,7 +240,8 @@ dp->d_addr = newaddr; dp->d_len = ep->ext_nbytes; /* Erase the new place */ - if (RT_G_DEBUG&DEBUG_DB) bu_log("db5_realloc(%s) utilizing free block at addr=x%x, len=%d\n", dp->d_namep, dp->d_addr, dp->d_len); + if (RT_G_DEBUG&DEBUG_DB) + bu_log("db5_realloc(%s) utilizing free block at addr=x%x, len=%d\n", dp->d_namep, dp->d_addr, dp->d_len); if ( db5_write_free( dbip, dp, dp->d_len ) < 0 ) return -1; return 0; } @@ -242,7 +251,8 @@ dp->d_addr = dbip->dbi_eof; dbip->dbi_eof += ep->ext_nbytes; 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 (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. Modified: brlcad/trunk/src/librt/db5_bin.c =================================================================== --- brlcad/trunk/src/librt/db5_bin.c 2009-11-23 18:31:24 UTC (rev 36597) +++ brlcad/trunk/src/librt/db5_bin.c 2009-11-23 20:30:52 UTC (rev 36598) @@ -69,53 +69,54 @@ * XXX these are the interface routines needed for table.c */ int -rt_bin_expm_export5(struct bu_external *ep, - const struct rt_db_internal *ip, - double local2mm, - const struct db_i *dbip, - struct resource *resp) +rt_bin_expm_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_expm_export5() not implemented\n"); return -1; } int -rt_bin_unif_export5(struct bu_external *ep, - const struct rt_db_internal *ip, - double local2mm, - const struct db_i *dbip, - struct resource *resp) +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, - const struct bu_external *ep, - const mat_t mat, - const struct db_i *dbip, - struct resource *resp) +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_expm_import5(struct rt_db_internal * ip, - const struct bu_external *ep, - const mat_t mat, - const struct db_i *dbip, - struct resource *resp) +rt_bin_expm_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_expm_import5() not implemented\n"); return -1; } int -rt_bin_mime_import5(struct rt_db_internal * ip, - const struct bu_external *ep, - const mat_t mat, - const struct db_i *dbip, - struct resource *resp) +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; @@ -130,7 +131,7 @@ int rt_binunif_import5( struct rt_db_internal *ip, const struct bu_external *ep, - const mat_t mat, + const mat_t mat __attribute__((unused)), const struct db_i *dbip, struct resource *resp, const int minor_type) @@ -143,6 +144,8 @@ int gotten; BU_CK_EXTERNAL( ep ); + if (dbip) RT_CK_DBI(dbip); + if (resp) RT_CK_RESOURCE(resp); /* * There's no particular size to expect @@ -260,10 +263,10 @@ * the internal structure. */ int -rt_binexpm_import5( struct rt_db_internal *ip, - const unsigned char minor_type, - const struct bu_external *ep, - const struct db_i *dbip ) +rt_binexpm_import5( struct rt_db_internal *ip __attribute__((unused)), + const unsigned char minor_type __attribute__((unused)), + const struct bu_external *ep __attribute__((unused)), + const struct db_i *dbip __attribute__((unused))) { bu_log("rt_binexpm_import5() not implemented yet\n"); return -1; @@ -277,10 +280,10 @@ * internal structure. */ int -rt_binmime_import5( struct rt_db_internal *ip, - const unsigned char minor_type, - const struct bu_external *ep, - const struct db_i *dbip ) +rt_binmime_import5( struct rt_db_internal *ip __attribute__((unused)), + const unsigned char minor_type __attribute__((unused)), + const struct bu_external *ep __attribute__((unused)), + const struct db_i *dbip __attribute__((unused))) { bu_log("rt_binmime_import5() not implemented yet\n"); return -1; @@ -300,8 +303,6 @@ const struct bu_external *ep, const struct db_i *dbip ) { - RT_CK_DB_INTERNAL(ip); - switch (major_type) { case DB5_MAJORTYPE_BINARY_EXPM: return rt_binexpm_import5( ip, minor_type, ep, dbip ); @@ -321,7 +322,7 @@ int rt_binunif_export5( struct bu_external *ep, const struct rt_db_internal *ip, - double local2mm, /* we ignore */ + double local2mm __attribute__((unused)), /* we ignore */ const struct db_i *dbip, struct resource *resp, const int minor_type ) @@ -333,6 +334,9 @@ int in_cookie, out_cookie; int gotten; + if (dbip) RT_CK_DBI(dbip); + if (resp) RT_CK_RESOURCE(resp); + RT_CK_DB_INTERNAL(ip); if ( ip->idb_minor_type != minor_type ) { bu_log("ip->idb_minor_type(%d) != minor_type(%d)\n", @@ -426,8 +430,8 @@ int rt_binunif_describe( struct bu_vls *str, const struct rt_db_internal *ip, - int verbose, - double mm2local ) + int verbose __attribute__((unused)), + double mm2local __attribute__((unused))) { register struct rt_binunif_internal *bip; char buf[256]; @@ -609,6 +613,8 @@ { struct rt_binunif_internal *bip; + diameter = diameter; /* quell */ + intern->idb_type = DB5_MINORTYPE_BINU_8BITINT; intern->idb_major_type = DB5_MAJORTYPE_BINARY_UNIF; BU_ASSERT(&rt_functab[ID_BINUNIF] == ftp); @@ -624,7 +630,7 @@ } int -rt_binunif_get(struct bu_vls *log, const struct rt_db_internal *intern, const char *attr) +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; @@ -636,39 +642,39 @@ if (attr == (char *)NULL) { /* export the object to get machine independent form */ if ( rt_binunif_export5( &ext, intern, 1.0, NULL, NULL, intern->idb_minor_type ) ) { - bu_vls_strcpy( log, "Failed to export binary object!!\n" ); + bu_vls_strcpy( logstr, "Failed to export binary object!!\n" ); return BRLCAD_ERROR; } else { - bu_vls_strcpy( log, "binunif" ); - bu_vls_printf( log, " T %d D {", bip->type ); + 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( log, "\n" ); - bu_vls_printf( log, "%2.2x", *c ); + if ( i%40 == 0 ) bu_vls_strcat( logstr, "\n" ); + bu_vls_printf( logstr, "%2.2x", *c ); } - bu_vls_strcat( log, "}" ); + bu_vls_strcat( logstr, "}" ); bu_free_external( &ext ); } } else { if ( !strcmp( attr, "T" ) ) { - bu_vls_printf( log, "%d", bip->type ); + 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, intern->idb_minor_type ) ) { - bu_vls_strcpy( log, "Failed to export binary object!!\n" ); + 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( log, "\n" ); - bu_vls_printf( log, "%2.2x", *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( log, "Binary object has no attribute '%s'", attr ); + bu_vls_printf( logstr, "Binary object has no attribute '%s'", attr ); return BRLCAD_ERROR; } } @@ -677,7 +683,7 @@ } int -rt_binunif_adjust(struct bu_vls *log, struct rt_db_internal *intern, int argc, char **argv ) +rt_binunif_adjust(struct bu_vls *logstr, struct rt_db_internal *intern, int argc, char **argv ) { struct rt_binunif_internal *bip; int i; @@ -705,7 +711,7 @@ new_type = atoi( argv[1] ); } else { if ( argv[1][1] != '\0' ) { - bu_vls_printf(log, + bu_vls_printf(logstr, "Illegal type: %s, must be 'f', 'd', 'c', 'i', 'l', 'C', 'S', 'I', or 'L'", argv[1]); return BRLCAD_ERROR; @@ -747,18 +753,18 @@ new_type > DB5_MINORTYPE_BINU_64BITINT || binu_types[new_type] == NULL ) { /* Illegal value for type */ - bu_vls_printf(log, "Illegal value for binary type: %s", argv[1]); + bu_vls_printf(logstr, "Illegal value for binary type: %s", argv[1]); return BRLCAD_ERROR; } else { if ( bip->u.uint8 ) { int new_count; int old_byte_count, new_byte_count; - int remainder; + int remainder_count; old_byte_count = bip->count * binu_sizes[bip->type]; new_count = old_byte_count / binu_sizes[new_type]; - remainder = old_byte_count % binu_sizes[new_type]; - if ( remainder ) { + remainder_count = old_byte_count % binu_sizes[new_type]; + if ( remainder_count ) { new_count++; new_byte_count = new_count * binu_sizes[new_type]; } else { @@ -798,7 +804,7 @@ } if ( hexlen % 2 ) { - bu_vls_printf(log, "Hex form of binary data must have an even number of hex digits"); + bu_vls_printf(logstr, "Hex form of binary data must have an even number of hex digits"); return BRLCAD_ERROR; } Modified: brlcad/trunk/src/librt/db5_comb.c =================================================================== --- brlcad/trunk/src/librt/db5_comb.c 2009-11-23 18:31:24 UTC (rev 36597) +++ brlcad/trunk/src/librt/db5_comb.c 2009-11-23 20:30:52 UTC (rev 36598) @@ -245,7 +245,7 @@ rt_comb_export5( struct bu_external *ep, const struct rt_db_internal *ip, - double local2mm, + double local2mm __attribute__((unused)), const struct db_i *dbip, struct resource *resp) { @@ -263,6 +263,7 @@ 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; @@ -469,7 +470,7 @@ const mat_t mat, const struct db_i *dbip, struct resource *resp, - const int minor_type) + const int minor_type __attribute__((unused))) { struct rt_comb_internal *comb; unsigned char *cp; @@ -515,8 +516,6 @@ if ( rpn_len == 0 ) { /* This tree is all union operators, import it as a balanced tree */ - - int i; struct bu_ptbl *tbl1, *tbl2; tbl1 = (struct bu_ptbl *)bu_malloc( sizeof( struct bu_ptbl ), "rt_comb_import5: tbl1" ); Modified: brlcad/trunk/src/librt/db5_io.c =================================================================== --- brlcad/trunk/src/librt/db5_io.c 2009-11-23 18:31:24 UTC (rev 36597) +++ brlcad/trunk/src/librt/db5_io.c 2009-11-23 20:30:52 UTC (rev 36598) @@ -289,7 +289,7 @@ cp += db5_decode_length( &rip->object_length, cp, rip->h_object_width ); rip->object_length <<= 3; /* cvt 8-byte chunks to byte count */ - if ( 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; @@ -382,7 +382,7 @@ used += db5_decode_length( &rip->object_length, lenbuf, rip->h_object_width ); rip->object_length <<= 3; /* cvt 8-byte chunks to byte count */ - if ( 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; @@ -697,7 +697,6 @@ const char *cp; const char *ep; int count = 0; - struct bu_attribute_value_pair *app; BU_CK_EXTERNAL(ap); @@ -709,7 +708,6 @@ /* Null "name" string indicates end of attribute list */ while ( *cp != '\0' ) { - const char *name = cp; if ( cp >= ep ) { bu_log("db5_import_attributes() ran off end of buffer, database is probably corrupted\n"); return -1; @@ -769,7 +767,7 @@ BU_ASSERT_PTR( cp+1, ==, ep ); BU_ASSERT_LONG( avs->count, <=, avs->max ); - BU_ASSERT_LONG( avs->count, ==, count ); + BU_ASSERT_LONG( (size_t)avs->count, ==, (size_t)count ); if (bu_debug & BU_DEBUG_AVS) { bu_avs_print(avs, "db5_import_attributes"); @@ -795,7 +793,7 @@ int need = 0; const struct bu_attribute_value_pair *avpp; char *cp; - int i; + size_t i; BU_CK_AVS( avs ); BU_INIT_EXTERNAL(ext); @@ -811,7 +809,7 @@ /* First pass -- determine how much space is required */ need = 0; avpp = avs->avp; - for ( i = 0; i < avs->count; i++, avpp++ ) { + for ( i = 0; i < (size_t)avs->count; i++, avpp++ ) { if (avpp->name) { need += strlen(avpp->name) + 1; /* include room for NULL */ } else { Modified: brlcad/trunk/src/librt/db5_scan.c =================================================================== --- brlcad/trunk/src/librt/db5_scan.c 2009-11-23 18:31:24 UTC (rev 36597) +++ brlcad/trunk/src/librt/db5_scan.c 2009-11-23 20:30:52 UTC (rev 36598) @@ -210,6 +210,10 @@ RT_CK_DBI(dbip); + if (client_data && RT_G_DEBUG&DEBUG_DB) { + bu_log("WARNING: db5_diradd() received non-NULL client_data\n"); + } + bu_vls_init(&local); bu_vls_strcpy(&local, rip->name.ext_buf); if (db_dircheck(dbip, &local, 0, &headp) < 0) { Modified: brlcad/trunk/src/librt/db5_types.c =================================================================== --- brlcad/trunk/src/librt/db5_types.c 2009-11-23 18:31:24 UTC (rev 36597) +++ brlcad/trunk/src/librt/db5_types.c 2009-11-23 20:30:52 UTC (rev 36598) @@ -52,7 +52,7 @@ * and it must occur below any of its entries that * have heed_minor==1. */ -const static struct db5_type type_table[] = { +static const struct db5_type type_table[] = { { DB5_MAJORTYPE_BRLCAD, DB5_MINORTYPE_BRLCAD_TOR, 1, "tor", "torus" }, This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |