ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/radiance/ray/src/rt/m_wgmdf.c
(Generate patch)

Comparing ray/src/rt/m_wgmdf.c (file contents):
Revision 2.4 by greg, Wed Dec 11 18:32:26 2024 UTC vs.
Revision 2.5 by greg, Tue Dec 17 20:03:13 2024 UTC

# Line 158 | Line 158 | fill_modval(MODVAL *mp, const WGMDDAT *wp)
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)
# Line 193 | Line 216 | set_scomp(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)) {
# Line 205 | Line 239 | set_scomp(WGMDDAT *wp, int trans)
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);
# Line 218 | Line 246 | set_scomp(WGMDDAT *wp, int trans)
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)) {
# Line 517 | Line 544 | m_wgmdf(OBJREC *m, RAY *r)
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]);

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines