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.7 by greg, Sat Feb 22 02:07:22 2003 UTC vs.
Revision 2.16 by greg, Mon Dec 9 17:57:44 2013 UTC

# Line 1 | Line 1
1   #ifndef lint
2 < static const char       RCSid[] = "$Id$";
2 > static const char RCSid[] = "$Id$";
3   #endif
4   /*
5   *  Routines for tracking object modifiers
# Line 7 | Line 7 | static const char      RCSid[] = "$Id$";
7   *  External symbols declared in object.h
8   */
9  
10 < /* ====================================================================
11 < * The Radiance Software License, Version 1.0
12 < *
13 < * Copyright (c) 1990 - 2002 The Regents of the University of California,
14 < * through Lawrence Berkeley National Laboratory.   All rights reserved.
15 < *
16 < * Redistribution and use in source and binary forms, with or without
17 < * modification, are permitted provided that the following conditions
18 < * are met:
19 < *
20 < * 1. Redistributions of source code must retain the above copyright
21 < *         notice, this list of conditions and the following disclaimer.
22 < *
23 < * 2. Redistributions in binary form must reproduce the above copyright
24 < *       notice, this list of conditions and the following disclaimer in
25 < *       the documentation and/or other materials provided with the
26 < *       distribution.
27 < *
28 < * 3. The end-user documentation included with the redistribution,
29 < *           if any, must include the following acknowledgment:
30 < *             "This product includes Radiance software
31 < *                 (http://radsite.lbl.gov/)
32 < *                 developed by the Lawrence Berkeley National Laboratory
33 < *               (http://www.lbl.gov/)."
34 < *       Alternately, this acknowledgment may appear in the software itself,
35 < *       if and wherever such third-party acknowledgments normally appear.
36 < *
37 < * 4. The names "Radiance," "Lawrence Berkeley National Laboratory"
38 < *       and "The Regents of the University of California" must
39 < *       not be used to endorse or promote products derived from this
40 < *       software without prior written permission. For written
41 < *       permission, please contact [email protected].
42 < *
43 < * 5. Products derived from this software may not be called "Radiance",
44 < *       nor may "Radiance" appear in their name, without prior written
45 < *       permission of Lawrence Berkeley National Laboratory.
46 < *
47 < * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
48 < * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
49 < * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
50 < * DISCLAIMED.   IN NO EVENT SHALL Lawrence Berkeley National Laboratory OR
51 < * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
52 < * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
53 < * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
54 < * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
55 < * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
56 < * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
57 < * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
58 < * SUCH DAMAGE.
59 < * ====================================================================
60 < *
61 < * This software consists of voluntary contributions made by many
62 < * individuals on behalf of Lawrence Berkeley National Laboratory.   For more
63 < * information on Lawrence Berkeley National Laboratory, please see
64 < * <http://www.lbl.gov/>.
65 < */
10 > #include "copyright.h"
11  
12   #include  "standard.h"
13  
# Line 76 | Line 21 | static struct ohtab {
21          OBJECT  *htab;                  /* table, if allocated */
22   }  modtab = {100, NULL}, objtab = {1000, NULL}; /* modifiers and objects */
23  
24 < static int  otndx();
24 > static int  otndx(char *, struct ohtab *);
25  
26  
27 < int
28 < objndx(op)                      /* get object number from pointer */
29 < register OBJREC  *op;
27 > OBJECT
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];
36 <                if (j >= 0 && j < OBJBLKSIZ)
36 >                if ((j >= 0) & (j < OBJBLKSIZ))
37                          return((i<<OBJBLKSHFT) + j);
38          }
39          return(OVOID);
40   }
41  
42  
43 < int
44 < lastmod(obj, mname)             /* find modifier definition before obj */
45 < OBJECT  obj;
46 < char  *mname;
43 > OBJECT
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 (i < obj)
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);
62   }
63  
64  
65 < int
66 < modifier(mname)                 /* get a modifier number from its name */
67 < char  *mname;
65 > OBJECT
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 126 | Line 75 | char  *mname;
75  
76  
77   #ifdef  GETOBJ
78 < int
79 < object(oname)                   /* get an object number from its name */
80 < char  *oname;
78 > OBJECT
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 138 | 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;
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 +                for (i = op1->oargs.nsargs; i-- > 0; )
136 +                        if (strcmp(op1->oargs.sarg[i], op2->oargs.sarg[i]))
137 +                                return(0);
138 +                i = 0;
139 +                switch (op1->otype) {   /* special cases (KEEP CONSISTENT!) */
140 +                case MOD_ALIAS:
141 +                case MAT_ILLUM:
142 +                case MAT_MIRROR:
143 +                        i = (op1->oargs.nsargs > 0);
144 +                        break;
145 +                case MIX_FUNC:
146 +                case MIX_DATA:
147 +                case MIX_TEXT:
148 +                case MIX_PICT:
149 +                        i = 2*(op1->oargs.nsargs >= 2);
150 +                        break;
151 +                case MAT_CLIP:
152 +                        i = op1->oargs.nsargs;
153 +                        break;
154 +                }
155 +                while (i-- > 0)         /* check modifier references */
156 +                        if (!eqobjects( lastmod(obj1, op1->oargs.sarg[i]),
157 +                                        lastmod(obj2, op2->oargs.sarg[i]) ))
158 +                                return(0);
159 +                obj1 = op1->omod;
160 +                obj2 = op2->omod;
161 +        }
162 +        return(1);
163 + }
164 +
165 +
166   void
167 < insertobject(obj)               /* insert new object into our list */
168 < register OBJECT  obj;
167 > insertobject(                   /* insert new object into our list */
168 >        OBJECT  obj
169 > )
170   {
171 <        register int  i;
171 >        int  i;
172  
173          if (ismodifier(objptr(obj)->otype)) {
174                  i = otndx(objptr(obj)->oname, &modtab);
175 +                if (eqobjects(obj, modtab.htab[i]))
176 +                        return; /* don't index if same as earlier def. */
177                  modtab.htab[i] = obj;
178          }
179   #ifdef  GETOBJ
# Line 160 | Line 188 | register OBJECT  obj;
188  
189  
190   void
191 < clearobjndx()                   /* clear object hash tables */
191 > clearobjndx(void)               /* clear object hash tables */
192   {
193          if (modtab.htab != NULL) {
194                  free((void *)modtab.htab);
# Line 176 | Line 204 | clearobjndx()                  /* clear object hash tables */
204  
205  
206   static int
207 < nexthsiz(oldsiz)                /* return next hash table size */
208 < int  oldsiz;
207 > nexthsiz(                       /* return next hash table size */
208 >        int  oldsiz
209 > )
210   {
211          static int  hsiztab[] = {
212                  251, 509, 1021, 2039, 4093, 8191, 16381, 0
213          };
214 <        register int  *hsp;
214 >        int  *hsp;
215  
216          for (hsp = hsiztab; *hsp; hsp++)
217                  if (*hsp > oldsiz)
# Line 192 | Line 221 | int  oldsiz;
221  
222  
223   static int
224 < otndx(name, tab)                /* get object table index for name */
225 < char  *name;
226 < register struct ohtab  *tab;
224 > otndx(                          /* get object table index for name */
225 >        char  *name,
226 >        struct ohtab  *tab
227 > )
228   {
229          OBJECT  *oldhtab;
230          int  hval, i;
231 <        register int  ndx;
231 >        int  ndx;
232  
233          if (tab->htab == NULL) {                /* new table */
234                  tab->hsiz = nexthsiz(tab->hsiz);
# Line 213 | Line 243 | register struct ohtab  *tab;
243          hval = shash(name);
244   tryagain:
245          for (i = 0; i < tab->hsiz; i++) {
246 <                ndx = (hval + i*i) % tab->hsiz;
246 >                ndx = (hval + (unsigned long)i*i) % tab->hsiz;
247                  if (tab->htab[ndx] == OVOID ||
248                                  !strcmp(objptr(tab->htab[ndx])->oname, name))
249                          return(ndx);

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines