8 |
|
* External symbols declared in source.h |
9 |
|
*/ |
10 |
|
|
11 |
< |
/* ==================================================================== |
12 |
< |
* The Radiance Software License, Version 1.0 |
13 |
< |
* |
14 |
< |
* Copyright (c) 1990 - 2002 The Regents of the University of California, |
15 |
< |
* through Lawrence Berkeley National Laboratory. All rights reserved. |
16 |
< |
* |
17 |
< |
* Redistribution and use in source and binary forms, with or without |
18 |
< |
* modification, are permitted provided that the following conditions |
19 |
< |
* are met: |
20 |
< |
* |
21 |
< |
* 1. Redistributions of source code must retain the above copyright |
22 |
< |
* notice, this list of conditions and the following disclaimer. |
23 |
< |
* |
24 |
< |
* 2. Redistributions in binary form must reproduce the above copyright |
25 |
< |
* notice, this list of conditions and the following disclaimer in |
26 |
< |
* the documentation and/or other materials provided with the |
27 |
< |
* distribution. |
28 |
< |
* |
29 |
< |
* 3. The end-user documentation included with the redistribution, |
30 |
< |
* if any, must include the following acknowledgment: |
31 |
< |
* "This product includes Radiance software |
32 |
< |
* (http://radsite.lbl.gov/) |
33 |
< |
* developed by the Lawrence Berkeley National Laboratory |
34 |
< |
* (http://www.lbl.gov/)." |
35 |
< |
* Alternately, this acknowledgment may appear in the software itself, |
36 |
< |
* if and wherever such third-party acknowledgments normally appear. |
37 |
< |
* |
38 |
< |
* 4. The names "Radiance," "Lawrence Berkeley National Laboratory" |
39 |
< |
* and "The Regents of the University of California" must |
40 |
< |
* not be used to endorse or promote products derived from this |
41 |
< |
* software without prior written permission. For written |
42 |
< |
* permission, please contact [email protected]. |
43 |
< |
* |
44 |
< |
* 5. Products derived from this software may not be called "Radiance", |
45 |
< |
* nor may "Radiance" appear in their name, without prior written |
46 |
< |
* permission of Lawrence Berkeley National Laboratory. |
47 |
< |
* |
48 |
< |
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED |
49 |
< |
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
50 |
< |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE |
51 |
< |
* DISCLAIMED. IN NO EVENT SHALL Lawrence Berkeley National Laboratory OR |
52 |
< |
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
53 |
< |
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
54 |
< |
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF |
55 |
< |
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND |
56 |
< |
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, |
57 |
< |
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT |
58 |
< |
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF |
59 |
< |
* SUCH DAMAGE. |
60 |
< |
* ==================================================================== |
61 |
< |
* |
62 |
< |
* This software consists of voluntary contributions made by many |
63 |
< |
* individuals on behalf of Lawrence Berkeley National Laboratory. For more |
64 |
< |
* information on Lawrence Berkeley National Laboratory, please see |
65 |
< |
* <http://www.lbl.gov/>. |
66 |
< |
*/ |
11 |
> |
#include "copyright.h" |
12 |
|
|
13 |
|
#include "ray.h" |
14 |
|
|
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; |
35 |
|
if (directrelay <= 0) |
36 |
|
return; |
37 |
|
/* find virtual source objects */ |
38 |
< |
for (i = 0; i < nobjects; i++) { |
38 |
> |
for (i = 0; i < nsceneobjs; i++) { |
39 |
|
o = objptr(i); |
40 |
|
if (!issurface(o->otype) || o->omod == OVOID) |
41 |
|
continue; |
49 |
|
if (nvobjects == 0) |
50 |
|
vobject = (OBJECT *)malloc(sizeof(OBJECT)); |
51 |
|
else |
52 |
< |
vobject = (OBJECT *)realloc((char *)vobject, |
52 |
> |
vobject = (OBJECT *)realloc((void *)vobject, |
53 |
|
(unsigned)(nvobjects+1)*sizeof(OBJECT)); |
54 |
|
if (vobject == NULL) |
55 |
|
error(SYSTEM, "out of memory in addvirtuals"); |
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; |
360 |
|
sr.rorg[i] = oc[i] + offsdir[i] + d*onorm[i]; |
361 |
|
sr.rdir[i] = -onorm[i]; |
362 |
|
} |
363 |
< |
sr.rmax = 0.0; |
410 |
< |
rayorigin(&sr, NULL, PRIMARY, 1.0); |
363 |
> |
rayorigin(&sr, PRIMARY, NULL, NULL); |
364 |
|
} while (!(*ofun[o->otype].funp)(o, &sr)); |
365 |
|
/* check against source */ |
366 |
|
VCOPY(sr.rorg, sr.rop); /* starting from intersection */ |
374 |
|
} |
375 |
|
sr.revf = srcvalue; |
376 |
|
rayvalue(&sr); /* check sample validity */ |
377 |
< |
if (bright(sr.rcol) <= FTINY) |
377 |
> |
if ((d = bright(sr.rcol)) <= FTINY) |
378 |
|
continue; |
379 |
|
nok++; /* got sample; check obstructions */ |
380 |
|
rayclear(&sr); |
381 |
|
sr.revf = raytrace; |
382 |
|
rayvalue(&sr); |
383 |
< |
if (bright(sr.rcol) > FTINY) |
383 |
> |
if ((d1 = bright(sr.rcol)) > FTINY) { |
384 |
> |
if (d - d1 > FTINY) { |
385 |
> |
#ifdef DEBUG |
386 |
> |
fprintf(stderr, "\tpartially shadowed\n"); |
387 |
> |
#endif |
388 |
> |
return(f); /* intervening transmitter */ |
389 |
> |
} |
390 |
|
nhit++; |
391 |
+ |
} |
392 |
|
if (nhit > 0 && nhit < nok) { |
393 |
|
#ifdef DEBUG |
394 |
|
fprintf(stderr, "\tpartially occluded\n"); |
410 |
|
|
411 |
|
|
412 |
|
#ifdef DEBUG |
413 |
< |
void |
414 |
< |
virtverb(sn, fp) /* print verbose description of virtual source */ |
415 |
< |
register int sn; |
416 |
< |
FILE *fp; |
413 |
> |
extern void |
414 |
> |
virtverb( /* print verbose description of virtual source */ |
415 |
> |
register int sn, |
416 |
> |
FILE *fp |
417 |
> |
) |
418 |
|
{ |
419 |
|
register int i; |
420 |
|
|