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

Comparing ray/src/rt/initotypes.c (file contents):
Revision 2.23 by greg, Thu Nov 8 00:54:07 2018 UTC vs.
Revision 2.27 by greg, Sat Jan 30 17:53:19 2021 UTC

# Line 95 | Line 95 | initotypes(void)                       /* initialize ofun array */
95  
96  
97   int
98 < o_default(OBJREC *o, RAY *r)                    /* default action is error */
98 > o_default(OBJREC *o, RAY *r)            /* default action is error */
99   {
100          objerror(o, CONSISTENCY, "unexpected object call");
101 <                                /* unused call to load freeobjmem.o */
101 >                                        /* unused call to load freeobjmem.o */
102          free_objs(0, 0);
103          return(0);
104   }
105  
106  
107 <
108 < OBJREC *                        /* find an object's actual material */
109 < findmaterial(OBJREC *o)
107 > OBJREC *        
108 > findmaterial(OBJREC *o)                 /* find an object's actual material */
109   {
110 +        OBJECT  mod = OVOID;
111 +
112          while (!ismaterial(o->otype)) {
113                  if (o->otype == MOD_ALIAS && o->oargs.nsargs) {
113                        OBJECT  aobj;
114                          OBJREC  *ao;
115 <                        aobj = lastmod(objndx(o), o->oargs.sarg[0]);
116 <                        if (aobj < 0)
115 >                        if (mod < 0)
116 >                                mod = objndx(o);
117 >                        mod = lastmod(mod, o->oargs.sarg[0]);
118 >                        if (mod < 0)
119                                  objerror(o, USER, "bad reference");
120 <                                /* recursive check on alias branch */
121 <                        if ((ao = findmaterial(objptr(aobj))) != NULL)
120 >                                        /* recursive check on alias branch */
121 >                        if ((ao = findmaterial(objptr(mod))) != NULL)
122                                  return(ao);
123                  }
124 <                if (o->omod == OVOID)
125 <                        return(NULL);
126 <                o = objptr(o->omod);
124 >                if (o->omod == OVOID) {
125 >                                        /* void mixture de facto material? */
126 >                        if (ismixture(o->otype))
127 >                                break;
128 >                        return(NULL);   /* else no material found */
129 >                }
130 >                o = objptr(mod = o->omod);
131          }
132 <        return(o);              /* XXX: material mixtures will return NULL */
132 >        return(o);
133   }

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines