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]) { |
131 |
|
break; |
132 |
|
} |
133 |
|
|
134 |
+ |
xav = argv; |
135 |
|
xfa = a; |
136 |
|
|
137 |
|
totscale = 1.0; |
162 |
|
fclose(fp); |
163 |
|
} |
164 |
|
|
165 |
< |
exit(0); |
165 |
> |
return(0); |
166 |
|
} |
167 |
|
|
168 |
|
|
169 |
+ |
doarray(ac, av, ai) /* make array */ |
170 |
+ |
char **av; |
171 |
+ |
int ac, ai; |
172 |
+ |
{ |
173 |
+ |
char *newav[256], **avp; |
174 |
+ |
char newid[128], repts[32]; |
175 |
+ |
char *oldid = NULL; |
176 |
+ |
int i, err; |
177 |
+ |
|
178 |
+ |
avp = newav+2; |
179 |
+ |
avp[0] = av[0]; |
180 |
+ |
for (i = 1; i < ac; i++) |
181 |
+ |
if (!strcmp(av[i-1], "-n")) { |
182 |
+ |
oldid = av[i]; |
183 |
+ |
avp[i] = newid; |
184 |
+ |
} else |
185 |
+ |
avp[i] = av[i]; |
186 |
+ |
avp[ai] = "-i"; |
187 |
+ |
avp[ai+1] = repts; |
188 |
+ |
avp[i] = NULL; |
189 |
+ |
if (oldid == NULL) { |
190 |
+ |
newav[0] = av[0]; |
191 |
+ |
newav[1] = "-n"; |
192 |
+ |
newav[2] = newid; |
193 |
+ |
avp = newav; |
194 |
+ |
ac += 2; |
195 |
+ |
} |
196 |
+ |
err = 0; |
197 |
+ |
for (i = 0; i < atoi(av[ai+1]); i++) { |
198 |
+ |
if (oldid == NULL) |
199 |
+ |
sprintf(newid, "a%d", i); |
200 |
+ |
else |
201 |
+ |
sprintf(newid, "%s.%d", oldid, i); |
202 |
+ |
sprintf(repts, "%d", i); |
203 |
+ |
err |= main(ac, avp); |
204 |
+ |
} |
205 |
+ |
return(err); |
206 |
+ |
} |
207 |
+ |
|
208 |
+ |
|
209 |
|
xform(name, fin) /* transform stream by totxform */ |
210 |
|
char *name; |
211 |
|
register FILE *fin; |
224 |
|
} while (c != '\n'); |
225 |
|
} else if (c == '!') { /* command */ |
226 |
|
ungetc(c, fin); |
227 |
< |
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 |
< |
} |
227 |
> |
xfcomm(name, fin); |
228 |
|
} else { /* object */ |
229 |
|
ungetc(c, fin); |
230 |
|
xfobject(name, fin); |
233 |
|
} |
234 |
|
|
235 |
|
|
236 |
< |
xfcomm(fname, fin) /* expand a command */ |
236 |
> |
xfcomm(fname, fin) /* transform a command */ |
237 |
|
FILE *fin; |
238 |
|
{ |
239 |
|
FILE *popen(); |
240 |
< |
char *fgets(); |
240 |
> |
char *fgetline(); |
241 |
|
FILE *pin; |
242 |
|
char buf[512]; |
243 |
+ |
int i; |
244 |
|
|
245 |
< |
fgets(buf, sizeof(buf), fin); |
246 |
< |
if (buf[strlen(buf)-1] == '\n') |
247 |
< |
buf[strlen(buf)-1] = '\0'; |
248 |
< |
if ((pin = popen(buf+1, "r")) == NULL) { |
249 |
< |
fprintf(stderr, "%s: (%s): cannot execute \"%s\"\n", |
250 |
< |
progname, fname, buf); |
251 |
< |
exit(1); |
245 |
> |
fgetline(buf, sizeof(buf), fin); |
246 |
> |
if (expand) { |
247 |
> |
if ((pin = popen(buf+1, "r")) == NULL) { |
248 |
> |
fprintf(stderr, "%s: (%s): cannot execute \"%s\"\n", |
249 |
> |
progname, fname, buf); |
250 |
> |
exit(1); |
251 |
> |
} |
252 |
> |
xform(buf, pin); |
253 |
> |
pclose(pin); |
254 |
> |
} else { |
255 |
> |
printf("\n%s | %s -e", buf, xav[0]); |
256 |
> |
for (i = 1; i < xac; i++) |
257 |
> |
printf(" %s", xav[i]); |
258 |
> |
putchar('\n'); |
259 |
|
} |
216 |
– |
xform(buf, pin); |
217 |
– |
pclose(pin); |
260 |
|
} |
261 |
|
|
262 |
|
|
370 |
|
if (fscanf(fin, "%s", alias) != 1) |
371 |
|
return(-1); |
372 |
|
printf("\t%s\n", alias); |
373 |
+ |
return(0); |
374 |
+ |
} |
375 |
+ |
|
376 |
+ |
|
377 |
+ |
m_glow(fin) /* transform arguments for proximity light */ |
378 |
+ |
FILE *fin; |
379 |
+ |
{ |
380 |
+ |
register FUNARGS *fa; |
381 |
+ |
|
382 |
+ |
if ((fa = getfargs(fin)) == NULL) |
383 |
+ |
return(-1); |
384 |
+ |
if (fa->nsargs != 0 || fa->niargs != 0 || fa->nfargs != 4) |
385 |
+ |
return(-1); |
386 |
+ |
printf("0\n0\n4"); |
387 |
+ |
printf(" %18.12g %18.12g %18.12g", |
388 |
+ |
fa->farg[0], fa->farg[1], fa->farg[2]); |
389 |
+ |
printf(" %18.12g\n", fa->farg[3] * totscale); |
390 |
+ |
freefargs(fa); |
391 |
+ |
return(0); |
392 |
+ |
} |
393 |
+ |
|
394 |
+ |
|
395 |
+ |
m_spot(fin) /* transform arguments for spotlight */ |
396 |
+ |
FILE *fin; |
397 |
+ |
{ |
398 |
+ |
double v[3]; |
399 |
+ |
register FUNARGS *fa; |
400 |
+ |
|
401 |
+ |
if ((fa = getfargs(fin)) == NULL) |
402 |
+ |
return(-1); |
403 |
+ |
if (fa->nsargs != 0 || fa->niargs != 0 || fa->nfargs != 7) |
404 |
+ |
return(-1); |
405 |
+ |
printf("0\n0\n7"); |
406 |
+ |
printf(" %18.12g %18.12g %18.12g %18.12g\n", |
407 |
+ |
fa->farg[0], fa->farg[1], fa->farg[2], fa->farg[3]); |
408 |
+ |
multv3(v, fa->farg+4, totxform); |
409 |
+ |
printf("\t%18.12g %18.12g %18.12g\n", v[0], v[1], v[2]); |
410 |
+ |
freefargs(fa); |
411 |
|
return(0); |
412 |
|
} |
413 |
|
|