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.21 by greg, Mon Dec 8 23:51:12 2014 UTC vs.
Revision 2.22 by greg, Thu May 21 05:54:54 2015 UTC

# Line 156 | Line 156 | FVECT  v
156  
157  
158   int
159 < getperpendicular(               /* choose random perpedicular direction */
159 > getperpendicular(               /* choose perpedicular direction */
160   FVECT vp,                               /* returns normalized */
161 < const FVECT v                           /* input vector must be 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 (ord[0] = (int)(frandom()*2.99999)) {
174 >                case 0:
175 >                        ord[1] = 1 + (frandom() > .5);
176 >                        ord[2] = 2 - ord[1];
177 >                        break;
178 >                case 1:
179 >                        ord[1] = 2*(frandom() > .5);
180 >                        ord[2] = 2 - ord[1];
181 >                        break;
182 >                case 2:
183 >                        ord[1] = (frandom() > .5);
184 >                        ord[2] = 1 - ord[1];
185 >                        break;
186 >                }
187 >        } else {
188 >                v1[0] = v1[1] = v1[2] = .0;
189 >                ord[0] = 0; ord[1] = 1; ord[2] = 2;
190 >        }
191 >
192          for (i = 3; i--; )
193 <                if ((-0.6 < v[i]) & (v[i] < 0.6))
193 >                if ((-0.6 < v[ord[i]]) & (v[ord[i]] < 0.6))
194                          break;
195          if (i < 0)
196                  return(0);
197 <        v1[i] = 1.0;
197 >
198 >        v1[ord[i]] = 1.0;
199          fcross(vp, v1, v);
200 +
201          return(normalize(vp) > 0.0);
202   }
203  

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines