40 |
|
extern int o_cone(); |
41 |
|
extern int o_cylinder(); |
42 |
|
extern int o_ring(); |
43 |
+ |
extern int m_glow(); |
44 |
+ |
extern int m_spot(); |
45 |
|
extern int m_dielectric(); |
46 |
|
extern int m_interface(); |
47 |
|
extern int text(); |
62 |
|
{ "instance", addxform }, |
63 |
|
{ "alias", alias }, |
64 |
|
{ "antimatter", passargs }, |
65 |
+ |
{ "glow", m_glow }, |
66 |
+ |
{ "spotlight", m_spot }, |
67 |
|
{ "dielectric", m_dielectric }, |
68 |
|
{ "interface", m_interface }, |
69 |
|
{ "colortext", text }, |
80 |
|
{ "mixtext", text }, |
81 |
|
{ "light", passargs }, |
82 |
|
{ "illum", passargs }, |
79 |
– |
{ "glow", passargs }, |
83 |
|
{ "plastic", passargs }, |
84 |
|
{ "metal", passargs }, |
85 |
|
{ "trans", passargs }, |
113 |
|
FILE *fopen(); |
114 |
|
FILE *fp; |
115 |
|
int a; |
116 |
+ |
/* check for array */ |
117 |
+ |
for (a = 1; a < argc; a++) |
118 |
+ |
if (!strcmp(argv[a], "-a")) |
119 |
+ |
return(doarray(argc, argv, a)); |
120 |
|
|
114 |
– |
xav = argv; |
115 |
– |
|
121 |
|
for (a = 1; a < argc; a++) { |
122 |
|
if (argv[a][0] == '-') |
123 |
|
switch (argv[a][1]) { |
124 |
|
case 'n': |
125 |
+ |
if (argv[a][2] || a+1 >= argc) |
126 |
+ |
break; |
127 |
|
idprefix = argv[++a]; |
128 |
|
continue; |
129 |
|
case 'e': |
130 |
+ |
if (argv[a][2]) |
131 |
+ |
break; |
132 |
|
expand = 1; |
133 |
|
continue; |
134 |
|
} |
135 |
|
break; |
136 |
|
} |
137 |
|
|
138 |
+ |
xav = argv; |
139 |
|
xfa = a; |
140 |
|
|
141 |
|
totscale = 1.0; |
146 |
|
if (reverse = totscale < 0.0) |
147 |
|
totscale = -totscale; |
148 |
|
|
149 |
+ |
if (a < argc && argv[a][0] == '-') { |
150 |
+ |
fprintf(stderr, "%s: command line error at '%s'\n", |
151 |
+ |
argv[0], argv[a]); |
152 |
+ |
exit(1); |
153 |
+ |
} |
154 |
|
xac = a; |
155 |
|
|
156 |
|
putchar('#'); /* simple header */ |
171 |
|
fclose(fp); |
172 |
|
} |
173 |
|
|
174 |
< |
exit(0); |
174 |
> |
return(0); |
175 |
|
} |
176 |
|
|
177 |
|
|
178 |
+ |
doarray(ac, av, ai) /* make array */ |
179 |
+ |
char **av; |
180 |
+ |
int ac, ai; |
181 |
+ |
{ |
182 |
+ |
char *newav[256], **avp; |
183 |
+ |
char newid[128], repts[32]; |
184 |
+ |
char *oldid = NULL; |
185 |
+ |
int i, err; |
186 |
+ |
|
187 |
+ |
avp = newav+2; |
188 |
+ |
avp[0] = av[0]; |
189 |
+ |
for (i = 1; i < ac; i++) |
190 |
+ |
if (!strcmp(av[i-1], "-n")) { |
191 |
+ |
oldid = av[i]; |
192 |
+ |
avp[i] = newid; |
193 |
+ |
} else |
194 |
+ |
avp[i] = av[i]; |
195 |
+ |
avp[ai] = "-i"; |
196 |
+ |
avp[ai+1] = repts; |
197 |
+ |
avp[i] = NULL; |
198 |
+ |
if (oldid == NULL) { |
199 |
+ |
newav[0] = av[0]; |
200 |
+ |
newav[1] = "-n"; |
201 |
+ |
newav[2] = newid; |
202 |
+ |
avp = newav; |
203 |
+ |
ac += 2; |
204 |
+ |
} |
205 |
+ |
err = 0; |
206 |
+ |
for (i = 0; i < atoi(av[ai+1]); i++) { |
207 |
+ |
if (oldid == NULL) |
208 |
+ |
sprintf(newid, "a%d", i); |
209 |
+ |
else |
210 |
+ |
sprintf(newid, "%s.%d", oldid, i); |
211 |
+ |
sprintf(repts, "%d", i); |
212 |
+ |
err |= main(ac, avp); |
213 |
+ |
} |
214 |
+ |
return(err); |
215 |
+ |
} |
216 |
+ |
|
217 |
+ |
|
218 |
|
xform(name, fin) /* transform stream by totxform */ |
219 |
|
char *name; |
220 |
|
register FILE *fin; |
233 |
|
} while (c != '\n'); |
234 |
|
} else if (c == '!') { /* command */ |
235 |
|
ungetc(c, fin); |
236 |
< |
if (expand) |
182 |
< |
xfcomm(name, fin); |
183 |
< |
else { |
184 |
< |
putchar('\n'); |
185 |
< |
while ((c = getc(fin)) != EOF && c != '\n') |
186 |
< |
putchar(c); |
187 |
< |
printf(" |"); |
188 |
< |
for (c = 0; c < xac; c++) |
189 |
< |
printf(" %s", xav[c]); |
190 |
< |
putchar('\n'); |
191 |
< |
} |
236 |
> |
xfcomm(name, fin); |
237 |
|
} else { /* object */ |
238 |
|
ungetc(c, fin); |
239 |
|
xfobject(name, fin); |
242 |
|
} |
243 |
|
|
244 |
|
|
245 |
< |
xfcomm(fname, fin) /* expand a command */ |
245 |
> |
xfcomm(fname, fin) /* transform a command */ |
246 |
|
FILE *fin; |
247 |
|
{ |
248 |
|
FILE *popen(); |
249 |
< |
char *fgets(); |
249 |
> |
char *fgetline(); |
250 |
|
FILE *pin; |
251 |
|
char buf[512]; |
252 |
+ |
int i; |
253 |
|
|
254 |
< |
fgets(buf, sizeof(buf), fin); |
255 |
< |
if (buf[strlen(buf)-1] == '\n') |
256 |
< |
buf[strlen(buf)-1] = '\0'; |
257 |
< |
if ((pin = popen(buf+1, "r")) == NULL) { |
258 |
< |
fprintf(stderr, "%s: (%s): cannot execute \"%s\"\n", |
259 |
< |
progname, fname, buf); |
260 |
< |
exit(1); |
254 |
> |
fgetline(buf, sizeof(buf), fin); |
255 |
> |
if (expand) { |
256 |
> |
if ((pin = popen(buf+1, "r")) == NULL) { |
257 |
> |
fprintf(stderr, "%s: (%s): cannot execute \"%s\"\n", |
258 |
> |
progname, fname, buf); |
259 |
> |
exit(1); |
260 |
> |
} |
261 |
> |
xform(buf, pin); |
262 |
> |
pclose(pin); |
263 |
> |
} else { |
264 |
> |
printf("\n%s | %s -e", buf, xav[0]); |
265 |
> |
for (i = 1; i < xac; i++) |
266 |
> |
printf(" %s", xav[i]); |
267 |
> |
putchar('\n'); |
268 |
|
} |
216 |
– |
xform(buf, pin); |
217 |
– |
pclose(pin); |
269 |
|
} |
270 |
|
|
271 |
|
|
379 |
|
if (fscanf(fin, "%s", alias) != 1) |
380 |
|
return(-1); |
381 |
|
printf("\t%s\n", alias); |
382 |
+ |
return(0); |
383 |
+ |
} |
384 |
+ |
|
385 |
+ |
|
386 |
+ |
m_glow(fin) /* transform arguments for proximity light */ |
387 |
+ |
FILE *fin; |
388 |
+ |
{ |
389 |
+ |
register FUNARGS *fa; |
390 |
+ |
|
391 |
+ |
if ((fa = getfargs(fin)) == NULL) |
392 |
+ |
return(-1); |
393 |
+ |
if (fa->nsargs != 0 || fa->niargs != 0 || fa->nfargs != 4) |
394 |
+ |
return(-1); |
395 |
+ |
printf("0\n0\n4"); |
396 |
+ |
printf(" %18.12g %18.12g %18.12g", |
397 |
+ |
fa->farg[0], fa->farg[1], fa->farg[2]); |
398 |
+ |
printf(" %18.12g\n", fa->farg[3] * totscale); |
399 |
+ |
freefargs(fa); |
400 |
+ |
return(0); |
401 |
+ |
} |
402 |
+ |
|
403 |
+ |
|
404 |
+ |
m_spot(fin) /* transform arguments for spotlight */ |
405 |
+ |
FILE *fin; |
406 |
+ |
{ |
407 |
+ |
double v[3]; |
408 |
+ |
register FUNARGS *fa; |
409 |
+ |
|
410 |
+ |
if ((fa = getfargs(fin)) == NULL) |
411 |
+ |
return(-1); |
412 |
+ |
if (fa->nsargs != 0 || fa->niargs != 0 || fa->nfargs != 7) |
413 |
+ |
return(-1); |
414 |
+ |
printf("0\n0\n7"); |
415 |
+ |
printf(" %18.12g %18.12g %18.12g %18.12g\n", |
416 |
+ |
fa->farg[0], fa->farg[1], fa->farg[2], fa->farg[3]); |
417 |
+ |
multv3(v, fa->farg+4, totxform); |
418 |
+ |
printf("\t%18.12g %18.12g %18.12g\n", v[0], v[1], v[2]); |
419 |
+ |
freefargs(fa); |
420 |
|
return(0); |
421 |
|
} |
422 |
|
|