[brlcad-commits] SF.net SVN: brlcad:[37602] brlcad/trunk/src/librt/primitives
Open Source Solid Modeling CAD
Brought to you by:
brlcad
From: <eri...@us...> - 2010-02-08 20:55:02
|
Revision: 37602 http://brlcad.svn.sourceforge.net/brlcad/?rev=37602&view=rev Author: erikgreenwald Date: 2010-02-08 20:54:34 +0000 (Mon, 08 Feb 2010) Log Message: ----------- solve normals for edge hits and pass them to the cube realizer Modified Paths: -------------- brlcad/trunk/src/librt/primitives/metaball/metaball.c brlcad/trunk/src/librt/primitives/metaball/metaball.h brlcad/trunk/src/librt/primitives/metaball/metaball_tri.c brlcad/trunk/src/librt/primitives/nmg/nmg_tri_mc.c Modified: brlcad/trunk/src/librt/primitives/metaball/metaball.c =================================================================== --- brlcad/trunk/src/librt/primitives/metaball/metaball.c 2010-02-08 20:23:18 UTC (rev 37601) +++ brlcad/trunk/src/librt/primitives/metaball/metaball.c 2010-02-08 20:54:34 UTC (rev 37602) @@ -422,44 +422,47 @@ return retval; } - -/** - * R T _ M E T A B A L L _ N O R M - * - * Given ONE ray distance, return the normal and entry/exit point. - */ -void -rt_metaball_norm(register struct hit *hitp, struct soltab *stp, register struct xray *rp) +inline void +rt_metaball_norm_internal(vect_t *n, point_t *p, struct rt_metaball_internal *mb) { - struct rt_metaball_internal *mb = stp->st_specific; struct wdb_metaballpt *mbpt; vect_t v; fastf_t a; - if (rp) RT_CK_RAY(rp); + VSETALL(*n, 0.0); - VSETALL(hitp->hit_normal, 0.0); - switch (mb->method) { case METABALL_METABALL: bu_log("Sorry, strict metaballs are not yet implemented\n"); break; case METABALL_ISOPOTENTIAL: for (BU_LIST_FOR(mbpt, wdb_metaballpt, &mb->metaball_ctrl_head)) { - VSUB2(v, hitp->hit_point, mbpt->coord); + VSUB2(v, *p, mbpt->coord); a = MAGSQ(v); - VJOIN1(hitp->hit_normal, hitp->hit_normal, fabs(mbpt->fldstr)*mbpt->fldstr / (SQ(a)), v); /* f/r^4 */ + VJOIN1(*n, *n, fabs(mbpt->fldstr)*mbpt->fldstr / (SQ(a)), v); /* f/r^4 */ } break; case METABALL_BLOB: for (BU_LIST_FOR(mbpt, wdb_metaballpt, &mb->metaball_ctrl_head)) { - VSUB2(v, hitp->hit_point, mbpt->coord); + VSUB2(v, *p, mbpt->coord); a = MAGSQ(v); - VJOIN1(hitp->hit_normal, hitp->hit_normal, 2.0*mbpt->sweat/SQ(mbpt->fldstr)*exp(mbpt->sweat*(1-(a/SQ(mbpt->fldstr)))) , v); + VJOIN1(*n, *n, 2.0*mbpt->sweat/SQ(mbpt->fldstr)*exp(mbpt->sweat*(1-(a/SQ(mbpt->fldstr)))) , v); } break; default: bu_log("unknown metaball method\n"); break; } - VUNITIZE(hitp->hit_normal); + VUNITIZE(*n); +} + +/** + * R T _ M E T A B A L L _ N O R M + * + * Given ONE ray distance, return the normal and entry/exit point. + */ +void +rt_metaball_norm(register struct hit *hitp, struct soltab *stp, register struct xray *rp) +{ + if (rp) RT_CK_RAY(rp); /* unused. */ + rt_metaball_norm_internal(&(hitp->hit_normal), &(hitp->hit_point), (struct rt_metaball_internal *)(stp->st_specific)); return; } Modified: brlcad/trunk/src/librt/primitives/metaball/metaball.h =================================================================== --- brlcad/trunk/src/librt/primitives/metaball/metaball.h 2010-02-08 20:23:18 UTC (rev 37601) +++ brlcad/trunk/src/librt/primitives/metaball/metaball.h 2010-02-08 20:54:34 UTC (rev 37602) @@ -21,6 +21,7 @@ void rt_metaball_set_bbox(point_t center, fastf_t radius, point_t *min, point_t *max); fastf_t rt_metaball_get_bounding_sphere(point_t *center, fastf_t threshold, struct rt_metaball_internal *mb); int rt_metaball_find_intersection(point_t *intersect, const struct rt_metaball_internal *mb, const point_t *a, const point_t *b, fastf_t step, const fastf_t finalstep); +void rt_metaball_norm_internal(vect_t *n, point_t *p, struct rt_metaball_internal *mb); /* * Local Variables: Modified: brlcad/trunk/src/librt/primitives/metaball/metaball_tri.c =================================================================== --- brlcad/trunk/src/librt/primitives/metaball/metaball_tri.c 2010-02-08 20:23:18 UTC (rev 37601) +++ brlcad/trunk/src/librt/primitives/metaball/metaball_tri.c 2010-02-08 20:54:34 UTC (rev 37602) @@ -65,7 +65,7 @@ extern int mc_edges[256]; /* TODO: make a real header entry once the signature is good... */ -int rt_nmg_mc_realize_cube(struct shell *s, int pv, point_t *p, point_t *edges, const struct bn_tol *tol); +int rt_nmg_mc_realize_cube(struct shell *s, int pv, point_t *p, point_t *edges, vect_t *normals, const struct bn_tol *tol); /** * R T _ M E T A B A L L _ T E S S @@ -139,10 +139,13 @@ if ( pv != 0 && pv != 255 ) { /* entire cube is either inside or outside */ point_t edges[12]; + vect_t n[12]; int rval; /* compute the edge values (if needed) */ -#define MEH(a,b,c) if(!(pv&(1<<b)&&pv&(1<<c))) rt_metaball_find_intersection(edges+a, mb, (const point_t *)(p+b), (const point_t *)(p+c), mtol, finalstep); +#define MEH(a,b,c) if(!(pv&(1<<b)&&pv&(1<<c))) { \ + rt_metaball_find_intersection(edges+a, mb, (const point_t *)(p+b), (const point_t *)(p+c), mtol, finalstep); \ + rt_metaball_norm_internal(n+a, p+a, mb); } /* magic numbers! an edge, then the two attached vertices. * For edge/vertex mapping, refer to the awesome ascii art * at the beginning of this file. */ @@ -160,7 +163,7 @@ MEH(11,3,7); #undef MEH - rval = rt_nmg_mc_realize_cube(s, pv, (point_t *)p, (point_t *)edges, tol); + rval = rt_nmg_mc_realize_cube(s, pv, (point_t *)p, (point_t *)edges, (vect_t *)n, tol); numtri += rval; if(rval < 0) { bu_log("Error attempting to realize a cube O.o\n"); Modified: brlcad/trunk/src/librt/primitives/nmg/nmg_tri_mc.c =================================================================== --- brlcad/trunk/src/librt/primitives/nmg/nmg_tri_mc.c 2010-02-08 20:23:18 UTC (rev 37601) +++ brlcad/trunk/src/librt/primitives/nmg/nmg_tri_mc.c 2010-02-08 20:54:34 UTC (rev 37602) @@ -372,7 +372,7 @@ /* returns the number of triangles added or -1 on failure */ int -rt_nmg_mc_realize_cube(struct shell *s, int pv, point_t *p, point_t *edges, const struct bn_tol *tol) +rt_nmg_mc_realize_cube(struct shell *s, int pv, point_t *p, point_t *edges, vect_t *normals, const struct bn_tol *tol) { int *vi, fo; struct faceuse *fu; @@ -408,6 +408,7 @@ fu = nmg_cmface(s, f_vertl, 3); + normals = normals; nmg_vertex_gv(vertl[0], edges[vi[0]]); nmg_vertex_gv(vertl[1], edges[vi[1]]); nmg_vertex_gv(vertl[2], edges[vi[2]]); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |