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

Comparing ray/src/rt/virtuals.c (file contents):
Revision 1.1 by greg, Wed Jun 19 16:36:14 1991 UTC vs.
Revision 1.2 by greg, Thu Jun 20 09:37:38 1991 UTC

# Line 111 | Line 111 | MAT4  pm;
111                  }
112          } else {                                /* local source */
113                  multp3(nsloc, sp->sloc, pm);
114                if (sp->sflags & SPROX) {
115                        d2 = 0.;
116                        for (i = 0; i < 3; i++) {
117                                d1 = ocent[i] - nsloc[i];
118                                d2 += d1*d1;
119                        }
120                        if (d2 > sp->sl.prox*sp->sl.prox)
121                                return(NULL);   /* too far away */
122                }
114                  for (i = 0; i < 3; i++)
115                          ourspot.aim[i] = ocent[i] - nsloc[i];
116                  if ((d1 = normalize(ourspot.aim)) == 0.)
117                          return(NULL);           /* at source!! */
118 +                if (sp->sflags & SPROX && d1 > sp->sl.prox)
119 +                        return(NULL);           /* too far away */
120                  ourspot.siz = 2.*PI*(1. - d1/sqrt(d1*d1+maxrad2));
121                  ourspot.flen = 0.;
122                  if (sp->sflags & SSPOT) {
# Line 164 | Line 157 | register SPOT  *sp1, *sp2;
157   FVECT  org;
158   {
159          FVECT  cent;
160 <        double  rad2, d1r2, d2r2;
160 >        double  rad2, cos1, cos2;
161  
162 <        d1r2 = 1. - sp1->siz/(2.*PI);
163 <        d2r2 = 1. - sp2->siz/(2.*PI);
162 >        cos1 = 1. - sp1->siz/(2.*PI);
163 >        cos2 = 1. - sp2->siz/(2.*PI);
164          if (sp2->siz >= 2.*PI-FTINY)            /* BIG, just check overlap */
165 <                return(DOT(sp1->aim,sp2->aim) >= d1r2*d2r2 -
166 <                                        sqrt((1.-d1r2*d1r2)*(1.-d2r2*d2r2)));
165 >                return(DOT(sp1->aim,sp2->aim) >= cos1*cos2 -
166 >                                        sqrt((1.-cos1*cos1)*(1.-cos2*cos2)));
167                                  /* compute and check disks */
168 <        d1r2 = 1./(d1r2*d1r2) - 1.;
169 <        d2r2 = 1./(d2r2*d2r2) - 1.;
177 <        rad2 = intercircle(cent, sp1->aim, sp2->aim, d1r2, d2r2);
168 >        rad2 = intercircle(cent, sp1->aim, sp2->aim,
169 >                        1./(cos1*cos1) - 1.,  1./(cos2*cos2) - 1.);
170          if (rad2 <= FTINY || normalize(cent) == 0.)
171                  return(0);
172          VCOPY(sp1->aim, cent);
# Line 193 | Line 185 | FVECT  dir;
185                                          /* move centers to common plane */
186          d = DOT(sp1->aim, dir);
187          for (i = 0; i < 3; i++)
188 <                c1[i] = sp2->aim[i] - d*dir[i];
188 >                c1[i] = sp1->aim[i] - d*dir[i];
189          d = DOT(sp2->aim, dir);
190          for (i = 0; i < 3; i++)
191                  c2[i] = sp2->aim[i] - d*dir[i];
# Line 267 | Line 259 | double  r1s, r2s;              /* radii squared */
259                                          /* no overlap? */
260          if (a2 <= 0.)
261                  return(0.);
262 +                                        /* overlap, compute center */
263          l = sqrt((r1s - a2)/d2);
264          for (i = 0; i < 3; i++)
265                  cc[i] = c1[i] + l*disp[i];
# Line 289 | Line 282 | register OBJREC  *op;
282          switch (op->otype) {
283          case OBJ_FACE:
284                  {
285 <                        double  d1, d2;
285 >                        double  d2;
286                          register int  i, j;
287                          register FACE  *f = getface(op);
288  
# Line 301 | Line 294 | register OBJREC  *op;
294                          }
295                          maxrad2 = 0.;
296                          for (j = 0; j < f->nv; j++) {
297 <                                d2 = 0.;
305 <                                for (i = 0; i < 3; i++) {
306 <                                        d1 = VERTEX(f,j)[i] - ocent[i];
307 <                                        d2 += d1*d1;
308 <                                }
297 >                                d2 = dist2(VERTEX(f,j), ocent);
298                                  if (d2 > maxrad2)
299                                          maxrad2 = d2;
300                          }

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines