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

Comparing ray/src/rt/srcsupp.c (file contents):
Revision 2.20 by greg, Sun Jun 22 18:05:28 2014 UTC vs.
Revision 2.25 by greg, Wed Aug 7 18:33:33 2024 UTC

# Line 76 | Line 76 | setflatss(                             /* set sampling for a flat source */
76          double  mult;
77          int  i;
78  
79 <        src->ss[SV][0] = src->ss[SV][1] = src->ss[SV][2] = 0.0;
79 >        getperpendicular(src->ss[SU], src->snorm, rand_samp);
80 >        mult = .5 * sqrt( src->ss2 );
81          for (i = 0; i < 3; i++)
81                if (src->snorm[i] < 0.6 && src->snorm[i] > -0.6)
82                        break;
83        src->ss[SV][i] = 1.0;
84        fcross(src->ss[SU], src->ss[SV], src->snorm);
85        mult = .5 * sqrt( src->ss2 / DOT(src->ss[SU],src->ss[SU]) );
86        for (i = 0; i < 3; i++)
82                  src->ss[SU][i] *= mult;
83          fcross(src->ss[SV], src->snorm, src->ss[SU]);
84   }
# Line 103 | Line 98 | fsetsrc(                       /* set a face as a source */
98          src->so = so;
99                                                  /* get the face */
100          f = getface(so);
101 <        if (f->area == 0.0)
101 >        if (f->area == 0.)
102                  objerror(so, USER, "zero source area");
103                                                  /* find the center */
104          for (j = 0; j < 3; j++) {
# Line 126 | Line 121 | fsetsrc(                       /* set a face as a source */
121          }
122          src->srad = sqrt(src->srad);
123                                                  /* compute size vectors */
124 <        if (f->nv == 4)                         /* parallelogram case */
124 >        if (f->nv == 4) {                               /* parallelogram case */
125                  for (j = 0; j < 3; j++) {
126                          src->ss[SU][j] = .5*(VERTEX(f,1)[j]-VERTEX(f,0)[j]);
127                          src->ss[SV][j] = .5*(VERTEX(f,3)[j]-VERTEX(f,0)[j]);
128                  }
129 <        else
130 <                setflatss(src);
129 >        } else if (f->nv == 3) {                        /* triangle case */
130 >                int     near0 = 2;
131 >                double  dmin = dist2line(src->sloc, VERTEX(f,2), VERTEX(f,0));
132 >                for (i = 0; i < 2; i++) {
133 >                        double  d2 = dist2line(src->sloc, VERTEX(f,i), VERTEX(f,i+1));
134 >                        if (d2 >= dmin)
135 >                                continue;
136 >                        near0 = i;
137 >                        dmin = d2;                      /* radius = min distance */
138 >                }
139 >                if (dmin < .08*f->area)
140 >                        objerror(so, WARNING, "triangular source with poor aspect");
141 >                i = (near0 + 1) % 3;
142 >                for (j = 0; j < 3; j++)
143 >                        src->ss[SU][j] = VERTEX(f,i)[j] - VERTEX(f,near0)[j];
144 >                normalize(src->ss[SU]);
145 >                dmin = sqrt(dmin);
146 >                for (j = 0; j < 3; j++)
147 >                        src->ss[SU][j] *= dmin;
148 >                fcross(src->ss[SV], f->norm, src->ss[SU]);
149 >        } else
150 >                setflatss(src);                         /* hope for convex! */
151   }
152  
153  
# Line 182 | Line 197 | sphsetsrc(                     /* set a sphere as a source */
197          VCOPY(src->sloc, so->oargs.farg);
198          src->srad = so->oargs.farg[3];
199          src->ss2 = PI * src->srad * src->srad;
200 +        memset(src->ss, 0, sizeof(src->ss));
201          for (i = 0; i < 3; i++)
186                src->ss[SU][i] = src->ss[SV][i] = src->ss[SW][i] = 0.0;
187        for (i = 0; i < 3; i++)
202                  src->ss[i][i] = 0.7236 * so->oargs.farg[3];
203   }
204  
# Line 201 | Line 215 | rsetsrc(                       /* set a ring (disk) as a source */
215          src->so = so;
216                                                  /* get the ring */
217          co = getcone(so, 0);
218 +        if (co == NULL)
219 +                objerror(so, USER, "illegal source");
220          if (CO_R1(co) <= FTINY)
221                  objerror(so, USER, "illegal source radius");
222          VCOPY(src->sloc, CO_P0(co));
# Line 227 | Line 243 | cylsetsrc(                     /* set a cylinder as a source */
243          src->so = so;
244                                                  /* get the cylinder */
245          co = getcone(so, 0);
246 +        if (co == NULL)
247 +                objerror(so, USER, "illegal source");
248          if (CO_R0(co) <= FTINY)
249                  objerror(so, USER, "illegal source radius");
250          if (CO_R0(co) > .2*co->al)              /* heuristic constraint */
# Line 239 | Line 257 | cylsetsrc(                     /* set a cylinder as a source */
257                                                  /* set sampling vectors */
258          for (i = 0; i < 3; i++)
259                  src->ss[SU][i] = .5 * co->al * co->ad[i];
260 <        src->ss[SV][0] = src->ss[SV][1] = src->ss[SV][2] = 0.0;
260 >        getperpendicular(src->ss[SW], co->ad, rand_samp);
261          for (i = 0; i < 3; i++)
244                if (co->ad[i] < 0.6 && co->ad[i] > -0.6)
245                        break;
246        src->ss[SV][i] = 1.0;
247        fcross(src->ss[SW], src->ss[SV], co->ad);
248        normalize(src->ss[SW]);
249        for (i = 0; i < 3; i++)
262                  src->ss[SW][i] *= .8559 * CO_R0(co);
263          fcross(src->ss[SV], src->ss[SW], co->ad);
264   }
# Line 347 | Line 359 | rgetmaxdisk(           /* get center and squared radius of ring
359          CONE  *co;
360          
361          co = getcone(op, 0);
362 +        if (co == NULL)
363 +                return(0.);
364          VCOPY(ocent, CO_P0(co));
365          return(CO_R1(co)*CO_R1(co));
366   }
# Line 375 | Line 389 | rgetplaneq(                    /* get plane equation for ring */
389          CONE  *co;
390  
391          co = getcone(op, 0);
392 +        if (co == NULL) {
393 +                memset(nvec, 0, sizeof(FVECT));
394 +                return(0.);
395 +        }
396          VCOPY(nvec, co->ad);
397          return(DOT(nvec, CO_P0(co)));
398   }

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines