26 |
|
static int nvobjects = 0; /* number of virtual source objects */ |
27 |
|
|
28 |
|
|
29 |
< |
void |
30 |
< |
markvirtuals() /* find and mark virtual sources */ |
29 |
> |
extern void |
30 |
> |
markvirtuals(void) /* find and mark virtual sources */ |
31 |
|
{ |
32 |
|
register OBJREC *o; |
33 |
|
register int i; |
69 |
|
} |
70 |
|
|
71 |
|
|
72 |
< |
void |
73 |
< |
addvirtuals(sn, nr) /* add virtuals associated with source */ |
74 |
< |
int sn; |
75 |
< |
int nr; |
72 |
> |
extern void |
73 |
> |
addvirtuals( /* add virtuals associated with source */ |
74 |
> |
int sn, |
75 |
> |
int nr |
76 |
> |
) |
77 |
|
{ |
78 |
|
register int i; |
79 |
|
/* check relay limit first */ |
88 |
|
} |
89 |
|
|
90 |
|
|
91 |
< |
void |
92 |
< |
vproject(o, sn, n) /* create projected source(s) if they exist */ |
93 |
< |
OBJREC *o; |
94 |
< |
int sn; |
95 |
< |
int n; |
91 |
> |
extern void |
92 |
> |
vproject( /* create projected source(s) if they exist */ |
93 |
> |
OBJREC *o, |
94 |
> |
int sn, |
95 |
> |
int n |
96 |
> |
) |
97 |
|
{ |
98 |
|
register int i; |
99 |
|
register VSMATERIAL *vsmat; |
117 |
|
} |
118 |
|
|
119 |
|
|
120 |
< |
OBJREC * |
121 |
< |
vsmaterial(o) /* get virtual source material pointer */ |
122 |
< |
OBJREC *o; |
120 |
> |
extern OBJREC * |
121 |
> |
vsmaterial( /* get virtual source material pointer */ |
122 |
> |
OBJREC *o |
123 |
> |
) |
124 |
|
{ |
125 |
|
register int i; |
126 |
|
register OBJREC *m; |
127 |
|
|
128 |
|
i = o->omod; |
129 |
< |
m = objptr(i); |
129 |
> |
m = findmaterial(objptr(i)); |
130 |
> |
if (m == NULL) |
131 |
> |
return(objptr(i)); |
132 |
|
if (m->otype != MAT_ILLUM || m->oargs.nsargs < 1 || |
133 |
|
!strcmp(m->oargs.sarg[0], VOIDID) || |
134 |
|
(i = lastmod(objndx(m), m->oargs.sarg[0])) == OVOID) |
137 |
|
} |
138 |
|
|
139 |
|
|
140 |
< |
int |
141 |
< |
makevsrc(op, sn, pm) /* make virtual source if reasonable */ |
142 |
< |
OBJREC *op; |
143 |
< |
register int sn; |
144 |
< |
MAT4 pm; |
140 |
> |
extern int |
141 |
> |
makevsrc( /* make virtual source if reasonable */ |
142 |
> |
OBJREC *op, |
143 |
> |
register int sn, |
144 |
> |
MAT4 pm |
145 |
> |
) |
146 |
|
{ |
147 |
|
FVECT nsloc, nsnorm, ocent, v; |
148 |
|
double maxrad2, d; |
200 |
|
else |
201 |
|
nsflags &= ~SSPOT; |
202 |
|
if (source[sn].sflags & SSPOT) { |
203 |
< |
copystruct(&theirspot, source[sn].sl.s); |
203 |
> |
theirspot = *(source[sn].sl.s); |
204 |
|
multv3(theirspot.aim, source[sn].sl.s->aim, pm); |
205 |
|
normalize(theirspot.aim); |
206 |
|
if (nsflags & SSPOT) { |
210 |
|
return(-1); /* no overlap */ |
211 |
|
} else { |
212 |
|
nsflags |= SSPOT; |
213 |
< |
copystruct(&ourspot, &theirspot); |
213 |
> |
ourspot = theirspot; |
214 |
|
d = 2.*ourspot.siz; |
215 |
|
} |
216 |
|
if (ourspot.siz < d-FTINY) { /* it shrunk */ |
250 |
|
if (nsflags & SSPOT) { |
251 |
|
if ((source[i].sl.s = (SPOT *)malloc(sizeof(SPOT))) == NULL) |
252 |
|
goto memerr; |
253 |
< |
copystruct(source[i].sl.s, &ourspot); |
253 |
> |
*(source[i].sl.s) = ourspot; |
254 |
|
} |
255 |
|
if (nsflags & SPROX) |
256 |
|
source[i].sl.prox = source[sn].sl.prox; |
259 |
|
return(i); |
260 |
|
memerr: |
261 |
|
error(SYSTEM, "out of memory in makevsrc"); |
262 |
+ |
return -1; /* pro forma return */ |
263 |
|
} |
264 |
|
|
265 |
|
|
266 |
< |
double |
267 |
< |
getdisk(oc, op, sn) /* get visible object disk */ |
268 |
< |
FVECT oc; |
269 |
< |
OBJREC *op; |
270 |
< |
register int sn; |
266 |
> |
extern double |
267 |
> |
getdisk( /* get visible object disk */ |
268 |
> |
FVECT oc, |
269 |
> |
OBJREC *op, |
270 |
> |
register int sn |
271 |
> |
) |
272 |
|
{ |
273 |
|
double rad2, roffs, offs, d, rd, rdoto; |
274 |
|
FVECT rnrm, nrm; |
296 |
|
} |
297 |
|
|
298 |
|
|
299 |
< |
int |
300 |
< |
vstestvis(f, o, oc, or2, sn) /* pretest source visibility */ |
301 |
< |
int f; /* virtual source flags */ |
302 |
< |
OBJREC *o; /* relay object */ |
303 |
< |
FVECT oc; /* relay object center */ |
304 |
< |
double or2; /* relay object radius squared */ |
305 |
< |
register int sn; /* target source number */ |
299 |
> |
extern int |
300 |
> |
vstestvis( /* pretest source visibility */ |
301 |
> |
int f, /* virtual source flags */ |
302 |
> |
OBJREC *o, /* relay object */ |
303 |
> |
FVECT oc, /* relay object center */ |
304 |
> |
double or2, /* relay object radius squared */ |
305 |
> |
register int sn /* target source number */ |
306 |
> |
) |
307 |
|
{ |
308 |
|
RAY sr; |
309 |
|
FVECT onorm; |
310 |
|
FVECT offsdir; |
311 |
|
SRCINDEX si; |
312 |
< |
double or, d; |
312 |
> |
double or, d, d1; |
313 |
|
int stestlim, ssn; |
314 |
|
int nhit, nok; |
315 |
|
register int i, n; |
361 |
|
sr.rdir[i] = -onorm[i]; |
362 |
|
} |
363 |
|
sr.rmax = 0.0; |
364 |
< |
rayorigin(&sr, NULL, PRIMARY, 1.0); |
364 |
> |
rayorigin(&sr, PRIMARY, NULL, NULL); |
365 |
|
} while (!(*ofun[o->otype].funp)(o, &sr)); |
366 |
|
/* check against source */ |
367 |
|
VCOPY(sr.rorg, sr.rop); /* starting from intersection */ |
375 |
|
} |
376 |
|
sr.revf = srcvalue; |
377 |
|
rayvalue(&sr); /* check sample validity */ |
378 |
< |
if (bright(sr.rcol) <= FTINY) |
378 |
> |
if ((d = bright(sr.rcol)) <= FTINY) |
379 |
|
continue; |
380 |
|
nok++; /* got sample; check obstructions */ |
381 |
|
rayclear(&sr); |
382 |
|
sr.revf = raytrace; |
383 |
|
rayvalue(&sr); |
384 |
< |
if (bright(sr.rcol) > FTINY) |
384 |
> |
if ((d1 = bright(sr.rcol)) > FTINY) { |
385 |
> |
if (d - d1 > FTINY) { |
386 |
> |
#ifdef DEBUG |
387 |
> |
fprintf(stderr, "\tpartially shadowed\n"); |
388 |
> |
#endif |
389 |
> |
return(f); /* intervening transmitter */ |
390 |
> |
} |
391 |
|
nhit++; |
392 |
+ |
} |
393 |
|
if (nhit > 0 && nhit < nok) { |
394 |
|
#ifdef DEBUG |
395 |
|
fprintf(stderr, "\tpartially occluded\n"); |
411 |
|
|
412 |
|
|
413 |
|
#ifdef DEBUG |
414 |
< |
void |
415 |
< |
virtverb(sn, fp) /* print verbose description of virtual source */ |
416 |
< |
register int sn; |
417 |
< |
FILE *fp; |
414 |
> |
extern void |
415 |
> |
virtverb( /* print verbose description of virtual source */ |
416 |
> |
register int sn, |
417 |
> |
FILE *fp |
418 |
> |
) |
419 |
|
{ |
420 |
|
register int i; |
421 |
|
|