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.14 by greg, Sun Dec 8 18:59:53 2013 UTC vs.
Revision 2.17 by greg, Mon Dec 9 18:17:13 2013 UTC

# Line 88 | Line 88 | object(                                /* get an object number from its name */
88   #endif
89  
90  
91 < static int
91 > int
92   eqreal(                         /* are two real values close enough to equal? */
93          double  d1,
94          double  d2
# 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 <        if (obj1 == OVOID)
113 <                return(obj2 == OVOID);
114 <        if (obj2 == OVOID)
115 <                return(0);
116 <        op1 = objptr(obj1);
117 <        op2 = objptr(obj2);
118 <        if (op1->omod != op2->omod)
119 <                return(0);
120 <        if (op1->otype != op2->otype)
121 <                return(0);
122 <        if (strcmp(op1->oname, op2->oname))
123 <                return(0);
124 <        if (op1->oargs.nsargs != op2->oargs.nsargs)
125 <                return(0);
126 <        if (op1->oargs.nfargs != op2->oargs.nfargs)
127 <                return(0);
128 < #ifdef IARGS
129 <        if (op1->oargs.niargs != op2->oargs.niargs)
130 <                return(0);
131 <        for (i = op1->oargs.niargs; i-- > 0; )
132 <                if (op1->oargs.iarg[i] != op2->oargs.iarg[i])
112 >        while (obj1 != obj2) {
113 >                if (obj1 == OVOID)
114                          return(0);
115 < #endif
135 <        for (i = op1->oargs.nfargs; i-- > 0; )
136 <                if (!eqreal(op1->oargs.farg[i], op2->oargs.farg[i]))
115 >                if (obj2 == OVOID)
116                          return(0);
117 <        for (i = op1->oargs.nsargs; i-- > 0; )
118 <                if (strcmp(op1->oargs.sarg[i], op2->oargs.sarg[i]))
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  
# 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

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines