[brlcad-commits] SF.net SVN: brlcad:[66090] brlcad/trunk/src/librt/primitives
Open Source Solid Modeling CAD
Brought to you by:
brlcad
From: <vas...@us...> - 2015-08-27 03:25:34
|
Revision: 66090 http://sourceforge.net/p/brlcad/code/66090 Author: vasco_costa Date: 2015-08-27 03:25:31 +0000 (Thu, 27 Aug 2015) Log Message: ----------- update ocl tor implementation to look more similar to tgc. Modified Paths: -------------- brlcad/trunk/src/librt/primitives/tgc/tgc_shot.cl brlcad/trunk/src/librt/primitives/tor/tor_shot.cl Modified: brlcad/trunk/src/librt/primitives/tgc/tgc_shot.cl =================================================================== --- brlcad/trunk/src/librt/primitives/tgc/tgc_shot.cl 2015-08-27 02:25:21 UTC (rev 66089) +++ brlcad/trunk/src/librt/primitives/tgc/tgc_shot.cl 2015-08-27 03:25:31 UTC (rev 66090) @@ -30,7 +30,6 @@ double t_scale; double alf1, alf2; int npts; - int intersect; double3 cor_pprime; /* corrected P prime */ double cor_proj = 0.0; /* corrected projected dist */ int i; @@ -211,12 +210,14 @@ } /* bu_log("npts rooted is %d; ", npts); */ +#ifdef DEBUG /* Here, 'npts' is number of points being returned */ if (npts != 0 && npts != 2 && npts != 4 && npts > 0) { /* LOG */ } else if (nroots < 0) { /* LOG */ } +#endif } /* Modified: brlcad/trunk/src/librt/primitives/tor/tor_shot.cl =================================================================== --- brlcad/trunk/src/librt/primitives/tor/tor_shot.cl 2015-08-27 02:25:21 UTC (rev 66089) +++ brlcad/trunk/src/librt/primitives/tor/tor_shot.cl 2015-08-27 03:25:31 UTC (rev 66090) @@ -16,12 +16,15 @@ double3 work; // temporary vector double C[5]; // The final equation bn_complex_t val[4]; // The complex roots + int l; + int nroots; double k[4]; // The real roots int i; int j; double A[3]; double Asqr[5]; double X2_Y2[3]; // X**2 + Y**2 + int npts; double3 cor_pprime; // new ray origin double cor_proj; @@ -34,11 +37,11 @@ /* normalize distance from torus. substitute corrected pprime * which contains a translation along ray direction to closest * approach to vertex of torus. Translating ray origin along - * direction of ray to closest pt. to origin of solid's coordinate + * direction of ray to closest pt. to origin of solids coordinate * system, new ray origin is 'cor_pprime'. */ - cor_proj = dot(pprime, dprime); - cor_pprime = pprime - dprime * cor_proj; + cor_proj = -dot(pprime, dprime); + cor_pprime = pprime + cor_proj * dprime; /* Given a line and a ratio, alpha, finds the equation of the unit * torus in terms of the variable 't'. @@ -85,97 +88,69 @@ /* It is known that the equation is 4th order. Therefore, if the * root finder returns other than 4 roots, error. */ - if ((i = rt_poly_roots(C, 4, val)) != 4) { - return 0; // MISS - } + nroots = rt_poly_roots(C, 4, val); /* Only real roots indicate an intersection in real space. * - * Look at each root returned; if the imaginary part is zero or - * sufficiently close, then use the real part as one value of 't' - * for the intersections + * Look at each root returned; if the imaginary part is zero + * or sufficiently close, then use the real part as one value + * of 't' for the intersections */ - for (j=0, i=0; j < 4; j++) { - if (NEAR_ZERO(val[j].im, RT_PCOEF_TOL)) - k[i++] = val[j].re; + for (l=0, npts=0; l < nroots; l++) { + if (NEAR_ZERO(val[l].im, RT_PCOEF_TOL)) { + k[npts++] = val[l].re; + } } - /* reverse above translation by adding distance to all 'k' values. + /* + * Reverse above translation by adding distance to all 'k' values. */ - for (j = 0; j < i; ++j) - k[j] -= cor_proj; + for (i = 0; i < npts; ++i) { + k[i] += cor_proj; + } - /* Here, 'i' is number of points found */ - switch (i) { - default: - case 0: - return 0; // No hit - case 2: - { - /* Sort most distant to least distant. */ - double u; - if ((u=k[0]) < k[1]) { + /* Here, 'npts' is number of points found */ + if (npts != 0 && npts != 2 && npts != 4) { + return 0; /* No hit */ + } + + /* Sort Most distant to least distant: rt_pt_sort(k, npts) */ + { + double u; + short n, lim; + + /* Inline rt_pt_sort(). Sorts k[] into descending order. */ + for (lim = npts-1; lim > 0; lim--) { + for (n = 0; n < lim; n++) { + if ((u=k[n]) < k[n+1]) { /* bubble larger towards [0] */ - k[0] = k[1]; - k[1] = u; + k[n] = k[n+1]; + k[n+1] = u; } } - break; - case 4: - { - short n, lim; - - /* Inline rt_pt_sort(). Sorts k[] into descending order. */ - for (lim = i-1; lim > 0; lim--) { - for (n = 0; n < lim; n++) { - double u; - if ((u=k[n]) < k[n+1]) { - /* bubble larger towards [0] */ - k[n] = k[n+1]; - k[n+1] = u; - } - } - } - } - break; + } } /* Now, t[0] > t[npts-1] */ /* k[1] is entry point, and k[0] is farthest exit point */ - struct hit hits[2]; + /* k[3] is entry point, and k[2] is exit point */ + for (i=npts-1; i>0; i -= 2) { + struct hit hits[2]; - hits[0].hit_dist = k[1]*tor->tor_r1; - hits[0].hit_surfno = 0; - hits[1].hit_dist = k[0]*tor->tor_r1; - hits[1].hit_surfno = 0; + hits[0].hit_dist = k[i] * tor->tor_r1; + hits[0].hit_surfno = i/2; + /* Set aside vector for rt_tor_norm() later */ + hits[0].hit_vpriv = pprime + k[i] * dprime; - /* Set aside vector for rt_tor_norm() later */ - hits[0].hit_vpriv = pprime + k[1] * dprime; - hits[1].hit_vpriv = pprime + k[0] * dprime; + hits[1].hit_dist = k[i-1] * tor->tor_r1; + hits[1].hit_surfno = i/2; + /* Set aside vector for rt_tor_norm() later */ + hits[1].hit_vpriv = pprime + k[i-1] * dprime; - if (i == 2) { - do_hitp(res, idx, &hits[0]); - do_hitp(res, idx, &hits[1]); - return 2; // HIT + do_hitp(res, idx, &hits[0]); + do_hitp(res, idx, &hits[1]); } - - /* 4 points */ - do_hitp(res, idx, &hits[0]); - do_hitp(res, idx, &hits[1]); - - /* k[3] is entry point, and k[2] is exit point */ - hits[0].hit_surfno = 1; - hits[0].hit_dist = k[3]*tor->tor_r1; - hits[1].hit_surfno = 1; - hits[1].hit_dist = k[2]*tor->tor_r1; - - /* Set aside vector for rt_tor_norm() later */ - hits[0].hit_vpriv = pprime + k[3] * dprime; - hits[1].hit_vpriv = pprime + k[2] * dprime; - - do_hitp(res, idx, &hits[0]); - do_hitp(res, idx, &hits[1]); - return 4; // HIT + return npts; } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |