Revision: 54288 http://brlcad.svn.sourceforge.net/brlcad/?rev=54288&view=rev Author: bob1961 Date: 2013-02-01 20:20:41 +0000 (Fri, 01 Feb 2013) Log Message: ----------- Added rt_arb_check_points (used by rt_arb_calc_points and rt_arb_edit to prevent zero length edges).
Modified Paths: -------------- brlcad/trunk/include/raytrace.h brlcad/trunk/src/libged/move_arb_face.c brlcad/trunk/src/librt/primitives/arb8/arb8.c Modified: brlcad/trunk/include/raytrace.h =================================================================== --- brlcad/trunk/include/raytrace.h 2013-02-01 18:43:02 UTC (rev 54287) +++ brlcad/trunk/include/raytrace.h 2013-02-01 20:20:41 UTC (rev 54288) @@ -5460,6 +5460,9 @@ RT_EXPORT extern void rt_arb_centroid(point_t *cent, const struct rt_db_internal *ip); RT_EXPORT extern int rt_arb_calc_points(); /* needs wdb.h for arg list */ +RT_EXPORT extern int rt_arb_check_points(struct rt_arb_internal *arb, + int cgtype, + const struct bn_tol *tol); RT_EXPORT extern int rt_arb_3face_intersect(point_t point, const plane_t planes[6], int type, /* 4..8 */ Modified: brlcad/trunk/src/libged/move_arb_face.c =================================================================== --- brlcad/trunk/src/libged/move_arb_face.c 2013-02-01 18:43:02 UTC (rev 54287) +++ brlcad/trunk/src/libged/move_arb_face.c 2013-02-01 20:20:41 UTC (rev 54288) @@ -72,6 +72,7 @@ struct rt_db_internal intern; struct rt_arb_internal *arb; fastf_t planes[7][4]; /* ARBs defining plane equations */ + fastf_t save_tol_dist; int arb_type; int face; int rflag = 0; @@ -213,7 +214,14 @@ planes[face][3] = VDOT(&planes[face][0], pt); /* calculate new points for the arb */ - (void)rt_arb_calc_points(arb, arb_type, planes, &gedp->ged_wdbp->wdb_tol); + save_tol_dist = gedp->ged_wdbp->wdb_tol.dist; + gedp->ged_wdbp->wdb_tol.dist = gedp->ged_wdbp->wdb_tol.dist * 2; + if (rt_arb_calc_points(arb, arb_type, planes, &gedp->ged_wdbp->wdb_tol) < 0) { + gedp->ged_wdbp->wdb_tol.dist = save_tol_dist; + rt_db_free_internal(&intern); + return GED_ERROR; + } + gedp->ged_wdbp->wdb_tol.dist = save_tol_dist; { int i; Modified: brlcad/trunk/src/librt/primitives/arb8/arb8.c =================================================================== --- brlcad/trunk/src/librt/primitives/arb8/arb8.c 2013-02-01 18:43:02 UTC (rev 54287) +++ brlcad/trunk/src/librt/primitives/arb8/arb8.c 2013-02-01 20:20:41 UTC (rev 54288) @@ -166,7 +166,16 @@ {7,7}, /* point 6 */ }; +short local_arb4_edge_vertex_mapping[6][2] = { + {0,1}, /* edge 12 */ + {1,2}, /* edge 23 */ + {2,0}, /* edge 31 */ + {0,3}, /* edge 14 */ + {1,3}, /* edge 24 */ + {2,3}, /* edge 34 */ +}; + /* rt_arb_get_cgtype(), rt_arb_std_type(), and rt_arb_centroid() * stolen from mged/arbs.c */ @@ -1873,7 +1882,7 @@ * This is an analog of rt_arb_calc_planes(). */ int -rt_arb_calc_points(struct rt_arb_internal *arb, int cgtype, const plane_t planes[6], const struct bn_tol *UNUSED(tol)) +rt_arb_calc_points(struct rt_arb_internal *arb, int cgtype, const plane_t planes[6], const struct bn_tol *tol) { int i; point_t pt[8]; @@ -1888,14 +1897,70 @@ } } - /* Move new points to arb */ + /* Move new points to arb tol->dist))*/ for (i=0; i<8; i++) { VMOVE(arb->pt[i], pt[i]); } + + if (rt_arb_check_points(arb, cgtype, tol) < 0) + return -1; + return 0; /* success */ } +int +rt_arb_check_points(struct rt_arb_internal *arb, int cgtype, const struct bn_tol *tol) +{ + register int i; + + switch (cgtype) { + case ARB8: + for (i=0; i<12; ++i) { + if (VNEAR_EQUAL(arb->pt[arb8_edge_vertex_mapping[i][0]], + arb->pt[arb8_edge_vertex_mapping[i][1]], + tol->dist)) + return -1; + } + break; + case ARB7: + for (i=0; i<11; ++i) { + if (VNEAR_EQUAL(arb->pt[arb7_edge_vertex_mapping[i][0]], + arb->pt[arb7_edge_vertex_mapping[i][1]], + tol->dist)) + return -1; + } + break; + case ARB6: + for (i=0; i<8; ++i) { + if (VNEAR_EQUAL(arb->pt[local_arb6_edge_vertex_mapping[i][0]], + arb->pt[local_arb6_edge_vertex_mapping[i][1]], + tol->dist)) + return -1; + } + break; + case ARB5: + for (i=0; i<8; ++i) { + if (VNEAR_EQUAL(arb->pt[arb5_edge_vertex_mapping[i][0]], + arb->pt[arb5_edge_vertex_mapping[i][1]], + tol->dist)) + return -1; + } + break; + case ARB4: + for (i=0; i<6; ++i) { + if (VNEAR_EQUAL(arb->pt[local_arb4_edge_vertex_mapping[i][0]], + arb->pt[local_arb4_edge_vertex_mapping[i][1]], + tol->dist)) + return -1; + } + break; + } + + return 0; +} + + /* planes to define ARB vertices */ static const int rt_arb_planes[5][24] = { {0, 1, 3, 0, 1, 2, 0, 2, 3, 0, 1, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3}, /* ARB4 */ @@ -2279,6 +2344,9 @@ break; } + if (rt_arb_check_points(arb, arb_type, tol) < 0) + goto err; + return 0; /* OK */ err: This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. ------------------------------------------------------------------------------ Everyone hates slow websites. So do we. Make your web apps faster with AppDynamics Download AppDynamics Lite for free today: http://p.sf.net/sfu/appdyn_d2d_jan _______________________________________________ BRL-CAD Source Commits mailing list brlcad-commits@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/brlcad-commits