41 |
|
o = objptr(i); |
42 |
|
if (!issurface(o->otype) || o->omod == OVOID) |
43 |
|
continue; |
44 |
< |
if (!isvlight(objptr(o->omod)->otype)) |
44 |
> |
if (!isvlight(vsmaterial(o)->otype)) |
45 |
|
continue; |
46 |
|
if (sfun[o->otype].of == NULL || |
47 |
|
sfun[o->otype].of->getpleq == NULL) { |
101 |
|
if (o == source[sn].so) /* objects cannot project themselves */ |
102 |
|
return; |
103 |
|
/* get virtual source material */ |
104 |
< |
vsmat = sfun[objptr(o->omod)->otype].mf; |
104 |
> |
vsmat = sfun[vsmaterial(o)->otype].mf; |
105 |
|
/* project virtual sources */ |
106 |
|
for (i = 0; i < vsmat->nproj; i++) |
107 |
|
if ((*vsmat->vproj)(proj, o, &source[sn], i)) |
115 |
|
} |
116 |
|
|
117 |
|
|
118 |
+ |
OBJREC * |
119 |
+ |
vsmaterial(o) /* get virtual source material pointer */ |
120 |
+ |
OBJREC *o; |
121 |
+ |
{ |
122 |
+ |
register int i; |
123 |
+ |
register OBJREC *m; |
124 |
+ |
|
125 |
+ |
i = o->omod; |
126 |
+ |
m = objptr(i); |
127 |
+ |
if (m->otype != MAT_ILLUM || m->oargs.nsargs < 1 || |
128 |
+ |
!strcmp(m->oargs.sarg[0], VOIDID) || |
129 |
+ |
(i = modifier(m->oargs.sarg[0])) == OVOID) |
130 |
+ |
return(m); /* direct modifier */ |
131 |
+ |
return(objptr(i)); /* illum alternate */ |
132 |
+ |
} |
133 |
+ |
|
134 |
+ |
|
135 |
|
int |
136 |
|
makevsrc(op, sn, pm) /* make virtual source if reasonable */ |
137 |
|
OBJREC *op; |
366 |
|
/* check against source */ |
367 |
|
initsrcindex(&si); |
368 |
|
si.sn = sn; |
369 |
< |
nopart(&si, sr.rorg); |
369 |
> |
nopart(&si, &sr); |
370 |
|
samplendx++; |
371 |
|
if (!srcray(&sr, NULL, &si) || sr.rsrc != sn) |
372 |
|
continue; |