ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/radiance/ray/src/common/rglmat.c
Revision: 3.6
Committed: Fri Nov 14 17:22:06 2003 UTC (20 years, 5 months ago) by schorsch
Content type: text/plain
Branch: MAIN
CVS Tags: rad3R7P2, rad3R7P1, rad4R0, rad3R6, rad3R6P1, rad3R8, rad3R9
Changes since 3.5: +2 -1 lines
Log Message:
Reduced compile warnings, and other compatibility fixes.

File Contents

# User Rev Content
1 gwlarson 3.1 #ifndef lint
2 schorsch 3.6 static const char RCSid[] = "$Id: rglmat.c,v 3.5 2003/09/16 06:31:48 greg Exp $";
3 gwlarson 3.1 #endif
4     /*
5     * Routines for Radiance -> OpenGL materials.
6     */
7    
8 greg 3.3 #include "copyright.h"
9 greg 3.2
10 gwlarson 3.1 #include "radogl.h"
11    
12     int domats = 1; /* are we doing materials? */
13    
14     LUTAB mtab = LU_SINIT(free,freemtl);
15    
16    
17 greg 3.2 void
18 gwlarson 3.1 rgl_matclear() /* clean up materials */
19     {
20     lu_done(&mtab);
21     domats = 1;
22     }
23    
24    
25     MATREC *
26     getmatp(nam) /* find material record for modifier name */
27     char *nam;
28     {
29     register LUENT *lup;
30    
31     if (nam == NULL)
32     return(NULL);
33     if ((lup = lu_find(&mtab, nam)) == NULL)
34     return(NULL);
35     return((MATREC *)lup->data);
36     }
37    
38    
39 greg 3.2 int
40 gwlarson 3.1 o_default(o) /* default object is non-material modifier */
41     register OBJREC *o;
42     {
43     register LUENT *lup;
44     #ifdef DEBUG
45     if (o->otype >= 0 && !ismodifier(o->otype))
46     error(CONSISTENCY, "o_default handed non-modifier");
47     #endif
48     /* find name in lookup table */
49     if ((lup = lu_find(&mtab, o->oname)) == NULL)
50     goto memerr;
51     if (lup->key == NULL) { /* new entry? */
52     lup->key = (char *)malloc(strlen(o->oname)+1);
53     if (lup->key == NULL)
54     goto memerr;
55     strcpy(lup->key, o->oname);
56     } else if (lup->data != NULL)
57 greg 3.5 freemtl(lup->data);
58 gwlarson 3.1 if ((lup->data = o->os) != NULL) /* make material reference */
59     ((MATREC *)lup->data)->nlinks++;
60 greg 3.4 return(0);
61 gwlarson 3.1 memerr:
62     error(SYSTEM, "out of memory in o_default");
63 greg 3.4 return(0);
64     }
65    
66    
67     int
68     o_unsupported(o) /* unsupported object primitive */
69     OBJREC *o;
70     {
71     objerror(o, WARNING, "unsupported type");
72     return(0);
73 gwlarson 3.1 }
74    
75    
76     MATREC *
77     newmaterial(nam) /* get an entry for a new material */
78     char *nam;
79     {
80     register LUENT *lup;
81     /* look it up (assign entry) */
82     if ((lup = lu_find(&mtab, nam)) == NULL)
83     goto memerr;
84     if (lup->key == NULL) { /* new entry? */
85     lup->key = (char *)malloc(strlen(nam)+1);
86     if (lup->key == NULL)
87     goto memerr;
88     strcpy(lup->key, nam);
89     } else if (lup->data != NULL)
90 greg 3.5 freemtl(lup->data);
91 gwlarson 3.1 lup->data = (char *)malloc(sizeof(MATREC));
92     if (lup->data == NULL)
93     goto memerr;
94     ((MATREC *)lup->data)->nlinks = 1;
95     return((MATREC *)lup->data);
96     memerr:
97     error(SYSTEM, "out of memory in newmaterial");
98 schorsch 3.6 return NULL; /* pro forma return */
99 gwlarson 3.1 }
100    
101    
102 greg 3.2 void
103 greg 3.5 freemtl(p) /* free a material */
104     void *p;
105 gwlarson 3.1 {
106 greg 3.5 register MATREC *mp = (MATREC *)p;
107    
108 gwlarson 3.1 if (!--mp->nlinks)
109 greg 3.2 free((void *)mp);
110 gwlarson 3.1 }
111    
112    
113 greg 3.2 int
114 gwlarson 3.1 m_normal(o) /* compute normal material parameters */
115     register OBJREC *o;
116     {
117     register MATREC *m;
118     /* check arguments */
119     if (o->oargs.nfargs != (o->otype == MAT_TRANS ? 7 : 5))
120     objerror(o, USER, "bad # of real arguments");
121     /* allocate/insert material */
122     m = newmaterial(o->oname);
123     /* assign parameters */
124     setcolor(m->u.m.ambdiff, o->oargs.farg[0],
125     o->oargs.farg[1], o->oargs.farg[2]);
126     if ((m->type = o->otype) == MAT_METAL)
127     copycolor(m->u.m.specular, m->u.m.ambdiff);
128     else
129     setcolor(m->u.m.specular, 1., 1., 1.);
130     scalecolor(m->u.m.specular, o->oargs.farg[3]);
131     scalecolor(m->u.m.ambdiff, 1.-o->oargs.farg[3]);
132     if (m->type == MAT_TRANS) {
133     scalecolor(m->u.m.specular, 1.-o->oargs.farg[5]);
134     scalecolor(m->u.m.ambdiff, 1.-o->oargs.farg[5]);
135     }
136     if (o->oargs.farg[4] <= FTINY)
137     m->u.m.specexp = MAXSPECEXP;
138     else
139     m->u.m.specexp = 2./(o->oargs.farg[4]*o->oargs.farg[4]);
140     if (m->u.m.specexp > MAXSPECEXP)
141     m->u.m.specexp = MAXSPECEXP;
142 greg 3.4 return(0);
143 gwlarson 3.1 }
144    
145    
146 greg 3.2 int
147 gwlarson 3.1 m_aniso(o) /* anisotropic material */
148     register OBJREC *o;
149     {
150     register MATREC *m;
151     /* check arguments */
152     if (o->oargs.nfargs < (o->otype == MAT_TRANS2 ? 8 : 6))
153     objerror(o, USER, "bad # of real arguments");
154     /* allocate/insert material */
155     m = newmaterial(o->oname);
156     /* assign parameters */
157     setcolor(m->u.m.ambdiff, o->oargs.farg[0],
158     o->oargs.farg[1], o->oargs.farg[2]);
159     if ((m->type = o->otype) == MAT_METAL2)
160     copycolor(m->u.m.specular, m->u.m.ambdiff);
161     else
162     setcolor(m->u.m.specular, 1., 1., 1.);
163     scalecolor(m->u.m.specular, o->oargs.farg[3]);
164     scalecolor(m->u.m.ambdiff, 1.-o->oargs.farg[3]);
165     if (m->type == MAT_TRANS2) {
166     scalecolor(m->u.m.specular, 1.-o->oargs.farg[6]);
167     scalecolor(m->u.m.ambdiff, 1.-o->oargs.farg[6]);
168     }
169     if (o->oargs.farg[4]*o->oargs.farg[5] <= FTINY*FTINY)
170     m->u.m.specexp = MAXSPECEXP;
171     else
172     m->u.m.specexp = 2./(o->oargs.farg[4]*o->oargs.farg[5]);
173     if (m->u.m.specexp > MAXSPECEXP)
174     m->u.m.specexp = MAXSPECEXP;
175 greg 3.4 return(0);
176 gwlarson 3.1 }
177    
178    
179 greg 3.2 int
180 gwlarson 3.1 m_glass(o) /* glass material (hopeless) */
181     OBJREC *o;
182     {
183     register MATREC *m;
184    
185     m = newmaterial(o->oname);
186     m->type = o->otype;
187     setcolor(m->u.m.ambdiff, 0., 0., 0.);
188     setcolor(m->u.m.specular, .08, .08, .08);
189     m->u.m.specexp = MAXSPECEXP;
190 greg 3.4 return(0);
191 gwlarson 3.1 }
192    
193    
194 greg 3.2 int
195 gwlarson 3.1 m_brdf(o) /* convert functional material */
196     register OBJREC *o;
197     {
198     register MATREC *m;
199     /* check arguments */
200     if (o->oargs.nfargs < (o->otype == MAT_TFUNC ? 6 : 4))
201     objerror(o, USER, "bad # of real arguments");
202     /* allocate/insert material */
203     m = newmaterial(o->oname);
204     /* assign parameters */
205     setcolor(m->u.m.ambdiff, o->oargs.farg[0],
206     o->oargs.farg[1], o->oargs.farg[2]);
207     if ((m->type = o->otype) == MAT_MFUNC)
208     copycolor(m->u.m.specular, m->u.m.ambdiff);
209     else
210     setcolor(m->u.m.specular, 1., 1., 1.);
211     scalecolor(m->u.m.specular, o->oargs.farg[3]);
212     scalecolor(m->u.m.ambdiff, 1.-o->oargs.farg[3]);
213     if (m->type == MAT_TFUNC) {
214     scalecolor(m->u.m.specular, 1.-o->oargs.farg[4]);
215     scalecolor(m->u.m.ambdiff, 1.-o->oargs.farg[4]);
216     }
217     m->u.m.specexp = UNKSPECEXP;
218 greg 3.4 return(0);
219 gwlarson 3.1 }
220    
221    
222 greg 3.2 int
223 gwlarson 3.1 m_brdf2(o) /* convert advanced functional material */
224     register OBJREC *o;
225     {
226     register MATREC *m;
227    
228     if (o->oargs.nfargs < 9)
229     objerror(o, USER, "bad # of real arguments");
230     m = newmaterial(o->oname);
231     m->type = o->otype;
232     /* assign average diffuse front+back */
233     setcolor(m->u.m.ambdiff, (o->oargs.farg[0]+o->oargs.farg[3])*.5,
234     (o->oargs.farg[1]+o->oargs.farg[4])*.5,
235     (o->oargs.farg[2]+o->oargs.farg[5])*.5);
236     /* guess the rest */
237     setcolor(m->u.m.specular, .1, .1, .1);
238     m->u.m.specexp = UNKSPECEXP;
239 greg 3.4 return(0);
240 gwlarson 3.1 }
241    
242    
243 greg 3.2 int
244 gwlarson 3.1 m_light(o) /* convert light type */
245     register OBJREC *o;
246     {
247     FVECT v;
248     register MATREC *m;
249    
250     if (o->oargs.nfargs < (o->otype == MAT_SPOT ? 7 : 3))
251     objerror(o, USER, "bad # of real arguments");
252     m = newmaterial(o->oname);
253     setcolor(m->u.l.emission, o->oargs.farg[0],
254     o->oargs.farg[1], o->oargs.farg[2]);
255     if ((m->type = o->otype) == MAT_SPOT) {
256     if ((m->u.l.spotang = o->oargs.farg[3]/2.) > 90.)
257     m->u.l.spotang = 180.;
258     v[0] = o->oargs.farg[4];
259     v[1] = o->oargs.farg[5];
260     v[2] = o->oargs.farg[6];
261     if (normalize(v) == 0.)
262     objerror(o, USER, "illegal direction");
263     VCOPY(m->u.l.spotdir, v);
264     } else {
265     m->u.l.spotang = 180.;
266     m->u.l.spotdir[0] = m->u.l.spotdir[1] = 0.;
267     m->u.l.spotdir[2] = -1.;
268     }
269 greg 3.4 return(0);
270 gwlarson 3.1 }
271    
272    
273 greg 3.2 int
274 gwlarson 3.1 m_mirror(o) /* convert mirror type */
275     register OBJREC *o;
276     {
277     register MATREC *m;
278    
279     if (o->oargs.nfargs != 3)
280     objerror(o, USER, "bad # real arguments");
281     m = newmaterial(o->oname);
282     m->type = o->otype;
283     setcolor(m->u.m.ambdiff, 0., 0., 0.);
284     setcolor(m->u.m.specular, o->oargs.farg[0],
285     o->oargs.farg[1], o->oargs.farg[2]);
286     m->u.m.specexp = MAXSPECEXP;
287 greg 3.4 return(0);
288 gwlarson 3.1 }
289    
290    
291 greg 3.2 int
292 gwlarson 3.1 m_prism(o) /* convert prism type */
293     register OBJREC *o;
294     {
295     register MATREC *m;
296     /* can't really deal with this type */
297     m = newmaterial(o->oname);
298     m->type = o->otype;
299     setcolor(m->u.m.ambdiff, 0.2, 0.2, 0.2);
300     setcolor(m->u.m.specular, 0.1, 0.1, 0.1);
301     m->u.m.specexp = UNKSPECEXP;
302 greg 3.4 return(0);
303 gwlarson 3.1 }