--- ray/src/rt/m_alias.c 2004/01/20 22:16:53 2.4 +++ ray/src/rt/m_alias.c 2018/01/09 05:01:15 2.8 @@ -1,13 +1,15 @@ #ifndef lint -static const char RCSid[] = "$Id: m_alias.c,v 2.4 2004/01/20 22:16:53 greg Exp $"; +static const char RCSid[] = "$Id: m_alias.c,v 2.8 2018/01/09 05:01:15 greg Exp $"; #endif /* * Handler for modifier alias */ #include "copyright.h" + #include "ray.h" #include "otypes.h" +#include "rtotypes.h" #include "otspecial.h" /* @@ -22,9 +24,10 @@ static const char RCSid[] = "$Id: m_alias.c,v 2.4 2004 */ int -m_alias(m, r) /* transfer shading to alias target */ -OBJREC *m; -RAY *r; +m_alias( /* transfer shading to alias target */ + OBJREC *m, + RAY *r +) { OBJECT aobj; OBJREC *aop; @@ -36,16 +39,24 @@ RAY *r; /* else replace alias */ if (m->oargs.nsargs != 1) objerror(m, INTERNAL, "bad # string arguments"); - aobj = lastmod(objndx(m), m->oargs.sarg[0]); - if (aobj < 0) - objerror(m, USER, "bad reference"); - aop = objptr(aobj); + aop = m; + aobj = objndx(aop); + do { /* follow alias trail */ + if (aop->oargs.nsargs == 1) + aobj = lastmod(aobj, aop->oargs.sarg[0]); + else + aobj = aop->omod; + if (aobj < 0) + objerror(aop, USER, "bad reference"); + aop = objptr(aobj); + } while (aop->otype == MOD_ALIAS); + /* copy struct */ arec = *aop; /* irradiance hack */ if (do_irrad && !(r->crtype & ~(PRIMARY|TRANS)) && m->otype != MAT_CLIP && (ofun[arec.otype].flags & (T_M|T_X))) { - if (irr_ignore(arec.otype)) { + if (istransp(arec.otype) || isBSDFproxy(m)) { raytrans(r); return(1); }