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

Comparing ray/src/common/modobject.c (file contents):
Revision 2.15 by greg, Sun Dec 8 19:25:36 2013 UTC vs.
Revision 2.18 by greg, Sat Oct 17 16:39:23 2020 UTC

# Line 107 | Line 107 | eqobjects(                     /* check if two objects are equal */
107   )
108   {
109          OBJREC  *op1, *op2;
110 <        int     i;
110 >        int     i, n;
111  
112          while (obj1 != obj2) {
113                  if (obj1 == OVOID)
# Line 132 | Line 132 | eqobjects(                     /* check if two objects are equal */
132                  for (i = op1->oargs.nfargs; i-- > 0; )
133                          if (!eqreal(op1->oargs.farg[i], op2->oargs.farg[i]))
134                                  return(0);
135 <                for (i = op1->oargs.nsargs; i-- > 0; )
135 >                n = 0;
136 >                switch (op1->otype) {   /* special cases (KEEP CONSISTENT!) */
137 >                case MOD_ALIAS:
138 >                case MAT_ILLUM:
139 >                case MAT_MIRROR:
140 >                        n = (op1->oargs.nsargs > 0);
141 >                        break;
142 >                case MIX_FUNC:
143 >                case MIX_DATA:
144 >                case MIX_TEXT:
145 >                case MIX_PICT:
146 >                        n = 2*(op1->oargs.nsargs >= 2);
147 >                        break;
148 >                case MAT_CLIP:
149 >                        n = op1->oargs.nsargs;
150 >                        break;
151 >                }
152 >                                        /* check other string arguments */
153 >                for (i = op1->oargs.nsargs; i-- > n; )
154                          if (strcmp(op1->oargs.sarg[i], op2->oargs.sarg[i]))
155                                  return(0);
156 +                while (n-- > 0)         /* check modifier references */
157 +                        if (!eqobjects( lastmod(obj1, op1->oargs.sarg[n]),
158 +                                        lastmod(obj2, op2->oargs.sarg[n]) ))
159 +                                return(0);
160                  obj1 = op1->omod;
161                  obj2 = op2->omod;
162          }
# Line 152 | Line 174 | insertobject(                  /* insert new object into our list */
174          if (ismodifier(objptr(obj)->otype)) {
175                  i = otndx(objptr(obj)->oname, &modtab);
176                  if (eqobjects(obj, modtab.htab[i]))
177 <                        return;
177 >                        return; /* don't index if same as earlier def. */
178                  modtab.htab[i] = obj;
179          }
180   #ifdef  GETOBJ
# Line 167 | Line 189 | insertobject(                  /* insert new object into our list */
189  
190  
191   void
192 < clearobjndx(void)               /* clear object hash tables */
192 > truncobjndx(void)               /* remove bogus table entries past end */
193   {
194 <        if (modtab.htab != NULL) {
195 <                free((void *)modtab.htab);
196 <                modtab.htab = NULL;
197 <                modtab.hsiz = 100;
194 >        int     ndx;
195 >
196 >        if (nobjects <= 0) {
197 >                if (modtab.htab != NULL) {
198 >                        free((void *)modtab.htab);
199 >                        modtab.htab = NULL;
200 >                        modtab.hsiz = 100;
201 >                }
202 >                if (objtab.htab != NULL) {
203 >                        free((void *)objtab.htab);
204 >                        objtab.htab = NULL;
205 >                        objtab.hsiz = 100;
206 >                }
207 >                return;
208          }
209 <        if (objtab.htab != NULL) {
210 <                free((void *)objtab.htab);
211 <                objtab.htab = NULL;
212 <                objtab.hsiz = 100;
213 <        }
209 >        for (ndx = modtab.hsiz*(modtab.htab != NULL); ndx--; )
210 >                if (modtab.htab[ndx] >= nobjects)
211 >                        modtab.htab[ndx] = OVOID;
212 >
213 >        for (ndx = objtab.hsiz*(objtab.htab != NULL); ndx--; )
214 >                if (objtab.htab[ndx] >= nobjects)
215 >                        objtab.htab[ndx] = OVOID;
216   }
217  
218  

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines