[brlcad-commits] SF.net SVN: brlcad:[36735] brlcad/trunk/src/librt/primitives
Open Source Solid Modeling CAD
Brought to you by:
brlcad
From: <br...@us...> - 2009-12-01 06:55:00
|
Revision: 36735 http://brlcad.svn.sourceforge.net/brlcad/?rev=36735&view=rev Author: brlcad Date: 2009-12-01 06:54:52 +0000 (Tue, 01 Dec 2009) Log Message: ----------- more whooosh.. massive ws style indent comment consistency update. also includes dead code elimination and much static->HIDDEN on funcs. should be no logic changes. Modified Paths: -------------- brlcad/trunk/src/librt/primitives/part/part.c brlcad/trunk/src/librt/primitives/part/part_mirror.c brlcad/trunk/src/librt/primitives/pipe/pipe.c brlcad/trunk/src/librt/primitives/pipe/pipe_brep.cpp brlcad/trunk/src/librt/primitives/pipe/pipe_mirror.c brlcad/trunk/src/librt/primitives/pnts/pnts.c brlcad/trunk/src/librt/primitives/poly/poly.c brlcad/trunk/src/librt/primitives/poly/poly_brep.cpp brlcad/trunk/src/librt/primitives/poly/poly_mirror.c brlcad/trunk/src/librt/primitives/rec/rec.c brlcad/trunk/src/librt/primitives/revolve/revolve.c brlcad/trunk/src/librt/primitives/revolve/revolve.h brlcad/trunk/src/librt/primitives/revolve/revolve_brep.cpp Modified: brlcad/trunk/src/librt/primitives/part/part.c =================================================================== --- brlcad/trunk/src/librt/primitives/part/part.c 2009-11-30 22:03:11 UTC (rev 36734) +++ brlcad/trunk/src/librt/primitives/part/part.c 2009-12-01 06:54:52 UTC (rev 36735) @@ -37,7 +37,7 @@ * be transformed into a set of points on a unit cylinder (or cone) * with the transformed base (V') located at the origin with a * transformed radius of 1 (vrad'). The height of the cylinder (or - * cone) along the +Z axis is +1 (ie, H' = (0, 0, 1) ), with a + * cone) along the +Z axis is +1 (ie, H' = (0, 0, 1)), with a * transformed radius of hrad/vrad. * * @@ -48,18 +48,18 @@ * finding two unit vectors A and B mutually perpendicular, and * perp. to H. * - * X' = S(R( X - V )) + * X' = S(R(X - V)) * * where R(X) rotates H to the +Z axis, and S(X) scales vrad' to 1 and * |H'| to 1. * - * where R(X) = ( A/(|A|) ) - * ( B/(|B|) ) . X - * ( H/(|H|) ) + * where R(X) = (A/(|A|)) + * (B/(|B|)) . X + * (H/(|H|)) * - * and S(X) = ( 1/|A| 0 0 ) - * ( 0 1/|B| 0 ) . X - * ( 0 0 1/|H| ) + * and S(X) = (1/|A| 0 0) + * (0 1/|B| 0) . X + * (0 0 1/|H|) * * To find the intersection of a line with the surface of the cylinder, * consider the parametric line L: @@ -71,7 +71,7 @@ * * L' : { P'(n) | P' + t(n) . D' } * - * W = invR( invS( W' ) ) + V + * W = invR(invS(W')) + V * * Where W' = k D' + P'. * @@ -123,19 +123,19 @@ * correspond to the roots of the quadratic. The quadratic formula * yields values for "t" * - * t = [ -b +/- sqrt( b** - 4 * a * c ) ] / ( 2 * a ) + * t = [ -b +/- sqrt(b** - 4 * a * c) ] / (2 * a) * * This parameter "t" can be substituted into the formulas for either * L' or L, because affine transformations preserve distances along * lines. * - * Now, D' = S( R( D ) ) - * and P' = S( R( P - V ) ) + * Now, D' = S(R(D)) + * and P' = S(R(P - V)) * * Substituting, * - * W = V + invR( invS[ k *( S( R( D ) ) ) + S( R( P - V ) ) ] ) - * = V + invR( ( k * R( D ) ) + R( P - V ) ) + * W = V + invR(invS[ k *(S(R(D))) + S(R(P - V)) ]) + * = V + invR((k * R(D)) + R(P - V)) * = V + k * D + P - V * = k * D + P * @@ -148,7 +148,7 @@ * NORMALS. Given the point W on the surface of the cylinder, what is * the vector normal to the tangent plane at that point? * - * Map W onto the unit cylinder, ie: W' = S( R( W - V ) ). + * Map W onto the unit cylinder, ie: W' = S(R(W - V)). * * Plane on unit cylinder at W' has a normal vector N' of the same * value as W' in x and y, with z set to zero, ie, (Wx', Wy', 0) @@ -156,10 +156,10 @@ * The plane transforms back to the tangent plane at W, and this new * plane (on the original cylinder) has a normal vector of N, viz: * - * N = inverse[ transpose(invR o invS) ] ( N' ) - * = inverse[ transpose(invS) o transpose(invR) ] ( N' ) - * = inverse[ inverse(S) o R ] ( N' ) - * = invR o S ( N' ) + * N = inverse[ transpose(invR o invS) ] (N') + * = inverse[ transpose(invS) o transpose(invR) ] (N') + * = inverse[ inverse(S) o R ] (N') + * = invR o S (N') * * Note that the normal vector produced above will not have unit length. * @@ -193,22 +193,23 @@ struct part_specific { - struct rt_part_internal part_int; - mat_t part_SoR; /* Scale(Rot(vect)) */ - mat_t part_invRoS; /* invRot(Scale(vect)) */ - fastf_t part_vrad_prime; - fastf_t part_hrad_prime; + struct rt_part_internal part_int; + mat_t part_SoR; /* Scale(Rot(vect)) */ + mat_t part_invRoS; /* invRot(Scale(vect)) */ + fastf_t part_vrad_prime; + fastf_t part_hrad_prime; /* For the "equivalent cone" */ - fastf_t part_v_hdist; /* dist of base plate on unit cone */ - fastf_t part_h_hdist; - fastf_t part_v_erad; /* radius of equiv. particle */ - fastf_t part_h_erad; + fastf_t part_v_hdist; /* dist of base plate on unit cone */ + fastf_t part_h_hdist; + fastf_t part_v_erad; /* radius of equiv. particle */ + fastf_t part_h_erad; }; + /* hit_surfno flags for which end was hit */ -#define RT_PARTICLE_SURF_VSPHERE 1 -#define RT_PARTICLE_SURF_BODY 2 -#define RT_PARTICLE_SURF_HSPHERE 3 +#define RT_PARTICLE_SURF_VSPHERE 1 +#define RT_PARTICLE_SURF_BODY 2 +#define RT_PARTICLE_SURF_HSPHERE 3 const struct bu_structparse rt_part_parse[] = { { "%f", 3, "V", bu_offsetof(struct rt_part_internal, part_V[X]), BU_STRUCTPARSE_FUNC_NULL }, @@ -220,52 +221,52 @@ /** - * R T _ P A R T _ P R E P + * R T _ P A R T _ P R E P * - * Given a pointer to a GED database record, and a transformation matrix, - * determine if this is a valid particle, and if so, precompute various - * terms of the formula. + * Given a pointer to a GED database record, and a transformation matrix, + * determine if this is a valid particle, and if so, precompute various + * terms of the formula. * - * Returns - - * 0 particle is OK - * !0 Error in description + * Returns - + * 0 particle is OK + * !0 Error in description * - * Implicit return - - * A struct part_specific is created, and it's address is stored in - * stp->st_specific for use by part_shot(). + * Implicit return - + * A struct part_specific is created, and it's address is stored in + * stp->st_specific for use by part_shot(). */ int rt_part_prep(struct soltab *stp, struct rt_db_internal *ip, struct rt_i *rtip) { register struct part_specific *part; - struct rt_part_internal *pip; - vect_t Hunit; - vect_t a, b; - mat_t R, Rinv; - mat_t S; - vect_t max, min; - vect_t tip; - fastf_t inv_hlen; - fastf_t hlen; - fastf_t hlen_sq; - fastf_t r_diff; - fastf_t r_diff_sq; - fastf_t sin_theta; - fastf_t cos_theta; + struct rt_part_internal *pip; + vect_t Hunit; + vect_t a, b; + mat_t R, Rinv; + mat_t S; + vect_t max, min; + vect_t tip; + fastf_t inv_hlen; + fastf_t hlen; + fastf_t hlen_sq; + fastf_t r_diff; + fastf_t r_diff_sq; + fastf_t sin_theta; + fastf_t cos_theta; - RT_CK_DB_INTERNAL( ip ); + RT_CK_DB_INTERNAL(ip); pip = (struct rt_part_internal *)ip->idb_ptr; RT_PART_CK_MAGIC(pip); - BU_GETSTRUCT( part, part_specific ); + BU_GETSTRUCT(part, part_specific); stp->st_specific = (genptr_t)part; part->part_int = *pip; /* struct copy */ pip = &part->part_int; - if ( pip->part_type == RT_PARTICLE_TYPE_SPHERE ) { + if (pip->part_type == RT_PARTICLE_TYPE_SPHERE) { /* XXX Ought to hand off to rt_sph_prep() here */ /* Compute bounding sphere and RPP */ - VMOVE( stp->st_center, pip->part_V ); + VMOVE(stp->st_center, pip->part_V); stp->st_aradius = stp->st_bradius = pip->part_vrad; stp->st_min[X] = pip->part_V[X] - pip->part_vrad; stp->st_max[X] = pip->part_V[X] + pip->part_vrad; @@ -277,33 +278,33 @@ } /* Compute some essential terms */ - hlen_sq = MAGSQ(pip->part_H ); - if ( hlen_sq <= SMALL ) { + hlen_sq = MAGSQ(pip->part_H); + if (hlen_sq <= SMALL) { bu_log("part(%s): 0-length H vector\n", stp->st_dp->d_namep); return 1; /* BAD */ } hlen = sqrt(hlen_sq); inv_hlen = 1/hlen; - VSCALE( Hunit, pip->part_H, inv_hlen ); - bn_vec_ortho( a, Hunit ); - VCROSS( b, Hunit, a ); + VSCALE(Hunit, pip->part_H, inv_hlen); + bn_vec_ortho(a, Hunit); + VCROSS(b, Hunit, a); /* - * Compute parameters for the "equivalent cone" + * Compute parameters for the "equivalent cone" */ /* Calculate changes in terms of the "unit particle" */ - if ( pip->part_vrad >= pip->part_hrad ) { + if (pip->part_vrad >= pip->part_hrad) { /* V end is larger, H end is smaller */ r_diff = (pip->part_vrad - pip->part_hrad) * inv_hlen; r_diff_sq = r_diff * r_diff; - if ( r_diff_sq > 1 ) { + if (r_diff_sq > 1) { /* No "equivalent cone" is possible, theta=90deg */ sin_theta = 1; cos_theta = 0; } else { - sin_theta = sqrt( 1 - r_diff_sq ); - cos_theta = fabs( r_diff ); + sin_theta = sqrt(1 - r_diff_sq); + cos_theta = fabs(r_diff); } part->part_v_erad = pip->part_vrad / sin_theta; @@ -316,13 +317,13 @@ /* H end is larger, V end is smaller */ r_diff = (pip->part_hrad - pip->part_vrad) * inv_hlen; r_diff_sq = r_diff * r_diff; - if ( r_diff_sq > 1 ) { + if (r_diff_sq > 1) { /* No "equivalent cone" is possible, theta=90deg */ sin_theta = 1; cos_theta = 0; } else { - sin_theta = sqrt( 1 - r_diff_sq ); - cos_theta = fabs( r_diff ); + sin_theta = sqrt(1 - r_diff_sq); + cos_theta = fabs(r_diff); } part->part_v_erad = pip->part_vrad / sin_theta; @@ -333,29 +334,29 @@ part->part_h_hdist = 1 - cos_theta * pip->part_hrad * inv_hlen; } /* Thanks to matrix S, vrad_prime is always 1 */ -/*#define VRAD_PRIME 1 */ +/*#define VRAD_PRIME 1 */ /*#define HRAD_PRIME (part->part_int.part_hrad / part->part_int.part_vrad) */ part->part_vrad_prime = 1; part->part_hrad_prime = part->part_h_erad / part->part_v_erad; /* Compute R and Rinv */ - MAT_IDN( R ); - VMOVE( &R[0], a ); /* has unit length */ - VMOVE( &R[4], b ); /* has unit length */ - VMOVE( &R[8], Hunit ); - bn_mat_trn( Rinv, R ); + MAT_IDN(R); + VMOVE(&R[0], a); /* has unit length */ + VMOVE(&R[4], b); /* has unit length */ + VMOVE(&R[8], Hunit); + bn_mat_trn(Rinv, R); /* Compute scale matrix S, where |A| = |B| = equiv_Vradius */ - MAT_IDN( S ); + MAT_IDN(S); S[ 0] = 1.0 / part->part_v_erad; S[ 5] = S[0]; S[10] = inv_hlen; - bn_mat_mul( part->part_SoR, S, R ); - bn_mat_mul( part->part_invRoS, Rinv, S ); + bn_mat_mul(part->part_SoR, S, R); + bn_mat_mul(part->part_invRoS, Rinv, S); /* RPP and bounding sphere */ - VJOIN1( stp->st_center, pip->part_V, 0.5, pip->part_H ); + VJOIN1(stp->st_center, pip->part_V, 0.5, pip->part_H); stp->st_aradius = stp->st_bradius = pip->part_vrad; @@ -366,32 +367,33 @@ stp->st_min[Z] = pip->part_V[Z] - pip->part_vrad; stp->st_max[Z] = pip->part_V[Z] + pip->part_vrad; - VADD2( tip, pip->part_V, pip->part_H ); + VADD2(tip, pip->part_V, pip->part_H); min[X] = tip[X] - pip->part_hrad; max[X] = tip[X] + pip->part_hrad; min[Y] = tip[Y] - pip->part_hrad; max[Y] = tip[Y] + pip->part_hrad; min[Z] = tip[Z] - pip->part_hrad; max[Z] = tip[Z] + pip->part_hrad; - VMINMAX( stp->st_min, stp->st_max, min ); - VMINMAX( stp->st_min, stp->st_max, max ); + VMINMAX(stp->st_min, stp->st_max, min); + VMINMAX(stp->st_min, stp->st_max, max); /* Determine bounding sphere from the RPP */ { - register fastf_t f; - vect_t work; - VSUB2SCALE( work, stp->st_max, stp->st_min, 0.5 ); /* radius */ + register fastf_t f; + vect_t work; + VSUB2SCALE(work, stp->st_max, stp->st_min, 0.5); /* radius */ f = work[X]; - if ( work[Y] > f ) f = work[Y]; - if ( work[Z] > f ) f = work[Z]; + if (work[Y] > f) f = work[Y]; + if (work[Z] > f) f = work[Z]; stp->st_aradius = f; stp->st_bradius = MAGNITUDE(work); } return(0); /* OK */ } + /** - * R T _ P A R T _ P R I N T + * R T _ P A R T _ P R I N T */ void rt_part_print(register const struct soltab *stp) @@ -399,41 +401,42 @@ register const struct part_specific *part = (struct part_specific *)stp->st_specific; - VPRINT("part_V", part->part_int.part_V ); - VPRINT("part_H", part->part_int.part_H ); - bu_log("part_vrad=%g\n", part->part_int.part_vrad ); - bu_log("part_hrad=%g\n", part->part_int.part_hrad ); + VPRINT("part_V", part->part_int.part_V); + VPRINT("part_H", part->part_int.part_H); + bu_log("part_vrad=%g\n", part->part_int.part_vrad); + bu_log("part_hrad=%g\n", part->part_int.part_hrad); - switch ( part->part_int.part_type ) { + switch (part->part_int.part_type) { case RT_PARTICLE_TYPE_SPHERE: bu_log("part_type = SPHERE\n"); break; case RT_PARTICLE_TYPE_CYLINDER: bu_log("part_type = CYLINDER\n"); - bn_mat_print("part_SoR", part->part_SoR ); - bn_mat_print("part_invRoS", part->part_invRoS ); + bn_mat_print("part_SoR", part->part_SoR); + bn_mat_print("part_invRoS", part->part_invRoS); break; case RT_PARTICLE_TYPE_CONE: bu_log("part_type = CONE\n"); - bn_mat_print("part_SoR", part->part_SoR ); - bn_mat_print("part_invRoS", part->part_invRoS ); + bn_mat_print("part_SoR", part->part_SoR); + bn_mat_print("part_invRoS", part->part_invRoS); break; default: - bu_log("part_type = %d ???\n", part->part_int.part_type ); + bu_log("part_type = %d ???\n", part->part_int.part_type); break; } } + /** - * R T _ P A R T _ S H O T + * R T _ P A R T _ S H O T * - * Intersect a ray with a part. - * If an intersection occurs, a struct seg will be acquired - * and filled in. + * Intersect a ray with a part. + * If an intersection occurs, a struct seg will be acquired + * and filled in. * - * Returns - - * 0 MISS - * >0 HIT + * Returns - + * 0 MISS + * >0 HIT */ int rt_part_shot(struct soltab *stp, register struct xray *rp, struct application *ap, struct seg *seghead) @@ -441,35 +444,35 @@ register struct part_specific *part = (struct part_specific *)stp->st_specific; register struct seg *segp; - vect_t dprime; /* D' */ - point_t pprime; /* P' */ - point_t xlated; /* translated ray start point */ - fastf_t t1, t2; /* distance constants of solution */ - fastf_t f; + vect_t dprime; /* D' */ + point_t pprime; /* P' */ + point_t xlated; /* translated ray start point */ + fastf_t t1, t2; /* distance constants of solution */ + fastf_t f; struct hit hits[4]; /* 4 potential hit points */ register struct hit *hitp = &hits[0]; - int check_v, check_h; + int check_v, check_h; - if ( part->part_int.part_type == RT_PARTICLE_TYPE_SPHERE ) { - vect_t ov; /* ray orgin to center (V - P) */ - fastf_t vrad_sq; - fastf_t magsq_ov; /* length squared of ov */ - fastf_t b; /* second term of quadratic eqn */ - fastf_t root; /* root of radical */ + if (part->part_int.part_type == RT_PARTICLE_TYPE_SPHERE) { + vect_t ov; /* ray orgin to center (V - P) */ + fastf_t vrad_sq; + fastf_t magsq_ov; /* length squared of ov */ + fastf_t b; /* second term of quadratic eqn */ + fastf_t root; /* root of radical */ - VSUB2( ov, part->part_int.part_V, rp->r_pt ); - b = VDOT( rp->r_dir, ov ); + VSUB2(ov, part->part_int.part_V, rp->r_pt); + b = VDOT(rp->r_dir, ov); magsq_ov = MAGSQ(ov); - if ( magsq_ov >= (vrad_sq = part->part_int.part_vrad * - part->part_int.part_vrad) ) { + if (magsq_ov >= (vrad_sq = part->part_int.part_vrad * + part->part_int.part_vrad)) { /* ray origin is outside of sphere */ - if ( b < 0 ) { + if (b < 0) { /* ray direction is away from sphere */ return(0); /* No hit */ } root = b*b - magsq_ov + vrad_sq; - if ( root <= 0 ) { + if (root <= 0) { /* no real roots */ return(0); /* No hit */ } @@ -488,16 +491,16 @@ segp->seg_out.hit_magic = RT_HIT_MAGIC; segp->seg_out.hit_dist = b + root; segp->seg_out.hit_surfno = RT_PARTICLE_SURF_VSPHERE; - BU_LIST_INSERT( &(seghead->l), &(segp->l) ); + BU_LIST_INSERT(&(seghead->l), &(segp->l)); return(2); /* HIT */ } /* Transform ray to coordinate system of unit cone at origin */ - MAT4X3VEC( dprime, part->part_SoR, rp->r_dir ); - VSUB2( xlated, rp->r_pt, part->part_int.part_V ); - MAT4X3VEC( pprime, part->part_SoR, xlated ); + MAT4X3VEC(dprime, part->part_SoR, rp->r_dir); + VSUB2(xlated, rp->r_pt, part->part_int.part_V); + MAT4X3VEC(pprime, part->part_SoR, xlated); - if ( NEAR_ZERO(dprime[X], SMALL) && NEAR_ZERO(dprime[Y], SMALL) ) { + if (NEAR_ZERO(dprime[X], SMALL) && NEAR_ZERO(dprime[Y], SMALL)) { check_v = check_h = 1; goto check_hemispheres; } @@ -505,24 +508,24 @@ /* Find roots of the equation, using forumla for quadratic */ /* Note that vrad' = 1 and hrad' = hrad/vrad */ - if ( part->part_int.part_type == RT_PARTICLE_TYPE_CYLINDER ) { + if (part->part_int.part_type == RT_PARTICLE_TYPE_CYLINDER) { /* Cylinder case, hrad == vrad, m = 0 */ - fastf_t a, b, c; - fastf_t root; /* root of radical */ + fastf_t a, b, c; + fastf_t root; /* root of radical */ a = dprime[X]*dprime[X] + dprime[Y]*dprime[Y]; b = dprime[X]*pprime[X] + dprime[Y]*pprime[Y]; c = pprime[X]*pprime[X] + pprime[Y]*pprime[Y] - 1; - if ( (root = b*b - a * c) <= 0 ) + if ((root = b*b - a * c) <= 0) goto check_hemispheres; root = sqrt(root); t1 = (root-b) / a; t2 = -(root+b) / a; } else { /* Cone case */ - fastf_t a, b, c; - fastf_t root; /* root of radical */ - fastf_t m, msq; + fastf_t a, b, c; + fastf_t root; /* root of radical */ + fastf_t m, msq; m = part->part_hrad_prime - part->part_vrad_prime; @@ -539,7 +542,7 @@ 2 * m * pprime[Z] - 1; /* was: ... -2m * vrad' * Pz' - vrad'**2 */ - if ( (root = b*b - a * c) <= 0 ) + if ((root = b*b - a * c) <= 0) goto check_hemispheres; root = sqrt(root); @@ -548,14 +551,14 @@ } /* - * t1 and t2 are potential solutions to intersection with side. - * Find hit' point, see if Z values fall in range. + * t1 and t2 are potential solutions to intersection with side. + * Find hit' point, see if Z values fall in range. */ - if ( (f = pprime[Z] + t1 * dprime[Z]) >= part->part_v_hdist ) { + if ((f = pprime[Z] + t1 * dprime[Z]) >= part->part_v_hdist) { check_h = 1; /* may also hit off end */ - if ( f <= part->part_h_hdist ) { + if (f <= part->part_h_hdist) { hitp->hit_magic = RT_HIT_MAGIC; - /** VJOIN1( hitp->hit_vpriv, pprime, t1, dprime ); **/ + /** VJOIN1(hitp->hit_vpriv, pprime, t1, dprime); **/ hitp->hit_vpriv[X] = pprime[X] + t1 * dprime[X]; hitp->hit_vpriv[Y] = pprime[Y] + t1 * dprime[Y]; hitp->hit_vpriv[Z] = f; @@ -567,11 +570,11 @@ check_v = 1; } - if ( (f = pprime[Z] + t2 * dprime[Z]) >= part->part_v_hdist ) { + if ((f = pprime[Z] + t2 * dprime[Z]) >= part->part_v_hdist) { check_h = 1; /* may also hit off end */ - if ( f <= part->part_h_hdist ) { + if (f <= part->part_h_hdist) { hitp->hit_magic = RT_HIT_MAGIC; - /** VJOIN1( hitp->hit_vpriv, pprime, t2, dprime ); **/ + /** VJOIN1(hitp->hit_vpriv, pprime, t2, dprime); **/ hitp->hit_vpriv[X] = pprime[X] + t2 * dprime[X]; hitp->hit_vpriv[Y] = pprime[Y] + t2 * dprime[Y]; hitp->hit_vpriv[Z] = f; @@ -584,31 +587,31 @@ } /* - * Check for hitting the end hemispheres. + * Check for hitting the end hemispheres. */ check_hemispheres: - if ( check_v ) { - vect_t ov; /* ray orgin to center (V - P) */ - fastf_t rad_sq; - fastf_t magsq_ov; /* length squared of ov */ - fastf_t b; - fastf_t root; /* root of radical */ + if (check_v) { + vect_t ov; /* ray orgin to center (V - P) */ + fastf_t rad_sq; + fastf_t magsq_ov; /* length squared of ov */ + fastf_t b; + fastf_t root; /* root of radical */ /* - * First, consider a hit on V hemisphere. + * First, consider a hit on V hemisphere. */ - VSUB2( ov, part->part_int.part_V, rp->r_pt ); - b = VDOT( rp->r_dir, ov ); + VSUB2(ov, part->part_int.part_V, rp->r_pt); + b = VDOT(rp->r_dir, ov); magsq_ov = MAGSQ(ov); - if ( magsq_ov >= (rad_sq = part->part_int.part_vrad * - part->part_int.part_vrad) ) { + if (magsq_ov >= (rad_sq = part->part_int.part_vrad * + part->part_int.part_vrad)) { /* ray origin is outside of sphere */ - if ( b < 0 ) { + if (b < 0) { /* ray direction is away from sphere */ goto do_check_h; } root = b*b - magsq_ov + rad_sq; - if ( root <= 0 ) { + if (root <= 0) { /* no real roots */ goto do_check_h; } @@ -618,14 +621,14 @@ root = sqrt(root); t1 = b - root; /* see if hit'[Z] is below V end of cylinder */ - if ( pprime[Z] + t1 * dprime[Z] <= part->part_v_hdist ) { + if (pprime[Z] + t1 * dprime[Z] <= part->part_v_hdist) { hitp->hit_magic = RT_HIT_MAGIC; hitp->hit_dist = t1; hitp->hit_surfno = RT_PARTICLE_SURF_VSPHERE; hitp++; } t2 = b + root; - if ( pprime[Z] + t2 * dprime[Z] <= part->part_v_hdist ) { + if (pprime[Z] + t2 * dprime[Z] <= part->part_v_hdist) { hitp->hit_magic = RT_HIT_MAGIC; hitp->hit_dist = t2; hitp->hit_surfno = RT_PARTICLE_SURF_VSPHERE; @@ -634,29 +637,29 @@ } do_check_h: - if ( check_h ) { - vect_t ov; /* ray orgin to center (V - P) */ - fastf_t rad_sq; - fastf_t magsq_ov; /* length squared of ov */ - fastf_t b; /* second term of quadratic eqn */ - fastf_t root; /* root of radical */ + if (check_h) { + vect_t ov; /* ray orgin to center (V - P) */ + fastf_t rad_sq; + fastf_t magsq_ov; /* length squared of ov */ + fastf_t b; /* second term of quadratic eqn */ + fastf_t root; /* root of radical */ /* - * Next, consider a hit on H hemisphere + * Next, consider a hit on H hemisphere */ - VADD2( ov, part->part_int.part_V, part->part_int.part_H ); - VSUB2( ov, ov, rp->r_pt ); - b = VDOT( rp->r_dir, ov ); + VADD2(ov, part->part_int.part_V, part->part_int.part_H); + VSUB2(ov, ov, rp->r_pt); + b = VDOT(rp->r_dir, ov); magsq_ov = MAGSQ(ov); - if ( magsq_ov >= (rad_sq = part->part_int.part_hrad * - part->part_int.part_hrad) ) { + if (magsq_ov >= (rad_sq = part->part_int.part_hrad * + part->part_int.part_hrad)) { /* ray origin is outside of sphere */ - if ( b < 0 ) { + if (b < 0) { /* ray direction is away from sphere */ goto out; } root = b*b - magsq_ov + rad_sq; - if ( root <= 0 ) { + if (root <= 0) { /* no real roots */ goto out; } @@ -666,14 +669,14 @@ root = sqrt(root); t1 = b - root; /* see if hit'[Z] is above H end of cylinder */ - if ( pprime[Z] + t1 * dprime[Z] >= part->part_h_hdist ) { + if (pprime[Z] + t1 * dprime[Z] >= part->part_h_hdist) { hitp->hit_magic = RT_HIT_MAGIC; hitp->hit_dist = t1; hitp->hit_surfno = RT_PARTICLE_SURF_HSPHERE; hitp++; } t2 = b + root; - if ( pprime[Z] + t2 * dprime[Z] >= part->part_h_hdist ) { + if (pprime[Z] + t2 * dprime[Z] >= part->part_h_hdist) { hitp->hit_magic = RT_HIT_MAGIC; hitp->hit_dist = t2; hitp->hit_surfno = RT_PARTICLE_SURF_HSPHERE; @@ -681,30 +684,30 @@ } } out: - if ( hitp == &hits[0] ) + if (hitp == &hits[0]) return(0); /* MISS */ - if ( hitp == &hits[1] ) { + if (hitp == &hits[1]) { /* Only one hit, make it a 0-thickness segment */ hits[1] = hits[0]; /* struct copy */ hitp++; - } else if ( hitp > &hits[2] ) { + } else if (hitp > &hits[2]) { /* - * More than two intersections found. - * This can happen when a ray grazes down along a tangent - * line; the intersection interval from the hemisphere - * may not quite join up with the interval from the cone. - * Since particles are convex, all we need to do is to - * return the maximum extent of the ray. - * Do this by sorting the intersections, - * and using the minimum and maximum values. + * More than two intersections found. + * This can happen when a ray grazes down along a tangent + * line; the intersection interval from the hemisphere + * may not quite join up with the interval from the cone. + * Since particles are convex, all we need to do is to + * return the maximum extent of the ray. + * Do this by sorting the intersections, + * and using the minimum and maximum values. */ - rt_hitsort( hits, hitp - &hits[0] ); + rt_hitsort(hits, hitp - &hits[0]); /* [0] is minimum, make [1] be maximum (hitp is +1 off end) */ hits[1] = hitp[-1]; /* struct copy */ } - if ( hits[0].hit_dist < hits[1].hit_dist ) { + if (hits[0].hit_dist < hits[1].hit_dist) { /* entry is [0], exit is [1] */ register struct seg *segp; @@ -712,7 +715,7 @@ segp->seg_stp = stp; segp->seg_in = hits[0]; /* struct copy */ segp->seg_out = hits[1]; /* struct copy */ - BU_LIST_INSERT( &(seghead->l), &(segp->l) ); + BU_LIST_INSERT(&(seghead->l), &(segp->l)); } else { /* entry is [1], exit is [0] */ register struct seg *segp; @@ -721,17 +724,18 @@ segp->seg_stp = stp; segp->seg_in = hits[1]; /* struct copy */ segp->seg_out = hits[0]; /* struct copy */ - BU_LIST_INSERT( &(seghead->l), &(segp->l) ); + BU_LIST_INSERT(&(seghead->l), &(segp->l)); } return(2); /* HIT */ } + #define SEG_MISS(SEG) (SEG).seg_stp=(struct soltab *) 0; /** - * R T _ P A R T _ V S H O T + * R T _ P A R T _ V S H O T * - * Vectorized version. + * Vectorized version. */ void rt_part_vshot(struct soltab **stp, struct xray **rp, struct seg *segp, int n, struct application *ap) @@ -741,13 +745,14 @@ /* Number of ray/object pairs */ { - rt_vstub( stp, rp, segp, n, ap ); + rt_vstub(stp, rp, segp, n, ap); } + /** - * R T _ P A R T _ N O R M + * R T _ P A R T _ N O R M * - * Given ONE ray distance, return the normal and entry/exit point. + * Given ONE ray distance, return the normal and entry/exit point. */ void rt_part_norm(register struct hit *hitp, struct soltab *stp, register struct xray *rp) @@ -755,28 +760,28 @@ register struct part_specific *part = (struct part_specific *)stp->st_specific; - VJOIN1( hitp->hit_point, rp->r_pt, hitp->hit_dist, rp->r_dir ); - switch ( hitp->hit_surfno ) { + VJOIN1(hitp->hit_point, rp->r_pt, hitp->hit_dist, rp->r_dir); + switch (hitp->hit_surfno) { case RT_PARTICLE_SURF_VSPHERE: - VSUB2( hitp->hit_normal, hitp->hit_point, part->part_int.part_V ); - VUNITIZE( hitp->hit_normal ); + VSUB2(hitp->hit_normal, hitp->hit_point, part->part_int.part_V); + VUNITIZE(hitp->hit_normal); break; case RT_PARTICLE_SURF_HSPHERE: - VSUB3( hitp->hit_normal, hitp->hit_point, - part->part_int.part_V, part->part_int.part_H ); - VUNITIZE( hitp->hit_normal ); + VSUB3(hitp->hit_normal, hitp->hit_point, + part->part_int.part_V, part->part_int.part_H); + VUNITIZE(hitp->hit_normal); break; case RT_PARTICLE_SURF_BODY: /* compute it */ - if ( part->part_int.part_type == RT_PARTICLE_TYPE_CYLINDER ) { + if (part->part_int.part_type == RT_PARTICLE_TYPE_CYLINDER) { /* The X' and Y' components of hit' are N' */ hitp->hit_vpriv[Z] = 0; - MAT4X3VEC( hitp->hit_normal, part->part_invRoS, - hitp->hit_vpriv ); - VUNITIZE( hitp->hit_normal ); + MAT4X3VEC(hitp->hit_normal, part->part_invRoS, + hitp->hit_vpriv); + VUNITIZE(hitp->hit_normal); } else { /* The cone case */ - fastf_t s, m; + fastf_t s, m; vect_t unorm; /* vpriv[Z] ranges from 0 to 1 (roughly) */ /* Rescale X' and Y' into unit circle */ @@ -786,77 +791,79 @@ unorm[Y] = hitp->hit_vpriv[Y] * s; /* Z' is constant, from slope of cylinder wall*/ unorm[Z] = -m / sqrt(m*m+1); - MAT4X3VEC( hitp->hit_normal, part->part_invRoS, unorm ); - VUNITIZE( hitp->hit_normal ); + MAT4X3VEC(hitp->hit_normal, part->part_invRoS, unorm); + VUNITIZE(hitp->hit_normal); } break; } } + /** - * R T _ P A R T _ C U R V E + * R T _ P A R T _ C U R V E * - * Return the curvature of the particle. - * There are two cases: hitting a hemisphere, and hitting the cylinder. + * Return the curvature of the particle. + * There are two cases: hitting a hemisphere, and hitting the cylinder. */ void rt_part_curve(register struct curvature *cvp, register struct hit *hitp, struct soltab *stp) { register struct part_specific *part = (struct part_specific *)stp->st_specific; - point_t hit_local; /* hit_point, with V as origin */ - point_t hit_unit; /* hit_poit in unit coords, +Z along H */ + point_t hit_local; /* hit_point, with V as origin */ + point_t hit_unit; /* hit_poit in unit coords, +Z along H */ - switch ( hitp->hit_surfno ) { + switch (hitp->hit_surfno) { case RT_PARTICLE_SURF_VSPHERE: - bn_vec_ortho( cvp->crv_pdir, hitp->hit_normal ); + bn_vec_ortho(cvp->crv_pdir, hitp->hit_normal); cvp->crv_c1 = cvp->crv_c2 = -part->part_int.part_vrad; break; case RT_PARTICLE_SURF_HSPHERE: - bn_vec_ortho( cvp->crv_pdir, hitp->hit_normal ); + bn_vec_ortho(cvp->crv_pdir, hitp->hit_normal); cvp->crv_c1 = cvp->crv_c2 = -part->part_int.part_hrad; break; case RT_PARTICLE_SURF_BODY: /* Curvature in only one direction, around H */ - VCROSS( cvp->crv_pdir, hitp->hit_normal, part->part_int.part_H ); - VUNITIZE( cvp->crv_pdir ); + VCROSS(cvp->crv_pdir, hitp->hit_normal, part->part_int.part_H); + VUNITIZE(cvp->crv_pdir); /* Interpolate radius between vrad and hrad */ - VSUB2( hit_local, hitp->hit_point, part->part_int.part_V ); - MAT4X3VEC( hit_unit, part->part_SoR, hit_local ); + VSUB2(hit_local, hitp->hit_point, part->part_int.part_V); + MAT4X3VEC(hit_unit, part->part_SoR, hit_local); /* hit_unit[Z] ranges from 0 at V to 1 at H, interpolate */ cvp->crv_c1 = -( part->part_v_erad * hit_unit[Z] + - part->part_h_erad * (1 - hit_unit[Z]) ); + part->part_h_erad * (1 - hit_unit[Z])); cvp->crv_c2 = 0; break; } } + /** - * R T _ P A R T _ U V + * R T _ P A R T _ U V * - * For a hit on the surface of a particle, return the (u, v) coordinates - * of the hit point, 0 <= u, v <= 1. - * u = azimuth - * v = elevation along H + * For a hit on the surface of a particle, return the (u, v) coordinates + * of the hit point, 0 <= u, v <= 1. + * u = azimuth + * v = elevation along H * - * The 'u' coordinate wraps around the particle, once. - * The 'v' coordinate covers the 'height' of the particle, - * from V-r1 to (V+H)+r2. + * The 'u' coordinate wraps around the particle, once. + * The 'v' coordinate covers the 'height' of the particle, + * from V-r1 to (V+H)+r2. * - * hit_point has already been computed. + * hit_point has already been computed. */ void rt_part_uv(struct application *ap, struct soltab *stp, register struct hit *hitp, register struct uvcoord *uvp) { register const struct part_specific *part = (struct part_specific *)stp->st_specific; - point_t hit_local; /* hit_point, with V as origin */ - point_t hit_unit; /* hit_poit in unit coords, +Z along H */ + point_t hit_local; /* hit_point, with V as origin */ + point_t hit_unit; /* hit_poit in unit coords, +Z along H */ fastf_t hsize; - fastf_t hmag_inv; + fastf_t hmag_inv; fastf_t vrad_unit; - fastf_t r; + fastf_t r; fastf_t minrad; RT_PART_CK_MAGIC(&part->part_int.part_magic); @@ -866,14 +873,14 @@ part->part_h_erad*hmag_inv; /* Transform hit point into unit particle coords */ - VSUB2( hit_local, hitp->hit_point, part->part_int.part_V ); - MAT4X3VEC( hit_unit, part->part_SoR, hit_local ); + VSUB2(hit_local, hitp->hit_point, part->part_int.part_V); + MAT4X3VEC(hit_unit, part->part_SoR, hit_local); /* normalize 0..1 */ uvp->uv_v = (hit_unit[Z] + vrad_unit) / hsize; /* U is azimuth, atan() range: -pi to +pi */ - uvp->uv_u = bn_atan2( hit_unit[Y], hit_unit[X] ) * bn_inv2pi; - if ( uvp->uv_u < 0 ) + uvp->uv_u = bn_atan2(hit_unit[Y], hit_unit[X]) * bn_inv2pi; + if (uvp->uv_u < 0) uvp->uv_u += 1.0; /* approximation: beam_r / (solid_circumference = 2 * pi * radius) */ @@ -884,8 +891,9 @@ bn_inv2pi * r / minrad; } + /** - * R T _ P A R T _ F R E E + * R T _ P A R T _ F R E E */ void rt_part_free(register struct soltab *stp) @@ -893,12 +901,13 @@ register struct part_specific *part = (struct part_specific *)stp->st_specific; - bu_free( (char *)part, "part_specific" ); + bu_free((char *)part, "part_specific"); stp->st_specific = GENPTR_NULL; } + /** - * R T _ P A R T _ C L A S S + * R T _ P A R T _ C L A S S */ int rt_part_class(void) @@ -906,17 +915,18 @@ return(0); } + /** - * R T _ P A R T _ H E M I S P H E R E 8 + * R T _ P A R T _ H E M I S P H E R E 8 * - * Produce a crude approximation to a hemisphere, - * 8 points around the rim [0]..[7], - * 4 points around a midway latitude [8]..[11], and - * 1 point at the pole [12]. + * Produce a crude approximation to a hemisphere, + * 8 points around the rim [0]..[7], + * 4 points around a midway latitude [8]..[11], and + * 1 point at the pole [12]. * - * For the dome, connect up: - * 0 8 12 10 4 - * 2 9 12 11 6 + * For the dome, connect up: + * 0 8 12 10 4 + * 2 9 12 11 6 */ HIDDEN void rt_part_hemisphere(register point_t (*ov), register fastf_t *v, fastf_t *a, fastf_t *b, fastf_t *h) @@ -924,248 +934,252 @@ register float cos45 = 0.707107; /* This is the top of the dome */ - VADD2( ov[12], v, h ); + VADD2(ov[12], v, h); - VADD2( ov[0], v, a ); - VJOIN2( ov[1], v, cos45, a, cos45, b ); - VADD2( ov[2], v, b ); - VJOIN2( ov[3], v, -cos45, a, cos45, b ); - VSUB2( ov[4], v, a ); - VJOIN2( ov[5], v, -cos45, a, -cos45, b ); - VSUB2( ov[6], v, b ); - VJOIN2( ov[7], v, cos45, a, -cos45, b ); + VADD2(ov[0], v, a); + VJOIN2(ov[1], v, cos45, a, cos45, b); + VADD2(ov[2], v, b); + VJOIN2(ov[3], v, -cos45, a, cos45, b); + VSUB2(ov[4], v, a); + VJOIN2(ov[5], v, -cos45, a, -cos45, b); + VSUB2(ov[6], v, b); + VJOIN2(ov[7], v, cos45, a, -cos45, b); - VJOIN2( ov[8], v, cos45, a, cos45, h ); - VJOIN2( ov[10], v, -cos45, a, cos45, h ); + VJOIN2(ov[8], v, cos45, a, cos45, h); + VJOIN2(ov[10], v, -cos45, a, cos45, h); - VJOIN2( ov[9], v, cos45, b, cos45, h ); - VJOIN2( ov[11], v, -cos45, b, cos45, h ); + VJOIN2(ov[9], v, cos45, b, cos45, h); + VJOIN2(ov[11], v, -cos45, b, cos45, h); /* Obviously, this could be optimized quite a lot more */ } + /** - * R T _ P A R T _ P L O T + * R T _ P A R T _ P L O T */ int rt_part_plot(struct bu_list *vhead, struct rt_db_internal *ip, const struct rt_tess_tol *ttol, const struct bn_tol *tol) { - struct rt_part_internal *pip; - point_t tail; - point_t sphere_rim[16]; - point_t vhemi[13]; - point_t hhemi[13]; - vect_t a, b, c; /* defines coord sys of part */ - vect_t as, bs, hs; /* scaled by radius */ - vect_t Hunit; - register int i; + struct rt_part_internal *pip; + point_t tail; + point_t sphere_rim[16]; + point_t vhemi[13]; + point_t hhemi[13]; + vect_t a, b, c; /* defines coord sys of part */ + vect_t as, bs, hs; /* scaled by radius */ + vect_t Hunit; + register int i; RT_CK_DB_INTERNAL(ip); pip = (struct rt_part_internal *)ip->idb_ptr; RT_PART_CK_MAGIC(pip); - if ( pip->part_type == RT_PARTICLE_TYPE_SPHERE ) { + if (pip->part_type == RT_PARTICLE_TYPE_SPHERE) { /* For the sphere, 3 rings of 16 points */ - VSET( a, pip->part_vrad, 0, 0 ); - VSET( b, 0, pip->part_vrad, 0 ); - VSET( c, 0, 0, pip->part_vrad ); + VSET(a, pip->part_vrad, 0, 0); + VSET(b, 0, pip->part_vrad, 0); + VSET(c, 0, 0, pip->part_vrad); - rt_ell_16pts( &sphere_rim[0][X], pip->part_V, a, b ); - RT_ADD_VLIST( vhead, sphere_rim[15], BN_VLIST_LINE_MOVE ); - for ( i=0; i<16; i++ ) { - RT_ADD_VLIST( vhead, sphere_rim[i], BN_VLIST_LINE_DRAW ); + rt_ell_16pts(&sphere_rim[0][X], pip->part_V, a, b); + RT_ADD_VLIST(vhead, sphere_rim[15], BN_VLIST_LINE_MOVE); + for (i=0; i<16; i++) { + RT_ADD_VLIST(vhead, sphere_rim[i], BN_VLIST_LINE_DRAW); } - rt_ell_16pts( &sphere_rim[0][X], pip->part_V, b, c ); - RT_ADD_VLIST( vhead, sphere_rim[15], BN_VLIST_LINE_MOVE ); - for ( i=0; i<16; i++ ) { - RT_ADD_VLIST( vhead, sphere_rim[i], BN_VLIST_LINE_DRAW ); + rt_ell_16pts(&sphere_rim[0][X], pip->part_V, b, c); + RT_ADD_VLIST(vhead, sphere_rim[15], BN_VLIST_LINE_MOVE); + for (i=0; i<16; i++) { + RT_ADD_VLIST(vhead, sphere_rim[i], BN_VLIST_LINE_DRAW); } - rt_ell_16pts( &sphere_rim[0][X], pip->part_V, a, c ); - RT_ADD_VLIST( vhead, sphere_rim[15], BN_VLIST_LINE_MOVE ); - for ( i=0; i<16; i++ ) { - RT_ADD_VLIST( vhead, sphere_rim[i], BN_VLIST_LINE_DRAW ); + rt_ell_16pts(&sphere_rim[0][X], pip->part_V, a, c); + RT_ADD_VLIST(vhead, sphere_rim[15], BN_VLIST_LINE_MOVE); + for (i=0; i<16; i++) { + RT_ADD_VLIST(vhead, sphere_rim[i], BN_VLIST_LINE_DRAW); } return(0); /* OK */ } - VMOVE( Hunit, pip->part_H ); - VUNITIZE( Hunit ); - bn_vec_perp( a, Hunit ); + VMOVE(Hunit, pip->part_H); + VUNITIZE(Hunit); + bn_vec_perp(a, Hunit); VUNITIZE(a); - VCROSS( b, Hunit, a ); + VCROSS(b, Hunit, a); VUNITIZE(b); - VSCALE( as, a, pip->part_vrad ); - VSCALE( bs, b, pip->part_vrad ); - VSCALE( hs, Hunit, -pip->part_vrad ); - rt_part_hemisphere( vhemi, pip->part_V, as, bs, hs ); + VSCALE(as, a, pip->part_vrad); + VSCALE(bs, b, pip->part_vrad); + VSCALE(hs, Hunit, -pip->part_vrad); + rt_part_hemisphere(vhemi, pip->part_V, as, bs, hs); - VADD2( tail, pip->part_V, pip->part_H ); - VSCALE( as, a, pip->part_hrad ); - VSCALE( bs, b, pip->part_hrad ); - VSCALE( hs, Hunit, pip->part_hrad ); - rt_part_hemisphere( hhemi, tail, as, bs, hs ); + VADD2(tail, pip->part_V, pip->part_H); + VSCALE(as, a, pip->part_hrad); + VSCALE(bs, b, pip->part_hrad); + VSCALE(hs, Hunit, pip->part_hrad); + rt_part_hemisphere(hhemi, tail, as, bs, hs); /* Draw V end hemisphere */ - RT_ADD_VLIST( vhead, vhemi[0], BN_VLIST_LINE_MOVE ); - for ( i=7; i >= 0; i-- ) { - RT_ADD_VLIST( vhead, vhemi[i], BN_VLIST_LINE_DRAW ); + RT_ADD_VLIST(vhead, vhemi[0], BN_VLIST_LINE_MOVE); + for (i=7; i >= 0; i--) { + RT_ADD_VLIST(vhead, vhemi[i], BN_VLIST_LINE_DRAW); } - RT_ADD_VLIST( vhead, vhemi[8], BN_VLIST_LINE_DRAW ); - RT_ADD_VLIST( vhead, vhemi[12], BN_VLIST_LINE_DRAW ); - RT_ADD_VLIST( vhead, vhemi[10], BN_VLIST_LINE_DRAW ); - RT_ADD_VLIST( vhead, vhemi[4], BN_VLIST_LINE_DRAW ); - RT_ADD_VLIST( vhead, vhemi[2], BN_VLIST_LINE_MOVE ); - RT_ADD_VLIST( vhead, vhemi[9], BN_VLIST_LINE_DRAW ); - RT_ADD_VLIST( vhead, vhemi[12], BN_VLIST_LINE_DRAW ); - RT_ADD_VLIST( vhead, vhemi[11], BN_VLIST_LINE_DRAW ); - RT_ADD_VLIST( vhead, vhemi[6], BN_VLIST_LINE_DRAW ); + RT_ADD_VLIST(vhead, vhemi[8], BN_VLIST_LINE_DRAW); + RT_ADD_VLIST(vhead, vhemi[12], BN_VLIST_LINE_DRAW); + RT_ADD_VLIST(vhead, vhemi[10], BN_VLIST_LINE_DRAW); + RT_ADD_VLIST(vhead, vhemi[4], BN_VLIST_LINE_DRAW); + RT_ADD_VLIST(vhead, vhemi[2], BN_VLIST_LINE_MOVE); + RT_ADD_VLIST(vhead, vhemi[9], BN_VLIST_LINE_DRAW); + RT_ADD_VLIST(vhead, vhemi[12], BN_VLIST_LINE_DRAW); + RT_ADD_VLIST(vhead, vhemi[11], BN_VLIST_LINE_DRAW); + RT_ADD_VLIST(vhead, vhemi[6], BN_VLIST_LINE_DRAW); /* Draw H end hemisphere */ - RT_ADD_VLIST( vhead, hhemi[0], BN_VLIST_LINE_MOVE ); - for ( i=7; i >= 0; i-- ) { - RT_ADD_VLIST( vhead, hhemi[i], BN_VLIST_LINE_DRAW ); + RT_ADD_VLIST(vhead, hhemi[0], BN_VLIST_LINE_MOVE); + for (i=7; i >= 0; i--) { + RT_ADD_VLIST(vhead, hhemi[i], BN_VLIST_LINE_DRAW); } - RT_ADD_VLIST( vhead, hhemi[8], BN_VLIST_LINE_DRAW ); - RT_ADD_VLIST( vhead, hhemi[12], BN_VLIST_LINE_DRAW ); - RT_ADD_VLIST( vhead, hhemi[10], BN_VLIST_LINE_DRAW ); - RT_ADD_VLIST( vhead, hhemi[4], BN_VLIST_LINE_DRAW ); - RT_ADD_VLIST( vhead, hhemi[2], BN_VLIST_LINE_MOVE ); - RT_ADD_VLIST( vhead, hhemi[9], BN_VLIST_LINE_DRAW ); - RT_ADD_VLIST( vhead, hhemi[12], BN_VLIST_LINE_DRAW ); - RT_ADD_VLIST( vhead, hhemi[11], BN_VLIST_LINE_DRAW ); - RT_ADD_VLIST( vhead, hhemi[6], BN_VLIST_LINE_DRAW ); + RT_ADD_VLIST(vhead, hhemi[8], BN_VLIST_LINE_DRAW); + RT_ADD_VLIST(vhead, hhemi[12], BN_VLIST_LINE_DRAW); + RT_ADD_VLIST(vhead, hhemi[10], BN_VLIST_LINE_DRAW); + RT_ADD_VLIST(vhead, hhemi[4], BN_VLIST_LINE_DRAW); + RT_ADD_VLIST(vhead, hhemi[2], BN_VLIST_LINE_MOVE); + RT_ADD_VLIST(vhead, hhemi[9], BN_VLIST_LINE_DRAW); + RT_ADD_VLIST(vhead, hhemi[12], BN_VLIST_LINE_DRAW); + RT_ADD_VLIST(vhead, hhemi[11], BN_VLIST_LINE_DRAW); + RT_ADD_VLIST(vhead, hhemi[6], BN_VLIST_LINE_DRAW); /* Draw 4 connecting lines */ - RT_ADD_VLIST( vhead, vhemi[0], BN_VLIST_LINE_MOVE ); - RT_ADD_VLIST( vhead, hhemi[0], BN_VLIST_LINE_DRAW ); - RT_ADD_VLIST( vhead, vhemi[2], BN_VLIST_LINE_MOVE ); - RT_ADD_VLIST( vhead, hhemi[2], BN_VLIST_LINE_DRAW ); - RT_ADD_VLIST( vhead, vhemi[4], BN_VLIST_LINE_MOVE ); - RT_ADD_VLIST( vhead, hhemi[4], BN_VLIST_LINE_DRAW ); - RT_ADD_VLIST( vhead, vhemi[6], BN_VLIST_LINE_MOVE ); - RT_ADD_VLIST( vhead, hhemi[6], BN_VLIST_LINE_DRAW ); + RT_ADD_VLIST(vhead, vhemi[0], BN_VLIST_LINE_MOVE); + RT_ADD_VLIST(vhead, hhemi[0], BN_VLIST_LINE_DRAW); + RT_ADD_VLIST(vhead, vhemi[2], BN_VLIST_LINE_MOVE); + RT_ADD_VLIST(vhead, hhemi[2], BN_VLIST_LINE_DRAW); + RT_ADD_VLIST(vhead, vhemi[4], BN_VLIST_LINE_MOVE); + RT_ADD_VLIST(vhead, hhemi[4], BN_VLIST_LINE_DRAW); + RT_ADD_VLIST(vhead, vhemi[6], BN_VLIST_LINE_MOVE); + RT_ADD_VLIST(vhead, hhemi[6], BN_VLIST_LINE_DRAW); return(0); } + struct part_state { - struct shell *s; - mat_t upper_invRinvS; - mat_t upper_invRoS; - mat_t lower_invRinvS; - mat_t lower_invRoS; - fastf_t theta_tol; + struct shell *s; + mat_t upper_invRinvS; + mat_t upper_invRoS; + mat_t lower_invRinvS; + mat_t lower_invRoS; + fastf_t theta_tol; }; + struct part_vert_strip { - int nverts_per_strip; - int nverts; - struct vertex **vp; - vect_t *norms; - int nfaces; - struct faceuse **fu; + int nverts_per_strip; + int nverts; + struct vertex **vp; + vect_t *norms; + int nfaces; + struct faceuse **fu; }; + /** - * R T _ P A R T _ T E S S + * R T _ P A R T _ T E S S * - * Based upon the tesselator for the ellipsoid. + * Based upon the tesselator for the ellipsoid. * - * Break the particle into three parts: - * Upper hemisphere 0..nsegs H North - * middle cylinder nsegs..nsegs+1 - * lower hemisphere nsegs+1..nstrips-1 V South + * Break the particle into three parts: + * Upper hemisphere 0..nsegs H North + * middle cylinder nsegs..nsegs+1 + * lower hemisphere nsegs+1..nstrips-1 V South */ int rt_part_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_part_internal *pip; - mat_t R; - mat_t S; - mat_t invR; - mat_t invS; - vect_t zz; - vect_t hcenter; - struct part_state state; - register int i; - fastf_t radius; - int nsegs; - int nstrips; - struct part_vert_strip *strips; - int j; - struct vertex **vertp[5]; - int faceno; - int stripno; - int boff; /* base offset */ - int toff; /* top offset */ - int blim; /* base subscript limit */ - int tlim; /* top subscrpit limit */ - fastf_t rel; /* Absolutized relative tolerance */ + struct rt_part_internal *pip; + mat_t R; + mat_t S; + mat_t invR; + mat_t invS; + vect_t zz; + vect_t hcenter; + struct part_state state; + register int i; + fastf_t radius; + int nsegs; + int nstrips; + struct part_vert_strip *strips; + int j; + struct vertex **vertp[5]; + int faceno; + int stripno; + int boff; /* base offset */ + int toff; /* top offset */ + int blim; /* base subscript limit */ + int tlim; /* top subscrpit limit */ + fastf_t rel; /* Absolutized relative tolerance */ RT_CK_DB_INTERNAL(ip); pip = (struct rt_part_internal *)ip->idb_ptr; RT_PART_CK_MAGIC(pip); - if ( pip->part_type == RT_PARTICLE_TYPE_SPHERE ) + if (pip->part_type == RT_PARTICLE_TYPE_SPHERE) return(-1); /* For now, concentrate on the most important kind. */ - VADD2( hcenter, pip->part_V, pip->part_H ); + VADD2(hcenter, pip->part_V, pip->part_H); /* Compute R and Rinv matrices */ /* R is the same for both upper and lower hemispheres */ /* R is rotation from model coords to unit sphere */ /* For rotation of the particle, +H (model) becomes +Z (unit sph) */ - VSET( zz, 0, 0, 1 ); - bn_mat_fromto( R, pip->part_H, zz ); - bn_mat_trn( invR, R ); /* inv of rot mat is trn */ + VSET(zz, 0, 0, 1); + bn_mat_fromto(R, pip->part_H, zz); + bn_mat_trn(invR, R); /* inv of rot mat is trn */ /*** Upper (H) ***/ /* Compute S and invS matrices */ /* invS is just 1/diagonal elements */ - MAT_IDN( S ); + MAT_IDN(S); S[ 0] = S[ 5] = S[10] = 1/pip->part_hrad; - bn_mat_inv( invS, S ); + bn_mat_inv(invS, S); /* invRinvS, for converting points from unit sphere to model */ - bn_mat_mul( state.upper_invRinvS, invR, invS ); + bn_mat_mul(state.upper_invRinvS, invR, invS); /* invRoS, for converting normals from unit sphere to model */ - bn_mat_mul( state.upper_invRoS, invR, S ); + bn_mat_mul(state.upper_invRoS, invR, S); /*** Lower (V) ***/ /* Compute S and invS matrices */ /* invS is just 1/diagonal elements */ - MAT_IDN( S ); + MAT_IDN(S); S[ 0] = S[ 5] = S[10] = 1/pip->part_vrad; - bn_mat_inv( invS, S ); + bn_mat_inv(invS, S); /* invRinvS, for converting points from unit sphere to model */ - bn_mat_mul( state.lower_invRinvS, invR, invS ); + bn_mat_mul(state.lower_invRinvS, invR, invS); /* invRoS, for converting normals from unit sphere to model */ - bn_mat_mul( state.lower_invRoS, invR, S ); + bn_mat_mul(state.lower_invRoS, invR, S); /* Find the larger of two hemispheres */ radius = pip->part_vrad; - if ( pip->part_hrad > radius ) + if (pip->part_hrad > radius) radius = pip->part_hrad; /* - * Establish tolerances + * Establish tolerances */ - if ( ttol->rel <= 0.0 || ttol->rel >= 1.0 ) { + if (ttol->rel <= 0.0 || ttol->rel >= 1.0) { rel = 0.0; /* none */ } else { /* Convert rel to absolute by scaling by radius */ rel = ttol->rel * radius; } - if ( ttol->abs <= 0.0 ) { - if ( rel <= 0.0 ) { + if (ttol->abs <= 0.0) { + if (rel <= 0.0) { /* No tolerance given, use a default */ rel = 0.10 * radius; /* 10% */ } else { @@ -1173,41 +1187,40 @@ } } else { /* Absolute tolerance was given, pick smaller */ - if ( ttol->rel <= 0.0 || rel > ttol->abs ) - { + if (ttol->rel <= 0.0 || rel > ttol->abs) { rel = ttol->abs; - if ( rel > radius ) + if (rel > radius) rel = radius; } } /* - * Converte distance tolerance into a maximum permissible - * angle tolerance. 'radius' is largest radius. + * Converte distance tolerance into a maximum permissible + * angle tolerance. 'radius' is largest radius. */ - state.theta_tol = 2 * acos( 1.0 - rel / radius ); + state.theta_tol = 2 * acos(1.0 - rel / radius); /* To ensure normal tolerance, remain below this angle */ - if ( ttol->norm > 0.0 && ttol->norm < state.theta_tol ) { + if (ttol->norm > 0.0 && ttol->norm < state.theta_tol) { state.theta_tol = ttol->norm; } - *r = nmg_mrsv( m ); /* Make region, empty shell, vertex */ + *r = nmg_mrsv(m); /* Make region, empty shell, vertex */ state.s = BU_LIST_FIRST(shell, &(*r)->s_hd); /* Find the number of segments to divide 90 degrees worth into */ nsegs = bn_halfpi / state.theta_tol + 0.999; - if ( nsegs < 2 ) nsegs = 2; + if (nsegs < 2) nsegs = 2; - /* Find total number of strips of vertices that will be needed. - * nsegs for each hemisphere, plus one equator each. - * The two equators will be stitched together to make the cylinder. - * Note that faces are listed in the the stripe ABOVE, ie, toward - * the poles. Thus, strips[0] will have 4 faces. + /* Find total number of strips of vertices that will be needed. + * nsegs for each hemisphere, plus one equator each. + * The two equators will be stitched together to make the cylinder. + * Note that faces are listed in the the stripe ABOVE, ie, toward + * the poles. Thus, strips[0] will have 4 faces. */ nstrips = 2 * nsegs + 2; - strips = (struct part_vert_strip *)bu_calloc( nstrips, - sizeof(struct part_vert_strip), "strips[]" ); + strips = (struct part_vert_strip *)bu_calloc(nstrips, + sizeof(struct part_vert_strip), "strips[]"); /* North pole (Upper hemisphere, H end) */ strips[0].nverts = 1; @@ -1226,7 +1239,7 @@ strips[nsegs+1].nverts_per_strip = nsegs; strips[nsegs+1].nfaces = 0; - for ( i=1; i<nsegs; i++ ) { + for (i=1; i<nsegs; i++) { strips[i].nverts_per_strip = strips[nstrips-1-i].nverts_per_strip = i; strips[i].nverts = @@ -1235,50 +1248,50 @@ strips[nstrips-1-i].nfaces = (2 * i + 1)*4; } /* All strips have vertices and normals */ - for ( i=0; i<nstrips; i++ ) { - strips[i].vp = (struct vertex **)bu_calloc( strips[i].nverts, - sizeof(struct vertex *), "strip vertex[]" ); - strips[i].norms = (vect_t *)bu_calloc( strips[i].nverts, - sizeof( vect_t ), "strip normals[]" ); + for (i=0; i<nstrips; i++) { + strips[i].vp = (struct vertex **)bu_calloc(strips[i].nverts, + sizeof(struct vertex *), "strip vertex[]"); + strips[i].norms = (vect_t *)bu_calloc(strips[i].nverts, + sizeof(vect_t), "strip normals[]"); } /* All strips have faces, except for the one (marked) equator */ - for ( i=0; i < nstrips; i++ ) { - if ( strips[i].nfaces <= 0 ) { + for (i=0; i < nstrips; i++) { + if (strips[i].nfaces <= 0) { strips[i].fu = (struct faceuse **)NULL; continue; } - strips[i].fu = (struct faceuse **)bu_calloc( strips[i].nfaces, - sizeof(struct faceuse *), "strip faceuse[]" ); + strips[i].fu = (struct faceuse **)bu_calloc(strips[i].nfaces, + sizeof(struct faceuse *), "strip faceuse[]"); } /* First, build the triangular mesh topology */ /* Do the top. "toff" in i-1 is UP, towards +B */ - for ( i = 1; i <= nsegs; i++ ) { + for (i = 1; i <= nsegs; i++) { faceno = 0; tlim = strips[i-1].nverts; blim = strips[i].nverts; - for ( stripno=0; stripno<4; stripno++ ) { + for (stripno=0; stripno<4; stripno++) { toff = stripno * strips[i-1].nverts_per_strip; boff = stripno * strips[i].nverts_per_strip; /* Connect this quarter strip */ - for ( j = 0; j < strips[i].nverts_per_strip; j++ ) { + for (j = 0; j < strips[i].nverts_per_strip; j++) { /* "Right-side-up" triangle */ vertp[0] = &(strips[i].vp[j+boff]); vertp[1] = &(strips[i].vp[(j+1+boff)%blim]); vertp[2] = &(strips[i-1].vp[(j+toff)%tlim]); - if ( (strips[i-1].fu[faceno++] = nmg_cmface(state.s, vertp, 3 )) == 0 ) { + if ((strips[i-1].fu[faceno++] = nmg_cmface(state.s, vertp, 3)) == 0) { bu_log("rt_part_tess() nmg_cmface failure\n"); goto fail; } - if ( j+1 >= strips[i].nverts_per_strip ) break; + if (j+1 >= strips[i].nverts_per_strip) break; /* Follow with interior "Up-side-down" triangle */ vertp[0] = &(strips[i].vp[(j+1+boff)%blim]); vertp[1] = &(strips[i-1].vp[(j+1+toff)%tlim]); vertp[2] = &(strips[i-1].vp[(j+toff)%tlim]); - if ( (strips[i-1].fu[faceno++] = nmg_cmface(state.s, vertp, 3 )) == 0 ) { + if ((strips[i-1].fu[faceno++] = nmg_cmface(state.s, vertp, 3)) == 0) { bu_log("rt_part_tess() nmg_cmface failure\n"); goto fail; } @@ -1294,14 +1307,14 @@ blim = strips[i].nverts; { /* Connect this whole strip */ - for ( j = 0; j < strips[i].nverts; j++ ) { + for (j = 0; j < strips[i].nverts; j++) { /* "Right-side-up" rectangle */ vertp[3] = &(strips[i].vp[(j)%blim]); vertp[2] = &(strips[i-1].vp[(j)%tlim]); vertp[1] = &(strips[i-1].vp[(j+1)%tlim]); vertp[0] = &(strips[i].vp[(j+1)%blim]); - if ( (strips[i-1].fu[faceno++] = nmg_cmface(state.s, vertp, 4 )) == 0 ) { + if ((strips[i-1].fu[faceno++] = nmg_cmface(state.s, vertp, 4)) == 0) { bu_log("rt_part_tess() nmg_cmface failure\n"); goto fail; } @@ -1310,32 +1323,32 @@ } /* Do the bottom. Everything is upside down. "toff" in i+1 is DOWN */ - for ( i = nsegs+1; i < nstrips; i++ ) { + for (i = nsegs+1; i < nstrips; i++) { faceno = 0; tlim = strips[i+1].nverts; blim = strips[i].nverts; - for ( stripno=0; stripno<4; stripno++ ) { + for (stripno=0; stripno<4; stripno++) { toff = stripno * strips[i+1].nverts_per_strip; boff = stripno * strips[i].nverts_per_strip; /* Connect this quarter strip */ - for ( j = 0; j < strips[i].nverts_per_strip; j++ ) { + for (j = 0; j < strips[i].nverts_per_strip; j++) { /* "Right-side-up" triangle */ vertp[0] = &(strips[i].vp[j+boff]); vertp[1] = &(strips[i+1].vp[(j+toff)%tlim]); vertp[2] = &(strips[i].vp[(j+1+boff)%blim]); - if ( (strips[i+1].fu[faceno++] = nmg_cmface(state.s, vertp, 3 )) == 0 ) { + if ((strips[i+1].fu[faceno++] = nmg_cmface(state.s, vertp, 3)) == 0) { bu_log("rt_part_tess() nmg_cmface failure\n"); goto fail; } - if ( j+1 >= strips[i].nverts_per_strip ) break; + if (j+1 >= strips[i].nverts_per_strip) break; /* Follow with interior "Up-side-down" triangle */ vertp[0] = &(strips[i].vp[(j+1+boff)%blim]); vertp[1] = &(strips[i+1].vp[(j+toff)%tlim]); vertp[2] = &(strips[i+1].vp[(j+1+toff)%tlim]); - if ( (strips[i+1].fu[faceno++] = nmg_cmface(state.s, vertp, 3 )) == 0 ) { + if ((strips[i+1].fu[faceno++] = nmg_cmface(state.s, vertp, 3)) == 0) { bu_log("rt_part_tess() nmg_cmface failure\n"); goto fail; } @@ -1343,197 +1356,195 @@ } } - /* Compute the geometry of each vertex. - * Start with the location in the unit sphere, and project back. - * i=0 is "straight up" along +H. + /* Compute the geometry of each vertex. + * Start with the location in the unit sphere, and project back. + * i=0 is "straight up" along +H. */ - for ( i=0; i < nstrips; i++ ) { - double alpha; /* decline down from B to A */ - double beta; /* angle around equator (azimuth) */ - fastf_t cos_alpha, sin_alpha; - fastf_t cos_beta, sin_beta; - point_t sphere_pt; - point_t model_pt; + for (i=0; i < nstrips; i++) { + double alpha; /* decline down from B to A */ + double beta; /* angle around equator (azimuth) */ + fastf_t cos_alpha, sin_alpha; + fastf_t cos_beta, sin_beta; + point_t sphere_pt; + point_t model_pt; /* Compensate for extra equator */ - if ( i <= nsegs ) + if (i <= nsegs) alpha = (((double)i) / (nstrips-1-1)); else alpha = (((double)i-1) / (nstrips-1-1)); cos_alpha = cos(alpha*bn_pi); sin_alpha = sin(alpha*bn_pi); - for ( j=0; j < strips[i].nverts; j++ ) { + for (j=0; j < strips[i].nverts; j++) { beta = ((double)j) / strips[i].nverts; cos_beta = cos(beta*bn_twopi); sin_beta = sin(beta*bn_twopi); - VSET( sphere_pt, - cos_beta * sin_alpha, - sin_beta * sin_alpha, - cos_alpha ); + VSET(sphere_pt, + cos_beta * sin_alpha, + sin_beta * sin_alpha, + cos_alpha); /* Convert from ideal sphere coordinates */ - if ( i <= nsegs ) { - MAT4X3PNT( model_pt, state.upper_invRinvS, sphere_pt ); - VADD2( model_pt, model_pt, hcenter ); + if (i <= nsegs) { + MAT4X3PNT(model_pt, state.upper_invRinvS, sphere_pt); + VADD2(model_pt, model_pt, hcenter); /* Convert sphere normal to ellipsoid normal */ - MAT4X3VEC( strips[i].norms[j], state.upper_invRoS, sphere_pt ); + MAT4X3VEC(strips[i].norms[j], state.upper_invRoS, sphere_pt); } else { - MAT4X3PNT( model_pt, state.lower_invRinvS, sphere_pt ); - VADD2( model_pt, model_pt, pip->part_V ); + MAT4X3PNT(model_pt, state.lower_invRinvS, sphere_pt); + VADD2(model_pt, model_pt, pip->part_V); /* Convert sphere normal to ellipsoid normal */ - MAT4X3VEC( strips[i].norms[j], state.lower_invRoS, sphere_pt ); + MAT4X3VEC(strips[i].norms[j], state.lower_invRoS, sphere_pt); } /* May not be unit length anymore */ - VUNITIZE( strips[i].norms[j] ); + VUNITIZE(strips[i].norms[j]); /* Associate vertex geometry */ - nmg_vertex_gv( strips[i].vp[j], model_pt ); + nmg_vertex_gv(strips[i].vp[j], model_pt); } } /* Associate face geometry. lower Equator has no faces */ - for ( i=0; i < nstrips; i++ ) { - for ( j=0; j < strips[i].nfaces; j++ ) { - if ( nmg_fu_planeeqn( strips[i].fu[j], tol ) < 0 ) + for (i=0; i < nstrips; i++) { + for (j=0; j < strips[i].nfaces; j++) { + if (nmg_fu_planeeqn(strips[i].fu[j], tol) < 0) goto fail; } } /* Associate normals with vertexuses */ - for ( i=0; i < nstrips; i++ ) - { - for ( j=0; j < strips[i].nverts; j++ ) - { + for (i=0; i < nstrips; i++) { + for (j=0; j < strips[i].nverts; j++) { struct faceuse *fu; struct vertexuse *vu; vect_t norm_opp; - NMG_CK_VERTEX( strips[i].vp[j] ); - VREVERSE( norm_opp, strips[i].norms[j] ) + NMG_CK_VERTEX(strips[i].vp[j]); + VREVERSE(norm_opp, strips[i].norms[j]) - for ( BU_LIST_FOR( vu, vertexuse, &strips[i].vp[j]->vu_hd ) ) - { - fu = nmg_find_fu_of_vu( vu ); - NMG_CK_FACEUSE( fu ); + for (BU_LIST_FOR(vu, vertexuse, &strips[i].vp[j]->vu_hd)) { + fu = nmg_find_fu_of_vu(vu); + NMG_CK_FACEUSE(fu); /* get correct direction of normals depending on * faceuse orientation */ - if ( fu->orientation == OT_SAME ) - nmg_vertexuse_nv( vu, strips[i].norms[j] ); - else if ( fu->orientation == OT_OPPOSITE ) - nmg_vertexuse_nv( vu, norm_opp ); + if (fu->orientation == OT_SAME) + nmg_vertexuse_nv(vu, strips[i].norms[j]); + else if (fu->orientation == OT_OPPOSITE) + nmg_vertexuse_nv(vu, norm_opp); } } } /* Compute "geometry" for region and shell */ - nmg_region_a( *r, tol ); + nmg_region_a(*r, tol); /* Release memory */ /* All strips have vertices and normals */ - for ( i=0; i<nstrips; i++ ) { - bu_free( (char *)strips[i].vp, "strip vertex[]" ); - bu_free( (char *)strips[i].norms, "strip norms[]" ); + for (i=0; i<nstrips; i++) { + bu_free((char *)strips[i].vp, "strip vertex[]"); + bu_free((char *)strips[i].norms, "strip norms[]"); } /* All strips have faces, except for equator */ - for ( i=0; i < nstrips; i++ ) { - if ( strips[i].fu == (struct faceuse **)0 ) continue; - bu_free( (char *)strips[i].fu, "strip faceuse[]" ); + for (i=0; i < nstrips; i++) { + if (strips[i].fu == (struct faceuse **)0) continue; + bu_free((char *)strips[i].fu, "strip faceuse[]"); } - bu_free( (char *)strips, "strips[]" ); + bu_free((char *)strips, "strips[]"); return(0); fail: /* Release memory */ /* All strips have vertices and normals */ - for ( i=0; i<nstrips; i++ ) { - bu_free( (char *)strips[i].vp, "strip vertex[]" ); - bu_free( (char *)strips[i].norms, "strip norms[]" ); + for (i=0; i<nstrips; i++) { + bu_free((char *)strips[i].vp, "strip vertex[]"); + bu_free((char *)strips[i].norms, "strip norms[]"); } /* All strips have faces, except for equator */ - for ( i=0; i < nstrips; i++ ) { - if ( strips[i].fu == (struct faceuse **)0 ) continue; - bu_free( (char *)strips[i].fu, "strip faceuse[]" ); + for (i=0; i < nstrips; i++) { + if (strips[i].fu == (struct faceuse **)0) continue; + bu_free((char *)strips[i].fu, "strip faceuse[]"); } - bu_free( (char *)s... [truncated message content] |