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.2 by greg, Tue Dec 10 03:16:13 2024 UTC vs.
Revision 2.7 by greg, Wed Dec 18 18:34: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 + /* 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 */
221 <        errno = 0;
222 <        coef = evalue(wp->mf->ep[eoff]);
200 <        if ((errno == EDOM) | (errno == ERANGE)) {
201 <                objerror(wp->mtp, WARNING, "specular compute error");
202 <                scolorblack(sp->scol);
203 <                return;
204 <        }
205 <        if (coef <= FTINY) {            /* negligible value? */
206 <                scolorblack(sp->scol);
207 <                return;
208 <        }                               /* else get modifier */
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 >                goto blackout;
222 >                                        /* need modifier */
223          sp->mo.nam = wp->mtp->oargs.sarg[4*(trans != 0)];
224          if (!fill_modval(&sp->mo, wp)) {
225                  sprintf(errmsg, "unknown specular %s modifier '%s'",
226                          trans ? "transmission" : "reflection", sp->mo.nam);
227                  objerror(wp->mtp, USER, errmsg);
228          }
229 +        if (sintens(sp->mo.pcol) <= FTINY)
230 +                goto blackout;          /* got black pattern */
231 +        setWGMDfunc(&sp->mo, wp);       /* else compute coefficient */
232 +        errno = 0;
233 +        coef = evalue(exa[0]);
234 +        if ((errno == EDOM) | (errno == ERANGE)) {
235 +                objerror(wp->mtp, WARNING, "specular compute error");
236 +                goto blackout;
237 +        }
238 +        if (coef <= FTINY)              /* negligible value? */
239 +                goto blackout;
240          copyscolor(sp->scol, sp->mo.pcol);
241          scalescolor(sp->scol, coef);
242 <        if (sintens(sp->scol) <= FTINY) {
243 <                scolorblack(sp->scol);
244 <                return;                 /* got black pattern */
220 <        }
221 <        setfunc(wp->mtp, wp->rp);       /* else get roughness */
222 <        errno = 0;
223 <        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;
242 >        errno = 0;                      /* else get roughness */
243 >        sp->u_alpha = evalue(exa[1]);
244 >        sp->v_alpha = (sp->u_alpha > FTINY) ? evalue(exa[2]) : 0.0;
245          if ((errno == EDOM) | (errno == ERANGE)) {
246                  objerror(wp->mtp, WARNING, "roughness compute error");
247 <                scolorblack(sp->scol);
228 <                return;
247 >                goto blackout;
248          }                               /* we have something... */
249          wp->specfl |= trans ? SP_TRAN : SP_REFL;
250          if (sp->v_alpha <= FTINY) {     /* is it pure specular? */
251                  wp->specfl |= trans ? SP_TPURE : SP_RPURE;
252                  sp->u_alpha = sp->v_alpha = 0.0;
253                  return;
254 <        }
236 <                                        /* get anisotropic coordinates */
254 >        }                               /* else get aniso coordinates */
255          fcross(sp->v, sp->mo.pnorm, wp->ulocal);
256          if (normalize(sp->v) == 0.0) {  /* orientation vector==normal? */
257                  if (fabs(sp->u_alpha - sp->v_alpha) > 0.001)
# Line 244 | Line 262 | set_scomp(WGMDDAT *wp, int trans)
262                          (sp->u_alpha*sp->u_alpha + sp->v_alpha*sp->v_alpha) );
263          } else
264                  fcross(sp->u, sp->v, sp->mo.pnorm);
265 +        return;
266 + blackout:
267 +        scolorblack(sp->scol);          /* zero out component */
268   }
269  
270   /* sample anisotropic Gaussian specular */
# Line 517 | Line 538 | m_wgmdf(OBJREC *m, RAY *r)
538          wd.rp = r;
539          wd.mtp = m;
540          wd.mf = getfunc(m, 12, 0xEEE, 1);
541 <        set_dcomp(&wd, 0);              /* calls main modifier */
542 <        setfunc(m, r);                  /* get local u vector */
541 >        set_dcomp(&wd, 0);              /* gets main modifier */
542 >        setWGMDfunc(&wd.rd.mo, &wd);    /* get local u vector */
543          errno = 0;
544          for (i = 0; i < 3; i++)
545                  wd.ulocal[i] = evalue(wd.mf->ep[6+i]);
# Line 538 | Line 559 | m_wgmdf(OBJREC *m, RAY *r)
559                  const double    fest = FRESNE(fabs(wd.rs.mo.pdot));
560                  for (i = NCSAMP; i--; )
561                          wd.rs.scol[i] += fest*(1. - wd.rs.scol[i]);
562 +                scalescolor(wd.rd.scol, 1.-fest);
563                  scalescolor(wd.ts.scol, 1.-fest);
564                  scalescolor(wd.td.scol, 1.-fest);
565          }

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines