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.21 by greg, Thu Dec 4 05:26:28 2014 UTC vs.
Revision 2.24 by greg, Thu Aug 4 22:43:46 2022 UTC

# Line 76 | Line 76 | setflatss(                             /* set sampling for a flat source */
76          double  mult;
77          int  i;
78  
79 <        getperpendicular(src->ss[SU], src->snorm);
79 >        getperpendicular(src->ss[SU], src->snorm, rand_samp);
80          mult = .5 * sqrt( src->ss2 );
81          for (i = 0; i < 3; i++)
82                  src->ss[SU][i] *= mult;
# Line 98 | 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 121 | 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 155 | Line 175 | ssetsrc(                       /* set a source as a source */
175          src->srad = sqrt(src->ss2/PI);
176          VCOPY(src->snorm, src->sloc);
177          setflatss(src);                 /* hey, whatever works */
158        src->ss[SW][0] = src->ss[SW][1] = src->ss[SW][2] = 0.0;
178   }
179  
180  
# Line 177 | Line 196 | sphsetsrc(                     /* set a sphere as a source */
196          VCOPY(src->sloc, so->oargs.farg);
197          src->srad = so->oargs.farg[3];
198          src->ss2 = PI * src->srad * src->srad;
199 +        memset(src->ss, 0, sizeof(src->ss));
200          for (i = 0; i < 3; i++)
181                src->ss[SU][i] = src->ss[SV][i] = src->ss[SW][i] = 0.0;
182        for (i = 0; i < 3; i++)
201                  src->ss[i][i] = 0.7236 * so->oargs.farg[3];
202   }
203  
# Line 196 | Line 214 | rsetsrc(                       /* set a ring (disk) as a source */
214          src->so = so;
215                                                  /* get the ring */
216          co = getcone(so, 0);
217 +        if (co == NULL)
218 +                objerror(so, USER, "illegal source");
219          if (CO_R1(co) <= FTINY)
220                  objerror(so, USER, "illegal source radius");
221          VCOPY(src->sloc, CO_P0(co));
# Line 222 | Line 242 | cylsetsrc(                     /* set a cylinder as a source */
242          src->so = so;
243                                                  /* get the cylinder */
244          co = getcone(so, 0);
245 +        if (co == NULL)
246 +                objerror(so, USER, "illegal source");
247          if (CO_R0(co) <= FTINY)
248                  objerror(so, USER, "illegal source radius");
249          if (CO_R0(co) > .2*co->al)              /* heuristic constraint */
# Line 234 | Line 256 | cylsetsrc(                     /* set a cylinder as a source */
256                                                  /* set sampling vectors */
257          for (i = 0; i < 3; i++)
258                  src->ss[SU][i] = .5 * co->al * co->ad[i];
259 <        getperpendicular(src->ss[SW], co->ad);
259 >        getperpendicular(src->ss[SW], co->ad, rand_samp);
260          for (i = 0; i < 3; i++)
261                  src->ss[SW][i] *= .8559 * CO_R0(co);
262          fcross(src->ss[SV], src->ss[SW], co->ad);
# Line 336 | Line 358 | rgetmaxdisk(           /* get center and squared radius of ring
358          CONE  *co;
359          
360          co = getcone(op, 0);
361 +        if (co == NULL)
362 +                return(0.);
363          VCOPY(ocent, CO_P0(co));
364          return(CO_R1(co)*CO_R1(co));
365   }
# Line 364 | Line 388 | rgetplaneq(                    /* get plane equation for ring */
388          CONE  *co;
389  
390          co = getcone(op, 0);
391 +        if (co == NULL) {
392 +                memset(nvec, 0, sizeof(FVECT));
393 +                return(0.);
394 +        }
395          VCOPY(nvec, co->ad);
396          return(DOT(nvec, CO_P0(co)));
397   }

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines