ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/radiance/ray/src/cv/mgflib/context.c
Revision: 1.4
Committed: Fri Jun 24 09:32:49 1994 UTC (29 years, 10 months ago) by greg
Content type: text/plain
Branch: MAIN
Changes since 1.3: +6 -0 lines
Log Message:
added prism entity and minor changes

File Contents

# Content
1 /* Copyright (c) 1994 Regents of the University of California */
2
3 #ifndef lint
4 static char SCCSid[] = "$SunId$ LBL";
5 #endif
6
7 /*
8 * Context handlers
9 */
10
11 #include <stdio.h>
12 #include <math.h>
13 #include <string.h>
14 #include "parser.h"
15 #include "lookup.h"
16
17 /* default context values */
18 static C_COLOR c_dfcolor = C_DEFCOLOR;
19 static C_MATERIAL c_dfmaterial = C_DEFMATERIAL;
20 static C_VERTEX c_dfvertex = C_DEFVERTEX;
21
22 /* the unnamed contexts */
23 static C_COLOR c_uncolor = C_DEFCOLOR;
24 static C_MATERIAL c_unmaterial = C_DEFMATERIAL;
25 static C_VERTEX c_unvertex = C_DEFVERTEX;
26
27 /* the current contexts */
28 C_COLOR *c_ccolor = &c_uncolor;
29 C_MATERIAL *c_cmaterial = &c_unmaterial;
30 C_VERTEX *c_cvertex = &c_unvertex;
31
32 static LUTAB clr_tab = LU_SINIT(free,free); /* color lookup table */
33 static LUTAB mat_tab = LU_SINIT(free,free); /* material lookup table */
34 static LUTAB vtx_tab = LU_SINIT(free,free); /* vertex lookup table */
35
36
37 int
38 c_hcolor(ac, av) /* handle color entity */
39 int ac;
40 register char **av;
41 {
42 register LUENT *lp;
43
44 switch (mg_entity(av[0])) {
45 case MG_E_COLOR: /* get/set color context */
46 if (ac > 4)
47 return(MG_EARGC);
48 if (ac == 1) { /* set unnamed color context */
49 c_uncolor = c_dfcolor;
50 c_ccolor = &c_uncolor;
51 return(MG_OK);
52 }
53 lp = lu_find(&clr_tab, av[1]); /* lookup context */
54 if (lp == NULL)
55 return(MG_EMEM);
56 if (ac == 2) { /* reestablish previous context */
57 if (lp->data == NULL)
58 return(MG_EUNDEF);
59 c_ccolor = (C_COLOR *)lp->data;
60 return(MG_OK);
61 }
62 if (av[2][0] != '=' || av[2][1])
63 return(MG_ETYPE);
64 if (lp->key == NULL) { /* create new color context */
65 lp->key = (char *)malloc(strlen(av[1])+1);
66 if (lp->key == NULL)
67 return(MG_EMEM);
68 strcpy(lp->key, av[1]);
69 lp->data = (char *)malloc(sizeof(C_COLOR));
70 if (lp->data == NULL)
71 return(MG_EMEM);
72 }
73 c_ccolor = (C_COLOR *)lp->data;
74 if (ac == 3) { /* use default template */
75 *c_ccolor = c_dfcolor;
76 return(MG_OK);
77 }
78 lp = lu_find(&clr_tab, av[3]); /* lookup template */
79 if (lp == NULL)
80 return(MG_EMEM);
81 if (lp->data == NULL)
82 return(MG_EUNDEF);
83 *c_ccolor = *(C_COLOR *)lp->data;
84 if (ac > 4)
85 return(MG_EARGC);
86 return(MG_OK);
87 case MG_E_CXY: /* assign CIE XY value */
88 if (ac != 3)
89 return(MG_EARGC);
90 if (!isflt(av[1]) || !isflt(av[2]))
91 return(MG_ETYPE);
92 c_ccolor->cx = atof(av[1]);
93 c_ccolor->cy = atof(av[2]);
94 if (c_ccolor->cx < 0. | c_ccolor->cy < 0. |
95 c_ccolor->cx + c_ccolor->cy > 1.)
96 return(MG_EILL);
97 return(MG_OK);
98 }
99 return(MG_EUNK);
100 }
101
102
103 int
104 c_hmaterial(ac, av) /* handle material entity */
105 int ac;
106 register char **av;
107 {
108 register LUENT *lp;
109
110 switch (mg_entity(av[0])) {
111 case MG_E_MATERIAL: /* get/set material context */
112 if (ac > 4)
113 return(MG_EARGC);
114 if (ac == 1) { /* set unnamed material context */
115 c_unmaterial = c_dfmaterial;
116 c_cmaterial = &c_unmaterial;
117 return(MG_OK);
118 }
119 lp = lu_find(&mat_tab, av[1]); /* lookup context */
120 if (lp == NULL)
121 return(MG_EMEM);
122 if (ac == 2) { /* reestablish previous context */
123 if (lp->data == NULL)
124 return(MG_EUNDEF);
125 c_cmaterial = (C_MATERIAL *)lp->data;
126 return(MG_OK);
127 }
128 if (av[2][0] != '=' || av[2][1])
129 return(MG_ETYPE);
130 if (lp->key == NULL) { /* create new material context */
131 lp->key = (char *)malloc(strlen(av[1])+1);
132 if (lp->key == NULL)
133 return(MG_EMEM);
134 strcpy(lp->key, av[1]);
135 lp->data = (char *)malloc(sizeof(C_MATERIAL));
136 if (lp->data == NULL)
137 return(MG_EMEM);
138 }
139 c_cmaterial = (C_MATERIAL *)lp->data;
140 if (ac == 3) { /* use default template */
141 *c_cmaterial = c_dfmaterial;
142 c_cmaterial->name = lp->key;
143 return(MG_OK);
144 }
145 lp = lu_find(&mat_tab, av[3]); /* lookup template */
146 if (lp == NULL)
147 return(MG_EMEM);
148 if (lp->data == NULL)
149 return(MG_EUNDEF);
150 *c_cmaterial = *(C_MATERIAL *)lp->data;
151 c_cmaterial->name = lp->key;
152 c_cmaterial->clock = 1;
153 if (ac > 4)
154 return(MG_EARGC);
155 return(MG_OK);
156 case MG_E_RD: /* set diffuse reflectance */
157 if (ac != 2)
158 return(MG_EARGC);
159 if (!isflt(av[1]))
160 return(MG_ETYPE);
161 c_cmaterial->rd = atof(av[1]);
162 if (c_cmaterial->rd < 0. | c_cmaterial->rd > 1.)
163 return(MG_EILL);
164 c_cmaterial->rd_c = *c_ccolor;
165 c_cmaterial->clock++;
166 return(MG_OK);
167 case MG_E_ED: /* set diffuse emittance */
168 if (ac != 2)
169 return(MG_EARGC);
170 if (!isflt(av[1]))
171 return(MG_ETYPE);
172 c_cmaterial->ed = atof(av[1]);
173 if (c_cmaterial->ed < 0.)
174 return(MG_EILL);
175 c_cmaterial->ed_c = *c_ccolor;
176 c_cmaterial->clock++;
177 return(MG_OK);
178 case MG_E_TD: /* set diffuse transmittance */
179 if (ac != 2)
180 return(MG_EARGC);
181 if (!isflt(av[1]))
182 return(MG_ETYPE);
183 c_cmaterial->td = atof(av[1]);
184 if (c_cmaterial->td < 0. | c_cmaterial->td > 1.)
185 return(MG_EILL);
186 c_cmaterial->td_c = *c_ccolor;
187 return(MG_OK);
188 case MG_E_RS: /* set specular reflectance */
189 if (ac != 3)
190 return(MG_EARGC);
191 if (!isflt(av[1]) || !isflt(av[2]))
192 return(MG_ETYPE);
193 c_cmaterial->rs = atof(av[1]);
194 c_cmaterial->rs_a = atof(av[2]);
195 if (c_cmaterial->rs < 0. | c_cmaterial->rs > 1. |
196 c_cmaterial->rs_a < 0.)
197 return(MG_EILL);
198 c_cmaterial->rs_c = *c_ccolor;
199 c_cmaterial->clock++;
200 return(MG_OK);
201 case MG_E_TS: /* set specular transmittance */
202 if (ac != 3)
203 return(MG_EARGC);
204 if (!isflt(av[1]) || !isflt(av[2]))
205 return(MG_ETYPE);
206 c_cmaterial->ts = atof(av[1]);
207 c_cmaterial->ts_a = atof(av[2]);
208 if (c_cmaterial->ts < 0. | c_cmaterial->ts > 1. |
209 c_cmaterial->ts_a < 0.)
210 return(MG_EILL);
211 c_cmaterial->ts_c = *c_ccolor;
212 c_cmaterial->clock++;
213 return(MG_OK);
214 }
215 return(MG_EUNK);
216 }
217
218
219 int
220 c_hvertex(ac, av) /* handle a vertex entity */
221 int ac;
222 register char **av;
223 {
224 register LUENT *lp;
225
226 switch (mg_entity(av[0])) {
227 case MG_E_VERTEX: /* get/set vertex context */
228 if (ac > 4)
229 return(MG_EARGC);
230 if (ac == 1) { /* set unnamed vertex context */
231 c_unvertex = c_dfvertex;
232 c_cvertex = &c_unvertex;
233 return(MG_OK);
234 }
235 lp = lu_find(&vtx_tab, av[1]); /* lookup context */
236 if (lp == NULL)
237 return(MG_EMEM);
238 if (ac == 2) { /* reestablish previous context */
239 if (lp->data == NULL)
240 return(MG_EUNDEF);
241 c_cvertex = (C_VERTEX *)lp->data;
242 return(MG_OK);
243 }
244 if (av[2][0] != '=' || av[2][1])
245 return(MG_ETYPE);
246 if (lp->key == NULL) { /* create new vertex context */
247 lp->key = (char *)malloc(strlen(av[1])+1);
248 if (lp->key == NULL)
249 return(MG_EMEM);
250 strcpy(lp->key, av[1]);
251 lp->data = (char *)malloc(sizeof(C_VERTEX));
252 if (lp->data == NULL)
253 return(MG_EMEM);
254 }
255 c_cvertex = (C_VERTEX *)lp->data;
256 if (ac == 3) { /* use default template */
257 *c_cvertex = c_dfvertex;
258 return(MG_OK);
259 }
260 lp = lu_find(&vtx_tab, av[3]); /* lookup template */
261 if (lp == NULL)
262 return(MG_EMEM);
263 if (lp->data == NULL)
264 return(MG_EUNDEF);
265 *c_cvertex = *(C_VERTEX *)lp->data;
266 if (ac > 4)
267 return(MG_EARGC);
268 return(MG_OK);
269 case MG_E_POINT: /* set point */
270 if (ac != 4)
271 return(MG_EARGC);
272 if (!isflt(av[1]) || !isflt(av[2]) || !isflt(av[3]))
273 return(MG_ETYPE);
274 c_cvertex->p[0] = atof(av[1]);
275 c_cvertex->p[1] = atof(av[2]);
276 c_cvertex->p[2] = atof(av[3]);
277 return(MG_OK);
278 case MG_E_NORMAL: /* set normal */
279 if (ac != 4)
280 return(MG_EARGC);
281 if (!isflt(av[1]) || !isflt(av[2]) || !isflt(av[3]))
282 return(MG_ETYPE);
283 c_cvertex->n[0] = atof(av[1]);
284 c_cvertex->n[1] = atof(av[2]);
285 c_cvertex->n[2] = atof(av[3]);
286 (void)normalize(c_cvertex->n);
287 return(MG_OK);
288 }
289 return(MG_EUNK);
290 }
291
292
293 void
294 c_clearall() /* empty context tables */
295 {
296 c_uncolor = c_dfcolor;
297 c_ccolor = &c_uncolor;
298 lu_done(&clr_tab);
299 c_unmaterial = c_dfmaterial;
300 c_cmaterial = &c_unmaterial;
301 lu_done(&mat_tab);
302 c_unvertex = c_dfvertex;
303 c_cvertex = &c_unvertex;
304 lu_done(&vtx_tab);
305 }
306
307
308 C_VERTEX *
309 c_getvert(name) /* get a named vertex */
310 char *name;
311 {
312 register LUENT *lp;
313
314 if ((lp = lu_find(&vtx_tab, name)) == NULL)
315 return(NULL);
316 return((C_VERTEX *)lp->data);
317 }