158 |
|
return(set_modval(mp, lastmod(objndx(wp->mtp), mp->nam), wp->rp)); |
159 |
|
} |
160 |
|
|
161 |
+ |
static int |
162 |
+ |
setWGMDfunc(MODVAL *mp, const WGMDDAT *wp) |
163 |
+ |
{ |
164 |
+ |
static char lastMod[MAXSTR] = ""; |
165 |
+ |
double sf; |
166 |
+ |
FVECT vec; |
167 |
+ |
|
168 |
+ |
if (setfunc(wp->mtp, wp->rp) == 0 && |
169 |
+ |
!strcmp(mp->nam, lastMod)) |
170 |
+ |
return(0); /* already set */ |
171 |
+ |
/* else (re)assign special variables */ |
172 |
+ |
strcpy(lastMod, mp->nam); |
173 |
+ |
sf = (wp->rp->rod > 0) ? 1. : -1.; |
174 |
+ |
varset("RdotP`", '=', (-1. < mp->pdot) & (mp->pdot < 1.) |
175 |
+ |
? sf*mp->pdot : 1.); |
176 |
+ |
sf /= funcxf.sca; |
177 |
+ |
multv3(vec, mp->pnorm, funcxf.xfm); |
178 |
+ |
varset("NxP`", '=', vec[0]*sf); |
179 |
+ |
varset("NyP`", '=', vec[1]*sf); |
180 |
+ |
varset("NzP`", '=', vec[2]*sf); |
181 |
+ |
return(1); |
182 |
+ |
} |
183 |
+ |
|
184 |
|
/* assign indicated diffuse component (do !trans first) */ |
185 |
|
static void |
186 |
|
set_dcomp(WGMDDAT *wp, int trans) |
216 |
|
SCOMP *sp = trans ? &wp->ts : &wp->rs; |
217 |
|
const int eoff = 3*(trans != 0); |
218 |
|
double coef; |
219 |
< |
|
220 |
< |
setfunc(wp->mtp, wp->rp); /* get coefficient, first */ |
219 |
> |
/* constant zero check */ |
220 |
> |
if (wp->mf->ep[eoff]->type == NUM && |
221 |
> |
wp->mf->ep[eoff]->v.num <= FTINY) { |
222 |
> |
scolorblack(sp->scol); |
223 |
> |
return; |
224 |
> |
} /* need modifier */ |
225 |
> |
sp->mo.nam = wp->mtp->oargs.sarg[4*(trans != 0)]; |
226 |
> |
if (!fill_modval(&sp->mo, wp)) { |
227 |
> |
sprintf(errmsg, "unknown specular %s modifier '%s'", |
228 |
> |
trans ? "transmission" : "reflection", sp->mo.nam); |
229 |
> |
objerror(wp->mtp, USER, errmsg); |
230 |
> |
} |
231 |
> |
setWGMDfunc(&sp->mo, wp); |
232 |
|
errno = 0; |
233 |
|
coef = evalue(wp->mf->ep[eoff]); |
234 |
|
if ((errno == EDOM) | (errno == ERANGE)) { |
239 |
|
if (coef <= FTINY) { /* negligible value? */ |
240 |
|
scolorblack(sp->scol); |
241 |
|
return; |
208 |
– |
} /* else get modifier */ |
209 |
– |
sp->mo.nam = wp->mtp->oargs.sarg[4*(trans != 0)]; |
210 |
– |
if (!fill_modval(&sp->mo, wp)) { |
211 |
– |
sprintf(errmsg, "unknown specular %s modifier '%s'", |
212 |
– |
trans ? "transmission" : "reflection", sp->mo.nam); |
213 |
– |
objerror(wp->mtp, USER, errmsg); |
242 |
|
} |
243 |
|
copyscolor(sp->scol, sp->mo.pcol); |
244 |
|
scalescolor(sp->scol, coef); |
246 |
|
scolorblack(sp->scol); |
247 |
|
return; /* got black pattern */ |
248 |
|
} |
249 |
< |
setfunc(wp->mtp, wp->rp); /* else get roughness */ |
222 |
< |
errno = 0; |
249 |
> |
errno = 0; /* else get roughness */ |
250 |
|
sp->u_alpha = evalue(wp->mf->ep[eoff+1]); |
251 |
|
sp->v_alpha = (sp->u_alpha > FTINY) ? evalue(wp->mf->ep[eoff+2]) : 0.0; |
252 |
|
if ((errno == EDOM) | (errno == ERANGE)) { |
544 |
|
wd.rp = r; |
545 |
|
wd.mtp = m; |
546 |
|
wd.mf = getfunc(m, 12, 0xEEE, 1); |
547 |
< |
set_dcomp(&wd, 0); /* calls main modifier */ |
548 |
< |
setfunc(m, r); /* get local u vector */ |
547 |
> |
set_dcomp(&wd, 0); /* gets main modifier */ |
548 |
> |
setWGMDfunc(&wd.rd.mo, &wd); /* get local u vector */ |
549 |
|
errno = 0; |
550 |
|
for (i = 0; i < 3; i++) |
551 |
|
wd.ulocal[i] = evalue(wd.mf->ep[6+i]); |