| 57 |
|
d = urand(ilhash(dimlist,ndims+2)+samplendx); |
| 58 |
|
if (source[si->sn].sflags & SFLAT) { |
| 59 |
|
multisamp(vpos, 2, d); |
| 60 |
< |
vpos[2] = 0.5; |
| 60 |
> |
vpos[SW] = 0.5; |
| 61 |
|
} else |
| 62 |
|
multisamp(vpos, 3, d); |
| 63 |
|
for (i = 0; i < 3; i++) |
| 68 |
|
|
| 69 |
|
for (i = 0; i < 3; i++) |
| 70 |
|
vpos[i] += (double)cent[i]/MAXSPART; |
| 71 |
+ |
/* avoid circular aiming failures */ |
| 72 |
+ |
if (source[si->sn].sflags & SCIR) { |
| 73 |
+ |
FVECT trim; |
| 74 |
+ |
double d; |
| 75 |
+ |
if (source[si->sn].sflags & (SFLAT|SDISTANT)) { |
| 76 |
+ |
d = 1.12837917; /* correct setflatss() */ |
| 77 |
+ |
trim[SU] = d*sqrt(1.0 - 0.5*vpos[SV]*vpos[SV]); |
| 78 |
+ |
trim[SV] = d*sqrt(1.0 - 0.5*vpos[SU]*vpos[SU]); |
| 79 |
+ |
trim[SW] = 0.0; |
| 80 |
+ |
} else { |
| 81 |
+ |
trim[SW] = trim[SU] = vpos[SU]*vpos[SU]; |
| 82 |
+ |
d = vpos[SV]*vpos[SV]; |
| 83 |
+ |
if (d > trim[SW]) trim[SW] = d; |
| 84 |
+ |
trim[SU] += d; |
| 85 |
+ |
d = vpos[SW]*vpos[SW]; |
| 86 |
+ |
if (d > trim[SW]) trim[SW] = d; |
| 87 |
+ |
trim[SU] += d; |
| 88 |
+ |
d = 1.0/0.7236; /* correct sphsetsrc() */ |
| 89 |
+ |
trim[SW] = trim[SV] = trim[SU] = |
| 90 |
+ |
d*sqrt(trim[SW]/trim[SU]); |
| 91 |
+ |
} |
| 92 |
+ |
for (i = 0; i < 3; i++) |
| 93 |
+ |
vpos[i] *= trim[i]; |
| 94 |
+ |
} |
| 95 |
|
/* compute direction */ |
| 96 |
|
for (i = 0; i < 3; i++) |
| 97 |
|
r->rdir[i] = source[si->sn].sloc[i] + |