Revision: 57068
          http://sourceforge.net/p/brlcad/code/57068
Author:   iiizzzaaakkk
Date:     2013-08-22 16:42:11 +0000 (Thu, 22 Aug 2013)
Log Message:
-----------
Adding rt_hrt_shot to intersect a ray with the heart

Modified Paths:
--------------
    brlcad/trunk/src/librt/primitives/hrt/hrt.c

Modified: brlcad/trunk/src/librt/primitives/hrt/hrt.c
===================================================================
--- brlcad/trunk/src/librt/primitives/hrt/hrt.c 2013-08-22 15:59:26 UTC (rev 
57067)
+++ brlcad/trunk/src/librt/primitives/hrt/hrt.c 2013-08-22 16:42:11 UTC (rev 
57068)
@@ -395,9 +395,268 @@
  * >0 HIT
  */
 int
-rt_hrt_shot()
+rt_hrt_shot(struct soltab *stp, register struct xray *rp, struct application 
*ap, struct seg *seghead)
 {
-    bu_log("rt_hrt_shot: Not implemented yet!\n");
+    register struct hrt_specific *hrt =
+        (struct hrt_specific *)stp->st_specific;
+    register struct seg *segp;
+    vect_t dprime;              /* D' : The new shot direction */
+    vect_t pprime;              /* P' : The new shot point */
+    vect_t trans;               /* Tanslated shot vector */
+    vect_t norm_pprime;         /* P' with normalized distance from heart */
+    bn_poly_t S;                /* The sextic equation (of power 6) */
+    bn_complex_t complex[6];    /* The complex roots */
+    double real[6];             /* The real roots */
+    int i;
+    int j;
+   
+    /* Translate the ray point */
+    (trans)[X] = (rp->r_pt)[X] - (hrt->hrt_V)[X];
+    (trans)[Y] = (rp->r_pt)[Y] - (hrt->hrt_V)[Y];
+    (trans)[Z] = (rp->r_pt)[Z] - (hrt->hrt_V)[Z];
+ 
+    /* Scale and Rotate point to get P' */
+    pprime[X] = (hrt->hrt_SoR[0]*trans[X] + hrt->hrt_SoR[1]*trans[Y] + 
hrt->hrt_SoR[2]*trans[Z]) * 1.0/(hrt->hrt_SoR[15]);
+    pprime[Y] = (hrt->hrt_SoR[4]*trans[X] + hrt->hrt_SoR[5]*trans[Y] + 
hrt->hrt_SoR[6]*trans[Z]) * 1.0/(hrt->hrt_SoR[15]);
+    pprime[Z] = (hrt->hrt_SoR[8]*trans[X] + hrt->hrt_SoR[9]*trans[Y] + 
hrt->hrt_SoR[10]*trans[Z]) * 1.0/(hrt->hrt_SoR[15]);
+ 
+    /* Translate ray direction vector */
+    MAT4X3VEC(dprime, hrt->hrt_SoR, rp->r_dir);
+    VUNITIZE(dprime);
+ 
+    /* Normalize distance from the heart. Substitutes a corrected ray
+     * point, which contains a translation along the ray direction to
+     * the closest approach to vertex of the heart.Translating the ray
+     * along the direction of the ray to the closest point near the
+     * heart's center vertex. Thus, the New ray origin is normalized.
+     */
+    VSCALE(norm_pprime, dprime, VDOT(pprime, dprime));
+    VSUB2(norm_pprime, pprime, norm_pprime);
+ 
+    /**
+     * Generate the sextic equation S(t) = 0 to be passed through the root 
finder.
+     */
+ 
+    S.dgr = 6;
+    S.cf[0] = 4320.0 * dprime[X] * dprime[X] * dprime[Y] * dprime[Y] * 
dprime[Z] * dprime[Z] + 960.0 * dprime[X] * dprime[X] * dprime[Z] * dprime[Z]
+            * (dprime[X] * dprime[X] + dprime[Z] * dprime[Z]) + 320.0 * 
(dprime[X] * dprime[X] * dprime[X] * dprime[X] * dprime[X] * dprime[X]
+            + dprime[Z] * dprime[Z] * dprime[Z] * dprime[Z] * dprime[Z] * 
dprime[Z]) + 2160.0 * dprime[Y] * dprime[Y] * (dprime[X] * dprime[X]
+            * dprime[X] * dprime[X] + dprime[Z] * dprime[Z] * dprime[Z] * 
dprime[Z]) + 4860.0 * dprime[Y] * dprime[Y] * dprime[Y] * dprime[Y]
+            * ( dprime[X] * dprime[X] + dprime[Z] * dprime[Z] ) - 36.0 * 
dprime[Y] * dprime[Y] * dprime[Y] * dprime[Z] * dprime[Z] * dprime[Z]
+            + 3645.0 * dprime[Y] * dprime[Y] * dprime[Y] * dprime[Y] * 
dprime[Y] * dprime[Y];
+ 
+    S.cf[1] = 8640.0 * (dprime[X] * pprime[X] * dprime[Y] * dprime[Y] * 
(dprime[X] * dprime[X] + dprime[Z] * dprime[Z]) + dprime[Y] * pprime[Y] * 
dprime[X]
+            * dprime[X] * dprime[Z] * dprime[Z] + dprime[Z] * pprime[Z] * 
dprime[Y] * dprime[Y] * (dprime[X] * dprime[X] + dprime[Z] * dprime[Z]))
+            + 9720.0 * dprime[Y] * dprime[Y] * dprime[Y] * dprime[Y] * 
(dprime[X] * pprime[X] + dprime[Z] * pprime[Z]) + 1920.0 * (dprime[X] * 
dprime[X]
+            * dprime[X] * dprime[X] + dprime[Z] * dprime[Z] * dprime[Z] * 
dprime[Z] * (dprime[X] * pprime[X] + dprime[Z] * pprime[Z])) + 4320.0 * 
(dprime[X]
+            * dprime[X] * dprime[X] * dprime[X] + dprime[Z] * dprime[Z] * 
dprime[Z] * dprime[Z] * (dprime[Y] * pprime[Y])) + 3840.0 * (dprime[X]
+            * dprime[X] + dprime[Z] * dprime[Z]) * (dprime[X] * pprime[X] + 
dprime[Z] * pprime[Z]) + 19440.0 * (dprime[Z] * dprime[Z] * dprime[Y] * 
dprime[Y]
+            + dprime[X] * dprime[Y] * dprime[Y]) * dprime[Y] * pprime[Y] - 
108.0 * dprime[Y] * dprime[Z] * (dprime[Z] * dprime[Z] * dprime[Y] * pprime[Y] 
+ pprime[Z]
+            * dprime[Z] * dprime[Y] * dprime[Y]) - 320.0 * dprime[X] * 
dprime[X] * dprime[Y] * dprime[Y] * dprime[Y] + 21870.0 * pprime[Y] * dprime[Y]
+            * dprime[Y] * dprime[Y] * dprime[Y] * dprime[Y];
+ 
+    S.cf[2] = 4320.0 * (dprime[X] * dprime[X] * (dprime[Y] * dprime[Y] * 
pprime[Z] * pprime[Z] + dprime[Z] * dprime[Z] * pprime[Y] * pprime[Y]) + 
dprime[Y] * dprime[Y]
+            * (pprime[X] * pprime[X] * dprime[Z] * dprime[Z] - dprime[X] * 
dprime[X] - dprime[Z] * dprime[Z])) - 960.0 * (dprime[X] * dprime[X] * dprime[X]
+            * dprime[X] * (1.0 - pprime[Z] * pprime[Z]) + dprime[Z] * 
dprime[Z] * dprime[Z] * dprime[Z] + dprime[Y] * dprime[Y] * (dprime[X] * 
dprime[X] * pprime[Y]
+            - dprime[Y] * dprime[Y] * pprime[X] * pprime[X])) + 4860.0 * 
(dprime[Y] * dprime[Y] * dprime[Y] * dprime[Y] * (pprime[X] * pprime[X] + 
pprime[Z] * pprime[Z] - 1.0))
+            + 4800.0 * (dprime[X] * dprime[X] * dprime[X] * dprime[X] * 
pprime[X] * pprime[X] + dprime[Z] * dprime[Z] * dprime[Z] * dprime[Z] * 
pprime[Z] * pprime[Z])
+            + 2160.0 * pprime[Y] * pprime[Y] * (dprime[X] * dprime[X] * 
dprime[X] * dprime[X] + dprime[Z] * dprime[Z] * dprime[Z] * dprime[Z]) + 5760.0 
* dprime[X] * dprime[X]
+            * dprime[Z] * dprime[Z] * (pprime[X] * pprime[X] + pprime[Z] * 
pprime[Z]) + 7680.0 * dprime[X] * pprime[X] * dprime[Z] * pprime[Z] * 
(dprime[X] * dprime[X]
+            + dprime[Z] * dprime[Z]) + 17280.0 * ((dprime[X] * pprime[X] * 
dprime[Y] * pprime[Y] + dprime[Y] * pprime[Y] * dprime[Z] * pprime[Z]) * 
(dprime[X] * dprime[X]
+            + dprime[Z] * dprime[Z]) + dprime[X] * pprime[X] * dprime[Z] * 
pprime[Z] * dprime[Y] * dprime[Y]) + 12960.0 * dprime[Y] * dprime[Y] * 
(dprime[X] * dprime[X]
+            * pprime[X] * pprime[X] + dprime[Z] * dprime[Z] * pprime[Z] * 
pprime[Z]) + 29160.0 * dprime[Y] * dprime[Y] * pprime[Y] * pprime[Y] * 
(dprime[X] * dprime[X]
+            + dprime[Z] * dprime[Z]) - 108.0 * dprime[Y] * dprime[Z]  * 
(dprime[Y] * dprime[Y] * pprime[Z] * pprime[Z] + dprime[Z] * dprime[Z] * 
pprime[Y] * pprime[Y])
+            - 1920.0 * dprime[X] * dprime[X] * dprime[Z] * dprime[Z] - 54675.0 
* pprime[Y] * pprime[Y] * dprime[Y] * dprime[Y] * dprime[Y] * dprime[Y]- 324.0 
* pprime[Z]
+            * dprime[Z] * dprime[Z] * dprime[Y] * dprime[Y] * pprime[Y] - 
640.0 * dprime[X] * pprime[X] * dprime[Y] * dprime[Y] * dprime[Y];
+   
+    S.cf[3] = 3840.0 * (dprime[X] * pprime[X] + dprime[Z] * pprime[Z]) *  
(dprime[X] * dprime[X] * pprime[Z] * pprime[Z] + dprime[Z] * dprime[Z] * 
pprime[X] * pprime[X]
+            - dprime[X] * dprime[X] + dprime[Z] * dprime[Z]) + 8640.0 * 
(dprime[X] * pprime[X] * (pprime[Z] * pprime[Z] * dprime[Y] * dprime[Y] + 
dprime[Z] * dprime[Z]
+            * pprime[Y] * pprime[Y] + dprime[Y] * dprime[Y] * pprime[X] * 
pprime[X] + dprime[X] * dprime[X] * pprime[Y] * pprime[Y] - dprime[Y] * 
dprime[Y]) + dprime[Y]
+            * pprime[Y] * (dprime[X] * dprime[X] * pprime[Z] * pprime[Z] + 
dprime[Z] * dprime[Z] * pprime[X] * pprime[X] - dprime[X] * dprime[X] - 
dprime[Z] * dprime[Z])
+            + dprime[Z] * pprime[Z] * (dprime[X] * dprime[X] * pprime[Y] * 
pprime[Y] + dprime[Y] * dprime[Y] * pprime[X] * pprime[X] + dprime[Y] * 
pprime[Z] * pprime[Z]
+            + dprime[Z] * dprime[Z] * pprime[Y] * pprime[Y] - dprime[Y] * 
dprime[Y])) + 6400.0 * (dprime[X] * dprime[X] * dprime[X] * pprime[X] * 
pprime[X] * pprime[X]
+            + dprime[Z] * dprime[Z] * dprime[Z] * pprime[Z] * pprime[Z] * 
pprime[Z]) + 19440.0 * dprime[Y] * pprime[Y] * (dprime[Y] * dprime[Y] * 
(pprime[X] * pprime[X]
+            + pprime[Z] * pprime[Z] - 1.0) + pprime[Y] * pprime[Y] * 
(dprime[X] * dprime[X] + dprime[Z] * dprime[Z])) - 36.0 * (dprime[Y] * 
dprime[Y] * dprime[Y]
+            * pprime[Z] * pprime[Z] * pprime[Z] + dprime[Z]* dprime[Z] * 
dprime[Z] * pprime[Y] * pprime[Y] * pprime[Y]) + 11520.0 * (dprime[X] * 
pprime[X] * dprime[Z]
+            * pprime[Z] * (dprime[X] * pprime[X] + dprime[Z] * pprime[Z]))- 
324.0 * dprime[Y] * pprime[Y] * dprime[Z] * pprime[Z] * (dprime[Y] * pprime[Z] 
+ dprime[Z]
+            + pprime[Y]) + 25920.0 * dprime[Y] * pprime[Y] * (pprime[Z] * 
pprime[Z] * dprime[Z] * dprime[Z] + pprime[X] * pprime[X] * dprime[X] * 
dprime[X]) - 320.0
+            * pprime[X] * pprime[X] * dprime[Y] * dprime[Y] * dprime[Y] + 
72900.0 * pprime[Y] * pprime[Y] * pprime[Y] * dprime[Y] * dprime[Y] * dprime[Y] 
+ 34560.0
+            * dprime[X] * pprime[X] * dprime[Y] * pprime[Y] * dprime[Z] * 
pprime[Z] + 58320.0 * dprime[X] * pprime[X] * dprime[Y] * dprime[Y] * pprime[Y] 
* pprime[Y]
+            - 1920.0 * dprime[X] * pprime[X] * dprime[Y] * dprime[Y] * 
pprime[Y] + 58320.0 * dprime[Z] * pprime[Z] * dprime[Y] * dprime[Y] * pprime[Y] 
* pprime[Y]
+            - 960.0 * dprime[X] * dprime[X] * dprime[Y] * pprime[Y] * 
pprime[Y];
+ 
+    S.cf[4] = 960.0 * (dprime[X] * dprime[X] * (1.0 + pprime[Z] * pprime[Z] * 
pprime[Z] * pprime[Z]) + dprime[Z] * dprime[Z] * (1.0 + pprime[X] * pprime[X] * 
pprime[X]
+            * pprime[X]) - dprime[Y] * dprime[Y] * pprime[X] * pprime[X] * 
pprime[Y]) + 2160.0 * dprime[Y] * dprime[Y] * (1.0 + pprime[X] * pprime[X] * 
pprime[X] * pprime[X]
+            + pprime[Z] * pprime[Z] * pprime[Z] * pprime[Z]) + 4320.0 * 
(pprime[Y] * pprime[Y] * (dprime[X] * dprime[X] + dprime[Z] * dprime[Z] + 
dprime[X] * dprime[X]
+            * pprime[Z] * pprime[Z] + dprime[Z] * dprime[Z] * pprime[X] * 
pprime[X]) + dprime[Y] * dprime[Y] * (pprime[X] * pprime[X] * pprime[Z] * 
pprime[Z] - pprime[X]
+            * pprime[X] - pprime[Z] * pprime[Z])) + 4800.0 * (pprime[X] * 
pprime[X] * pprime[X] * pprime[X] * dprime[X] * dprime[X] + pprime[Z] * 
pprime[Z] * pprime[Z]
+            * pprime[Z] * dprime[Z] * dprime[Z]) + 4860.0 * pprime[Y] * 
pprime[Y] * pprime[Y] * pprime[Y] * (dprime[X] * dprime[X] + dprime[Z] * 
dprime[Z]) + 5760.0
+            * (pprime[Z] * pprime[Z] * dprime[Z] * dprime[Z] * (1.0 + 
pprime[X] * pprime[X]) + pprime[X] * pprime[X] * dprime[X] * dprime[X] * 
(pprime[Z] * pprime[Z] - 1.0))
+            +  7680.0 * dprime[X] * pprime[X] * dprime[Z] * pprime[Z] * 
(pprime[X] * pprime[X] + pprime[Z] * pprime[Z] - 1.0 - 1920.0 * (dprime[X] * 
dprime[X] * pprime[Z]
+            * pprime[Z] + dprime[Z] * dprime[Z]* pprime[X] * pprime[X] + 
dprime[X] * pprime[X] * pprime[Y] * pprime[Y] * dprime[Y]) + 17280.0 * 
(dprime[Y] * pprime[Y]
+            * (dprime[X] * pprime[X] * pprime[X] * pprime[X] - dprime[X] * 
pprime[X] + dprime[Z] * pprime[Z] * pprime[Z] * pprime[Z] - dprime[Z] * 
pprime[Z] + dprime[X]
+            * pprime[X] * pprime[Z] * pprime[Z]) + dprime[X] * pprime[X] * 
dprime[Z] * pprime[Z] * pprime[Y] * pprime[Y]) + 38880.0 * dprime[Y] * 
pprime[Y] * pprime[Y]
+            * pprime[Y] * (dprime[X] * pprime[X] + dprime[Z] * pprime[Z]) + 
12960.0 * pprime[Y] * pprime[Y] * (dprime[X] * dprime[X] * pprime[X] * 
pprime[X] - dprime[Z]
+            * dprime[Z] * pprime[Z] * pprime[Z]) + 29160.0 * dprime[Y] * 
dprime[Y] * pprime[Y] * pprime[Y] * (pprime[X] * pprime[X] + pprime[Z] * 
pprime[Z] - 1.0)
+            - 180.0 * pprime[Y] * pprime[Z] * dprime[Z] * dprime[Z] * 
pprime[Y] * pprime[Y] + dprime[Y] * dprime[Y] * pprime[Z] * pprime[Z]) - 320.0 
* dprime[X]
+            * dprime[X] * pprime[Y] * pprime[Y] * pprime[Y] + 54675.0 * 
pprime[Y] * pprime[Y] * pprime[Y] * pprime[Y] * dprime[Y] * dprime[Y] ;
+ 
+    S.cf[5] = 1920.0 * ((dprime[X] * pprime[X] +  dprime[Z] * pprime[Z]) * 
(1.0 + pprime[X] * pprime[X] * pprime[X] * pprime[X] + pprime[Z] * pprime[Z]
+            * pprime[Z] * pprime[Z])) + 4320.0 * dprime[Y] * pprime[Y] * (1.0 
+ pprime[X] * pprime[X] * pprime[X] * pprime[X] + pprime[Z] * pprime[Z]
+            * pprime[Z] * pprime[Z]) + 8640.0 * (-dprime[Y] * pprime[Y] * 
pprime[Z] * pprime[Z] + dprime[X] * pprime[X] * pprime[Z] * pprime[Z]
+            * pprime[Y] * pprime[Y] + dprime[Z] * pprime[Z] * pprime[X] * 
pprime[X] * pprime[Y] * pprime[Y] + dprime[Y] * pprime[Y] * pprime[X]
+            * pprime[X] * pprime[Z] * pprime[Z] - dprime[X] * pprime[X] * 
pprime[Y] * pprime[Y] + dprime[X] * pprime[Y] * pprime[Y] + dprime[X] * 
pprime[X]
+            * pprime[X] * pprime[X] * pprime[Y] * pprime[Y] - dprime[Z] * 
pprime[Z] * pprime[Y] * pprime[Y] + dprime[Z] * pprime[Z] * pprime[Z] * 
pprime[Z]
+            * pprime[Y] * pprime[Y] - dprime[Y] * pprime[Y] * pprime[X] * 
pprime[X]) - 3840.0 * (dprime[Z] * pprime[Z] * pprime[Z] * pprime[Z] + dprime[X]
+            * pprime[X] * pprime[X] * pprime[X] + dprime[X] * pprime[X] * 
pprime[Z] * pprime[Z] - dprime[X] * pprime[X] * pprime[X] * pprime[X] * 
pprime[Z]
+            * pprime[Z] + dprime[Z] * pprime[Z] * pprime[X] * pprime[X] - 
dprime[Z] * pprime[Z] * pprime[Z] * pprime[Z] * pprime[X] * pprime[X])
+            - 19440.0 * (dprime[Y] * pprime[Y] * pprime[Y] * pprime[Y] * (1.0 
- pprime[X] * pprime[X] - pprime[Z] * pprime[Z])) + 9720.0 * (pprime[Y]
+            * pprime[Y] * pprime[Y] * pprime[Y] * (dprime[X] * pprime[X] + 
dprime[Z] * pprime[Z])) + 21870.0 * (dprime[Y] * pprime[Y] * pprime[Y]
+            * pprime[Y] * pprime[Y] * pprime[Y])- 640.0 * (dprime[X] * 
pprime[X] * pprime[Y] * pprime[Y] * pprime[Y] - dprime[Y] * pprime[Y] * 
pprime[Y]
+            * pprime[X] * pprime[X]) - 108.0 * (dprime[Z] * pprime[Z] * 
pprime[Z] * pprime[Y] * pprime[Y] * pprime[Y] + dprime[Y] * pprime[Y] * 
pprime[Y]
+            * pprime[Z] * pprime[Z] * pprime[Z]);
+ 
+    S.cf[6] = 320.0 * (-1.0 * pprime[X] * pprime[X] * pprime[X] * pprime[X] * 
pprime[X] * pprime[X] + pprime[Z] * pprime[Z] * pprime[Z] * pprime[Z]
+            * pprime[Z] * pprime[Z] - pprime[X] * pprime[X] * pprime[Y] * 
pprime[Y] * pprime[Y]) + 960.0 * (pprime[X] * pprime[X] + pprime[Z] * pprime[Z]
+            + pprime[Z] * pprime[Z] * pprime[X] * pprime[X] * pprime[X] * 
pprime[X] + pprime[X] * pprime[X] * pprime[Z] * pprime[Z] * pprime[Z] * 
pprime[Z]
+            - pprime[X] * pprime[X] * pprime[X] * pprime[X] - pprime[Z] * 
pprime[Z] * pprime[Z] * pprime[Z])  + 4320.0 * (pprime[X] * pprime[X] * 
pprime[Y]
+            * pprime[Y] * pprime[Z] * pprime[Z] - pprime[X] * pprime[X] * 
pprime[Y] * pprime[Y] -pprime[Z] * pprime[Z] * pprime[Y] * pprime[Y])
+            - 1920.0 * pprime[X] * pprime[X] * pprime[Z] * pprime[Z] - 36.0 * 
pprime[Z] * pprime[Z] * pprime[Z] * pprime[Y] * pprime[Y] * pprime[Y]
+            + 2160.0 * (pprime[Y] * pprime[Y] * (1.0 + pprime[X] * pprime[X] * 
pprime[X] * pprime[X] + pprime[Z] * pprime[Z] * pprime[Z] * pprime[Z]))
+            + 4860.0 * (pprime[Y] * pprime[Y] * pprime[Y] * pprime[Y] * 
(pprime[X] * pprime[X] + pprime[Z] * pprime[Z] + 1.0)) + 3645.0 * pprime[Y]
+            * pprime[Y] * pprime[Y] * pprime[Y] * pprime[Y] * pprime[Y] ;
+ 
+    /* It is known that the equation is sextic (of order 6). Therefore, if the
+     * root finder returns other than 6 roots, return an error.
+     */
+    if ((i = rt_poly_roots(&S, complex, stp->st_dp->d_namep)) != 6) {
+        if (i > 0) {
+            bu_log("hrt:  rt_poly_roots() 6!=%d\n", i);
+            bn_pr_roots(stp->st_name, complex, i);
+        } else if (i < 0) {
+            static int reported=0;
+            bu_log("The root solver failed to converge on a solution for 
%s\n", stp->st_dp->d_namep);
+            if (!reported) {
+                VPRINT("while shooting from:\t", rp->r_pt);
+                VPRINT("while shooting at:\t", rp->r_dir);
+                bu_log("Additional heart convergence failure details will be 
suppressed.\n");
+                reported=1;
+            }
+        }
+        return 0;               /* MISS */
+    }
+   
+    /* 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
+     */
+    for (j=0, i=0; j < 6; j++) {
+        if (NEAR_ZERO(complex[j].im, ap->a_rt_i->rti_tol.dist))
+            real[i++] = complex[j].re;
+    }
+ 
+    /* Here, 'i' is number of points found */
+    switch (i) {
+        case 0:
+            return 0;           /* No hit */
+ 
+        default:
+            bu_log("rt_hrt_shot: reduced 6 to %d roots\n", i);
+            bn_pr_roots(stp->st_name, complex, 6);
+            return 0;           /* No hit */
+ 
+        case 2:
+            {
+                /* Sort most distant to least distant. */
+                fastf_t u;
+                if ((u=real[0]) < real[1]) {
+                    /* bubble larger towards [0] */
+                    real[0] = real[1];
+                    real[1] = u;
+                }
+            }
+            break;
+        case 4:
+            {
+                short n;
+                short lim;
+ 
+                /* Inline rt_pt_sort().  Sorts real[] into descending order. */
+                for (lim = i-1; lim > 0; lim--) {
+                    for (n = 0; n < lim; n++) {
+                        fastf_t u;
+                        if ((u=real[n]) < real[n+1]) {
+                            /* bubble larger towards [0] */
+                            real[n] = real[n+1];
+                            real[n+1] = u;
+                        }
+                    }
+                }
+            }
+            break;
+        case 6:
+            {
+                short num;
+                short limit;
+ 
+                /* Inline rt_pt_sort().  Sorts real[] into descending order. */
+                for (limit = i-1; limit > 0; limit--) {
+                    for (num = 0; num < limit; num++) {
+                        fastf_t u;
+                        if ((u=real[num]) < real[num+1]) {
+                            /* bubble larger towards [0] */
+                            real[num] = real[num+1];
+                            real[num+1] = u;
+                        }
+                    }
+                }
+            }
+            break;
+    }
+ 
+    /* Now, t[0] > t[npts-1] */
+    /* real[1] is entry point, and real[0] is farthest exit point */
+    RT_GET_SEG(segp, ap->a_resource);
+    segp->seg_stp = stp;
+    segp->seg_in.hit_dist = real[1];
+    segp->seg_out.hit_dist = real[0];
+    segp->seg_in.hit_surfno = segp->seg_out.hit_surfno = 0;
+    /* Set aside vector for rt_hrt_norm() later */
+    VJOIN1(segp->seg_in.hit_vpriv, pprime, real[1], dprime);
+    VJOIN1(segp->seg_out.hit_vpriv, pprime, real[0], dprime);
+    BU_LIST_INSERT(&(seghead->l), &(segp->l));
+   
+    if (i == 2)
+        return 2;                       /* HIT */
+   
+    /* 4 points */
+    /* real[3] is entry point, and real[2] is exit point */
+    RT_GET_SEG(segp, ap->a_resource);
+    segp->seg_stp = stp;
+    segp->seg_in.hit_dist = real[3];
+    segp->seg_out.hit_dist = real[2];
+    segp->seg_in.hit_surfno = segp->seg_out.hit_surfno = 0;
+    /* Set aside vector for rt_hrt_norm() later */
+    VJOIN1(segp->seg_in.hit_vpriv, pprime, real[3], dprime);
+    VJOIN1(segp->seg_out.hit_vpriv, pprime, real[2], dprime);
+    BU_LIST_INSERT(&(seghead->l), &(segp->l));
+ 
+    if (i == 4)
+        return 4;                       /* HIT */
+ 
+    /* 6 points */
+    /* real[5] is entry point, and real[4] is exit point */
+    RT_GET_SEG(segp, ap->a_resource);
+    segp->seg_stp = stp;
+    segp->seg_in.hit_dist = real[5];
+    segp->seg_out.hit_dist = real[4];
+    segp->seg_in.hit_surfno = segp->seg_out.hit_surfno = 0;
+    /* Set aside vector for rt_hrt_norm() later */
+    VJOIN1(segp->seg_in.hit_vpriv, pprime, real[5], dprime);
+    VJOIN1(segp->seg_out.hit_vpriv, pprime, real[4], dprime);
+    BU_LIST_INSERT(&(seghead->l), &(segp->l));
     return 6;
 }
 

This was sent by the SourceForge.net collaborative development platform, the 
world's largest Open Source development site.


------------------------------------------------------------------------------
Introducing Performance Central, a new site from SourceForge and 
AppDynamics. Performance Central is your source for news, insights, 
analysis and resources for efficient Application Performance Management. 
Visit us today!
http://pubads.g.doubleclick.net/gampad/clk?id=48897511&iu=/4140/ostg.clktrk
_______________________________________________
BRL-CAD Source Commits mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/brlcad-commits

Reply via email to