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.13 by greg, Sat Mar 9 18:53:05 2013 UTC vs.
Revision 2.19 by greg, Sat Oct 17 17:48:46 2020 UTC

# Line 88 | Line 88 | object(                                /* get an object number from its name */
88   #endif
89  
90  
91 + int
92 + eqreal(                         /* are two real values close enough to equal? */
93 +        double  d1,
94 +        double  d2
95 + )
96 + {
97 +        if (d2 != 0.0)
98 +                d1 = d1/d2 - 1.0;
99 +        return((-FTINY <= d1) & (d1 <= FTINY));
100 + }
101 +
102 +
103 + int
104 + eqobjects(                      /* check if two objects are equal */
105 +        OBJECT  obj1,
106 +        OBJECT  obj2
107 + )
108 + {
109 +        OBJREC  *op1, *op2;
110 +        int     i, n;
111 +
112 +        while (obj1 != obj2) {
113 +                if (obj1 == OVOID)
114 +                        return(0);
115 +                if (obj2 == OVOID)
116 +                        return(0);
117 +                op1 = objptr(obj1);
118 +                op2 = objptr(obj2);
119 +                if (op1->otype != op2->otype)
120 +                        return(0);
121 +                if (op1->oargs.nsargs != op2->oargs.nsargs)
122 +                        return(0);
123 +                if (op1->oargs.nfargs != op2->oargs.nfargs)
124 +                        return(0);
125 + #ifdef IARGS
126 +                if (op1->oargs.niargs != op2->oargs.niargs)
127 +                        return(0);
128 +                for (i = op1->oargs.niargs; i-- > 0; )
129 +                        if (op1->oargs.iarg[i] != op2->oargs.iarg[i])
130 +                                return(0);
131 + #endif
132 +                for (i = op1->oargs.nfargs; i-- > 0; )
133 +                        if (!eqreal(op1->oargs.farg[i], op2->oargs.farg[i]))
134 +                                return(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 +        }
163 +        return(1);
164 + }
165 +
166 +
167   void
168   insertobject(                   /* insert new object into our list */
169          OBJECT  obj
# Line 97 | Line 173 | insertobject(                  /* insert new object into our list */
173  
174          if (ismodifier(objptr(obj)->otype)) {
175                  i = otndx(objptr(obj)->oname, &modtab);
176 +                if (eqobjects(obj, modtab.htab[i]))
177 +                        return; /* don't index if same as earlier def. */
178                  modtab.htab[i] = obj;
179          }
180   #ifdef  GETOBJ
# Line 111 | 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  
# Line 132 | Line 222 | nexthsiz(                      /* return next hash table size */
222   )
223   {
224          static int  hsiztab[] = {
225 <                251, 509, 1021, 2039, 4093, 8191, 16381, 0
225 >                251, 509, 1021, 2039, 4093, 8191, 16381,
226 >                32749, 65521, 131071, 262139, 0
227          };
228          int  *hsp;
229  
# Line 149 | Line 240 | otndx(                         /* get object table index for name */
240          struct ohtab  *tab
241   )
242   {
243 +        char    *onm;
244          OBJECT  *oldhtab;
245          int  hval, i;
246          int  ndx;
# Line 167 | Line 259 | otndx(                         /* get object table index for name */
259   tryagain:
260          for (i = 0; i < tab->hsiz; i++) {
261                  ndx = (hval + (unsigned long)i*i) % tab->hsiz;
262 <                if (tab->htab[ndx] == OVOID ||
171 <                                !strcmp(objptr(tab->htab[ndx])->oname, name))
262 >                if (tab->htab[ndx] == OVOID)
263                          return(ndx);
264 +                onm = objptr(tab->htab[ndx])->oname;
265 +                if (onm != NULL && !strcmp(onm, name))
266 +                        return(ndx);
267          }
268                                          /* table is full, reallocate */
269          oldhtab = tab->htab;
# Line 177 | Line 271 | tryagain:
271          tab->htab = NULL;
272          while (ndx--)
273                  if (oldhtab[ndx] != OVOID) {
274 <                        i = otndx(objptr(oldhtab[ndx])->oname, tab);
274 >                        onm = objptr(oldhtab[ndx])->oname;
275 >                        if (onm == NULL)
276 >                                continue;
277 >                        i = otndx(onm, tab);
278                          tab->htab[i] = oldhtab[ndx];
279                  }
280          free((void *)oldhtab);

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines