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.12 by greg, Wed Jul 14 02:37:23 2004 UTC vs.
Revision 2.18 by greg, Sat Oct 17 16:39:23 2020 UTC

# Line 25 | Line 25 | static int  otndx(char *, struct ohtab *);
25  
26  
27   OBJECT
28 < objndx(op)                      /* get object number from pointer */
29 < register OBJREC  *op;
28 > objndx(                         /* get object number from pointer */
29 >        OBJREC  *op
30 > )
31   {
32 <        register int  i, j;
32 >        int  i, j;
33  
34          for (i = nobjects>>OBJBLKSHFT; i >= 0; i--) {
35                  j = op - objblock[i];
# Line 40 | Line 41 | register OBJREC  *op;
41  
42  
43   OBJECT
44 < lastmod(obj, mname)             /* find modifier definition before obj */
45 < OBJECT  obj;
46 < char  *mname;
44 > lastmod(                        /* find modifier definition before obj */
45 >        OBJECT  obj,
46 >        char  *mname
47 > )
48   {
49 <        register OBJREC  *op;
50 <        register int  i;
49 >        OBJREC  *op;
50 >        int  i;
51  
52          i = modifier(mname);            /* try hash table first */
53          if ((obj == OVOID) | (i < obj))
54                  return(i);
55          for (i = obj; i-- > 0; ) {      /* need to search */
56                  op = objptr(i);
57 <                if (ismodifier(op->otype) && !strcmp(op->oname, mname))
57 >                if (ismodifier(op->otype) && op->oname[0] == mname[0] &&
58 >                                        !strcmp(op->oname, mname))
59                          return(i);
60          }
61          return(OVOID);
# Line 60 | Line 63 | char  *mname;
63  
64  
65   OBJECT
66 < modifier(mname)                 /* get a modifier number from its name */
67 < char  *mname;
66 > modifier(                       /* get a modifier number from its name */
67 >        char  *mname
68 > )
69   {
70 <        register int  ndx;
70 >        int  ndx;
71  
72          ndx = otndx(mname, &modtab);
73          return(modtab.htab[ndx]);
# Line 72 | Line 76 | char  *mname;
76  
77   #ifdef  GETOBJ
78   OBJECT
79 < object(oname)                   /* get an object number from its name */
80 < char  *oname;
79 > object(                         /* get an object number from its name */
80 >        char  *oname
81 > )
82   {
83 <        register int  ndx;
83 >        int  ndx;
84  
85          ndx = otndx(oname, &objtab);
86          return(objtab.htab[ndx]);
# Line 83 | Line 88 | char  *oname;
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(obj)               /* insert new object into our list */
169 < register OBJECT  obj;
168 > insertobject(                   /* insert new object into our list */
169 >        OBJECT  obj
170 > )
171   {
172 <        register int  i;
172 >        int  i;
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 105 | Line 189 | register OBJECT  obj;
189  
190  
191   void
192 < clearobjndx()                   /* 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  
219   static int
220 < nexthsiz(oldsiz)                /* return next hash table size */
221 < int  oldsiz;
220 > nexthsiz(                       /* return next hash table size */
221 >        int  oldsiz
222 > )
223   {
224          static int  hsiztab[] = {
225                  251, 509, 1021, 2039, 4093, 8191, 16381, 0
226          };
227 <        register int  *hsp;
227 >        int  *hsp;
228  
229          for (hsp = hsiztab; *hsp; hsp++)
230                  if (*hsp > oldsiz)
# Line 137 | Line 234 | int  oldsiz;
234  
235  
236   static int
237 < otndx(name, tab)                /* get object table index for name */
238 < char  *name;
239 < register struct ohtab  *tab;
237 > otndx(                          /* get object table index for name */
238 >        char  *name,
239 >        struct ohtab  *tab
240 > )
241   {
242          OBJECT  *oldhtab;
243          int  hval, i;
244 <        register int  ndx;
244 >        int  ndx;
245  
246          if (tab->htab == NULL) {                /* new table */
247                  tab->hsiz = nexthsiz(tab->hsiz);

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines