ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/radiance/ray/src/common/fvect.c
(Generate patch)

Comparing ray/src/common/fvect.c (file contents):
Revision 2.20 by greg, Thu Dec 4 05:26:27 2014 UTC vs.
Revision 2.24 by greg, Thu Jul 23 18:22:26 2015 UTC

# Line 106 | Line 106 | const FVECT v1,
106   const FVECT v2
107   )
108   {
109 +        if ((vres == v1) | (vres == v2)) {
110 +                FVECT   vtmp;
111 +                VCROSS(vtmp, v1, v2);
112 +                VCOPY(vres, vtmp);
113 +                return;
114 +        }
115          VCROSS(vres, v1, v2);
116   }
117  
# Line 150 | Line 156 | FVECT  v
156  
157  
158   int
159 < getperpendicular(               /* choose random perpedicular direction */
160 <        FVECT vp,                       /* returns normalized */
161 <        const FVECT v                   /* input vector must be normalized */
159 > getperpendicular(               /* choose perpedicular direction */
160 > FVECT vp,                               /* returns normalized */
161 > const FVECT v,                          /* input vector must be normalized */
162 > int randomize                           /* randomize orientation */
163   )
164   {
165 +        int     ord[3];
166          FVECT   v1;
167          int     i;
168 <                                        /* randomize other coordinates */
169 <        v1[0] = 0.5 - frandom();
170 <        v1[1] = 0.5 - frandom();
171 <        v1[2] = 0.5 - frandom();
168 >
169 >        if (randomize) {                /* randomize coordinates? */
170 >                v1[0] = 0.5 - frandom();
171 >                v1[1] = 0.5 - frandom();
172 >                v1[2] = 0.5 - frandom();
173 >                switch ((int)(frandom()*6.)) {
174 >                case 0: ord[0] = 0; ord[1] = 1; ord[2] = 2; break;
175 >                case 1: ord[0] = 0; ord[1] = 2; ord[2] = 1; break;
176 >                case 2: ord[0] = 1; ord[1] = 0; ord[2] = 2; break;
177 >                case 3: ord[0] = 1; ord[1] = 2; ord[2] = 0; break;
178 >                case 4: ord[0] = 2; ord[1] = 0; ord[2] = 1; break;
179 >                default: ord[0] = 2; ord[1] = 1; ord[2] = 0; break;
180 >                }
181 >        } else {
182 >                v1[0] = v1[1] = v1[2] = 0.0;
183 >                ord[0] = 0; ord[1] = 1; ord[2] = 2;
184 >        }
185 >
186          for (i = 3; i--; )
187 <                if ((-0.6 < v[i]) & (v[i] < 0.6))
187 >                if ((-0.6 < v[ord[i]]) & (v[ord[i]] < 0.6))
188                          break;
189          if (i < 0)
190                  return(0);
191 <        v1[i] = 1.0;
192 <        VCROSS(vp, v1, v);
191 >
192 >        v1[ord[i]] = 1.0;
193 >        fcross(vp, v1, v);
194 >
195          return(normalize(vp) > 0.0);
196   }
197 +
198  
199   int
200   closestapproach(                        /* closest approach of two rays */

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines