9 |
|
*/ |
10 |
|
|
11 |
|
#include <stdio.h> |
12 |
+ |
#include <math.h> |
13 |
|
#include <string.h> |
14 |
|
#include "parser.h" |
15 |
|
#include "lookup.h" |
29 |
|
C_MATERIAL *c_cmaterial = &c_unmaterial; |
30 |
|
C_VERTEX *c_cvertex = &c_unvertex; |
31 |
|
|
32 |
< |
static LUTAB clr_tab; /* color lookup table */ |
33 |
< |
static LUTAB mat_tab; /* material lookup table */ |
34 |
< |
static LUTAB vtx_tab; /* vertex lookup table */ |
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 |
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; |
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; |
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 */ |
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); |
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) |
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) |
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) |
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); |
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; |
290 |
|
} |
291 |
|
|
292 |
|
|
279 |
– |
static void |
280 |
– |
freectx(lp) /* free a context table entry */ |
281 |
– |
register LUENT *lp; |
282 |
– |
{ |
283 |
– |
free((MEM_PTR)lp->key); |
284 |
– |
free((MEM_PTR)lp->data); |
285 |
– |
} |
286 |
– |
|
287 |
– |
|
293 |
|
void |
294 |
|
c_clearall() /* empty context tables */ |
295 |
|
{ |
296 |
|
c_uncolor = c_dfcolor; |
297 |
|
c_ccolor = &c_uncolor; |
298 |
< |
lu_done(&clr_tab, freectx); |
298 |
> |
lu_done(&clr_tab); |
299 |
|
c_unmaterial = c_dfmaterial; |
300 |
|
c_cmaterial = &c_unmaterial; |
301 |
< |
lu_done(&mat_tab, freectx); |
301 |
> |
lu_done(&mat_tab); |
302 |
|
c_unvertex = c_dfvertex; |
303 |
|
c_cvertex = &c_unvertex; |
304 |
< |
lu_done(&vtx_tab, freectx); |
304 |
> |
lu_done(&vtx_tab); |
305 |
|
} |
306 |
|
|
307 |
|
|