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, 4 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

# Content
1 #ifndef lint
2 static const char RCSid[] = "$Id: rglmat.c,v 3.5 2003/09/16 06:31:48 greg Exp $";
3 #endif
4 /*
5 * Routines for Radiance -> OpenGL materials.
6 */
7
8 #include "copyright.h"
9
10 #include "radogl.h"
11
12 int domats = 1; /* are we doing materials? */
13
14 LUTAB mtab = LU_SINIT(free,freemtl);
15
16
17 void
18 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 int
40 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 freemtl(lup->data);
58 if ((lup->data = o->os) != NULL) /* make material reference */
59 ((MATREC *)lup->data)->nlinks++;
60 return(0);
61 memerr:
62 error(SYSTEM, "out of memory in o_default");
63 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 }
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 freemtl(lup->data);
91 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 return NULL; /* pro forma return */
99 }
100
101
102 void
103 freemtl(p) /* free a material */
104 void *p;
105 {
106 register MATREC *mp = (MATREC *)p;
107
108 if (!--mp->nlinks)
109 free((void *)mp);
110 }
111
112
113 int
114 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 return(0);
143 }
144
145
146 int
147 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 return(0);
176 }
177
178
179 int
180 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 return(0);
191 }
192
193
194 int
195 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 return(0);
219 }
220
221
222 int
223 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 return(0);
240 }
241
242
243 int
244 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 return(0);
270 }
271
272
273 int
274 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 return(0);
288 }
289
290
291 int
292 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 return(0);
303 }