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.23 by greg, Thu Apr 21 00:40:35 2016 UTC vs.
Revision 2.24 by greg, Thu Aug 4 22:43:46 2022 UTC

# 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 <        for (i = 0; i < 3; i++)
181 <                src->ss[SU][i] = src->ss[SV][i] = src->ss[SW][i] = 0.0;
199 >        memset(src->ss, 0, sizeof(src->ss));
200          for (i = 0; i < 3; i++)
201                  src->ss[i][i] = 0.7236 * so->oargs.farg[3];
202   }

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines