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.1 by greg, Mon Dec 9 00:44:29 2024 UTC vs.
Revision 2.6 by greg, Wed Dec 18 17:57:06 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 + /* set calculation context for given component of MAT_WGMDF */
162 + static int
163 + setWGMDfunc(MODVAL *mp, const WGMDDAT *wp)
164 + {
165 +        static char     lastMod[MAXSTR];
166 +        double          sf;
167 +        FVECT           vec;
168 +
169 +        if (setfunc(wp->mtp, wp->rp) == 0 &&
170 +                        !strcmp(mp->nam, lastMod))
171 +                return(0);      /* already set */
172 +        strcpy(lastMod, mp->nam);
173 +                                /* else (re)assign special variables */
174 +        sf = 1 - 2*(wp->rp->rod < 0);
175 +        varset("RdotP`", '=', mp->pdot*sf);
176 +        multv3(vec, mp->pnorm, funcxf.xfm);
177 +        sf /= funcxf.sca;
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 190 | Line 213 | set_dcomp(WGMDDAT *wp, int trans)
213   static void
214   set_scomp(WGMDDAT *wp, int trans)
215   {
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 */
216 >        SCOMP   *sp = trans ? &wp->ts : &wp->rs;
217 >        EPNODE  **exa = wp->mf->ep + 3*(trans != 0);
218 >        double  coef;
219 >                                        /* constant zero check */
220 >        if (exa[0]->type == NUM && exa[0]->v.num <= FTINY) {
221 >                scolorblack(sp->scol);
222 >                return;
223 >        }                               /* need modifier */
224 >        sp->mo.nam = wp->mtp->oargs.sarg[4*(trans != 0)];
225 >        if (!fill_modval(&sp->mo, wp)) {
226 >                sprintf(errmsg, "unknown specular %s modifier '%s'",
227 >                        trans ? "transmission" : "reflection", sp->mo.nam);
228 >                objerror(wp->mtp, USER, errmsg);
229 >        }
230 >        setWGMDfunc(&sp->mo, wp);
231          errno = 0;
232 <        coef = evalue(wp->mf->ep[eoff]);
232 >        coef = evalue(exa[0]);
233          if ((errno == EDOM) | (errno == ERANGE)) {
234                  objerror(wp->mtp, WARNING, "specular compute error");
235                  scolorblack(sp->scol);
# Line 205 | Line 238 | set_scomp(WGMDDAT *wp, int trans)
238          if (coef <= FTINY) {            /* negligible value? */
239                  scolorblack(sp->scol);
240                  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);
241          }
242          copyscolor(sp->scol, sp->mo.pcol);
243          scalescolor(sp->scol, coef);
# Line 218 | Line 245 | set_scomp(WGMDDAT *wp, int trans)
245                  scolorblack(sp->scol);
246                  return;                 /* got black pattern */
247          }
248 <        setfunc(wp->mtp, wp->rp);       /* else get roughness */
249 <        errno = 0;
250 <        sp->u_alpha = evalue(wp->mf->ep[eoff+1]);
224 <        sp->v_alpha = (sp->u_alpha > FTINY) ? evalue(wp->mf->ep[eoff+2]) : 0.0;
248 >        errno = 0;                      /* else get roughness */
249 >        sp->u_alpha = evalue(exa[1]);
250 >        sp->v_alpha = (sp->u_alpha > FTINY) ? evalue(exa[2]) : 0.0;
251          if ((errno == EDOM) | (errno == ERANGE)) {
252                  objerror(wp->mtp, WARNING, "roughness compute error");
253                  scolorblack(sp->scol);
# Line 510 | Line 536 | m_wgmdf(OBJREC *m, RAY *r)
536          }
537          if ((m->oargs.nsargs < 13) | (m->oargs.nfargs < 9))
538                  objerror(m, USER, "bad number of arguments");
539 +
540 +        if (r->crtype & SHADOW && !strcmp(m->oargs.sarg[5], "0"))
541 +                return(1);              /* first shadow test */
542          clr_comps(&wd);
543          wd.rp = r;
544          wd.mtp = m;
545          wd.mf = getfunc(m, 12, 0xEEE, 1);
546 <        setfunc(m, r);                  /* get local u vector */
546 >        set_dcomp(&wd, 0);              /* gets main modifier */
547 >        setWGMDfunc(&wd.rd.mo, &wd);    /* get local u vector */
548          errno = 0;
549          for (i = 0; i < 3; i++)
550                  wd.ulocal[i] = evalue(wd.mf->ep[6+i]);
# Line 523 | Line 553 | m_wgmdf(OBJREC *m, RAY *r)
553          else if (wd.mf->fxp != &unitxf)
554                  multv3(wd.ulocal, wd.ulocal, wd.mf->fxp->xfm);
555  
526        set_dcomp(&wd, 0);              /* call this first */
527        set_dcomp(&wd, 1);              /* call this second */
556          set_scomp(&wd, 1);              /* sets SP_TPURE */
557          if (r->crtype & SHADOW && !(wd.specfl & SP_TPURE))
558 <                return(1);              /* early shadow test */
558 >                return(1);              /* second shadow test */
559 >        set_dcomp(&wd, 1);
560          set_scomp(&wd, 0);
561          wd.specfl |= SP_FLAT*(r->ro != NULL && isflat(r->ro->otype));
562                                          /* apply Fresnel adjustments? */
# Line 535 | Line 564 | m_wgmdf(OBJREC *m, RAY *r)
564                  const double    fest = FRESNE(fabs(wd.rs.mo.pdot));
565                  for (i = NCSAMP; i--; )
566                          wd.rs.scol[i] += fest*(1. - wd.rs.scol[i]);
567 +                scalescolor(wd.rd.scol, 1.-fest);
568                  scalescolor(wd.ts.scol, 1.-fest);
569                  scalescolor(wd.td.scol, 1.-fest);
570          }

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines