ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/radiance/ray/src/gen/mkillum.c
Revision: 2.47
Committed: Wed Apr 23 02:35:26 2025 UTC (9 days, 5 hours ago) by greg
Content type: text/plain
Branch: MAIN
CVS Tags: HEAD
Changes since 2.46: +4 -1 lines
Log Message:
fix: Added missing calls to initfunc()

File Contents

# Content
1 #ifndef lint
2 static const char RCSid[] = "$Id: mkillum.c,v 2.46 2025/04/22 14:51:29 greg Exp $";
3 #endif
4 /*
5 * Make illum sources for optimizing rendering process
6 */
7
8 #include <signal.h>
9 #include <ctype.h>
10
11 #include "paths.h" /* win_popen() */
12 #include "mkillum.h"
13 #include "func.h"
14
15 /* default parameters */
16 #define SAMPDENS 48 /* points per projected steradian */
17 #define NSAMPS 32 /* samples per point */
18 #define DFLMAT "illum_mat" /* material name */
19 #define DFLDAT "illum" /* data file name */
20 /* selection options */
21 #define S_NONE 0 /* select none */
22 #define S_ELEM 1 /* select specified element */
23 #define S_COMPL 2 /* select all but element */
24 #define S_ALL 3 /* select all */
25
26 struct illum_args thisillum = { /* our illum and default values */
27 0,
28 DFLMAT,
29 DFLDAT,
30 0,
31 VOIDID,
32 SAMPDENS,
33 NSAMPS,
34 0.,
35 };
36
37 char matcheck[MAXSTR]; /* current material to include or exclude */
38 int matselect = S_ALL; /* selection criterion */
39
40 int gargc; /* global argc */
41 char **gargv; /* global argv */
42
43 int doneheader = 0; /* printed header yet? */
44 #define checkhead() if (!doneheader++) printhead(gargc,gargv)
45
46 int warnings = 1; /* print warnings? */
47
48 void init(char *octnm, int np);
49 void filter(FILE *infp, char *name);
50 void xoptions(char *s, char *nm);
51 void printopts(void);
52 void printhead(int ac, char **av);
53 void xobject(FILE *fp, char *nm);
54
55
56 int
57 main( /* compute illum distributions using rtrace */
58 int argc,
59 char *argv[]
60 )
61 {
62 int nprocs = 1;
63 FILE *fp;
64 int rval;
65 int i;
66 /* set global arguments */
67 gargv = argv;
68 progname = gargv[0];
69 /* set up rendering defaults */
70 dstrsrc = 0.5;
71 directrelay = 3;
72 ambounce = 2;
73 /* initialize calcomp routines */
74 initfunc();
75 /* get options from command line */
76 for (i = 1; i < argc; i++) {
77 while ((rval = expandarg(&argc, &argv, i)) > 0)
78 ;
79 if (rval < 0) {
80 sprintf(errmsg, "cannot expand '%s'", argv[i]);
81 error(SYSTEM, errmsg);
82 }
83 if (argv[i][0] != '-')
84 break;
85 if (!strcmp(argv[i], "-w")) {
86 warnings = 0;
87 continue;
88 }
89 if (!strcmp(argv[i], "-n")) {
90 nprocs = atoi(argv[++i]);
91 if (nprocs <= 0)
92 error(USER, "illegal number of processes");
93 continue;
94 }
95 if (!strcmp(argv[i], "-defaults")) {
96 printopts();
97 print_rdefaults();
98 quit(0);
99 }
100 rval = getrenderopt(argc-i, argv+i);
101 if (rval < 0) {
102 sprintf(errmsg, "bad render option at '%s'", argv[i]);
103 error(USER, errmsg);
104 }
105 i += rval;
106 }
107 gargc = ++i;
108 /* add "mandatory" render options */
109 do_irrad = 0;
110 if (gargc > argc || argv[gargc-1][0] == '-')
111 error(USER, "missing octree argument");
112 /* else initialize and run our calculation */
113 init(argv[gargc-1], nprocs);
114 if (gargc < argc) {
115 if (gargc == argc-1 || argv[gargc][0] != '<' || argv[gargc][1])
116 error(USER, "use '< file1 file2 ..' for multiple inputs");
117 for (i = gargc+1; i < argc; i++) {
118 if ((fp = fopen(argv[i], "r")) == NULL) {
119 sprintf(errmsg,
120 "cannot open scene file \"%s\"", argv[i]);
121 error(SYSTEM, errmsg);
122 }
123 filter(fp, argv[i]);
124 fclose(fp);
125 }
126 } else
127 filter(stdin, "standard input");
128 quit(0);
129 return 0; /* pro forma return */
130 }
131
132
133 void
134 init(char *octnm, int np) /* start rendering process(es) */
135 {
136 /* set up signal handling */
137 signal(SIGINT, quit);
138 #ifdef SIGHUP
139 signal(SIGHUP, quit);
140 #endif
141 #ifdef SIGTERM
142 signal(SIGTERM, quit);
143 #endif
144 #ifdef SIGPIPE
145 signal(SIGPIPE, quit);
146 #endif
147 /* start rendering process(es) */
148 ray_pinit(octnm, np);
149 }
150
151
152 void
153 eputs( /* put string to stderr */
154 const char *s
155 )
156 {
157 static int midline = 0;
158
159 if (!*s) return;
160 if (!midline) {
161 fputs(progname, stderr);
162 fputs(": ", stderr);
163 }
164 fputs(s, stderr);
165 midline = s[strlen(s)-1] != '\n';
166 }
167
168
169 void
170 wputs(const char *s) /* print warning if enabled */
171 {
172 if (warnings)
173 eputs(s);
174 }
175
176
177 void
178 quit(int ec) /* make sure exit is called */
179 {
180 if (ray_pnprocs > 0) /* close children if any */
181 ray_pclose(0);
182 else if (ray_pnprocs < 0)
183 _exit(ec); /* avoid flush() in child */
184 exit(ec);
185 }
186
187
188 void
189 filter( /* process stream */
190 FILE *infp,
191 char *name
192 )
193 {
194 char buf[512];
195 FILE *pfp;
196 int c;
197
198 while ((c = getc(infp)) != EOF) {
199 if (isspace(c))
200 continue;
201 if (c == '#') { /* comment/options */
202 buf[0] = c;
203 fgets(buf+1, sizeof(buf)-1, infp);
204 xoptions(buf, name);
205 } else if (c == '!') { /* command */
206 buf[0] = c;
207 fgetline(buf+1, sizeof(buf)-1, infp);
208 if ((pfp = popen(buf+1, "r")) == NULL) {
209 sprintf(errmsg, "cannot execute \"%s\"", buf);
210 error(SYSTEM, errmsg);
211 }
212 filter(pfp, buf);
213 if (pclose(pfp) != 0) {
214 sprintf(errmsg, "bad status from \"%s\"", buf);
215 error(WARNING, errmsg);
216 }
217 } else { /* object */
218 ungetc(c, infp);
219 xobject(infp, name);
220 }
221 }
222 }
223
224
225 void
226 xoptions( /* process options in string s */
227 char *s,
228 char *nm
229 )
230 {
231 char buf[64];
232 int negax;
233 int nerrs = 0;
234 char *cp;
235
236 if (strncmp(s, "#@mkillum", 9) || !isspace(s[9])) {
237 fputs(s, stdout); /* not for us */
238 return;
239 }
240 cp = s+10;
241 while (*cp) {
242 switch (*cp) {
243 case ' ':
244 case '\t':
245 case '\n':
246 case '\r':
247 case '\f':
248 cp++;
249 continue;
250 case 'm': /* material name */
251 if (*++cp != '=')
252 break;
253 if (!*++cp || isspace(*cp))
254 break;
255 atos(thisillum.matname, MAXSTR, cp);
256 cp = sskip(cp);
257 if (!(thisillum.flags & IL_DATCLB)) {
258 strcpy(thisillum.datafile, thisillum.matname);
259 thisillum.dfnum = 0;
260 }
261 continue;
262 case 'f': /* data file name */
263 if (*++cp != '=')
264 break;
265 if (!*++cp || isspace(*cp)) {
266 strcpy(thisillum.datafile,thisillum.matname);
267 thisillum.dfnum = 0;
268 thisillum.flags &= ~IL_DATCLB;
269 continue;
270 }
271 atos(thisillum.datafile, MAXSTR, cp);
272 cp = sskip(cp);
273 thisillum.dfnum = 0;
274 thisillum.flags |= IL_DATCLB;
275 continue;
276 case 'i': /* include material */
277 case 'e': /* exclude material */
278 if (cp[1] != '=')
279 break;
280 matselect = (*cp == 'i') ? S_ELEM : S_COMPL;
281 cp += 2;
282 atos(matcheck, MAXSTR, cp);
283 cp = sskip(cp);
284 continue;
285 case 'a': /* use everything */
286 cp = sskip(cp);
287 matselect = S_ALL;
288 continue;
289 case 'n': /* use nothing (passive) */
290 cp = sskip(cp);
291 matselect = S_NONE;
292 continue;
293 case 'c': /* color calculation */
294 if (*++cp != '=')
295 break;
296 switch (*++cp) {
297 case 'a': /* average */
298 thisillum.flags = (thisillum.flags|IL_COLAVG)
299 & ~IL_COLDST;
300 break;
301 case 'd': /* distribution */
302 thisillum.flags |= (IL_COLDST|IL_COLAVG);
303 break;
304 case 'n': /* none */
305 thisillum.flags &= ~(IL_COLAVG|IL_COLDST);
306 break;
307 default:
308 goto opterr;
309 }
310 cp = sskip(cp);
311 continue;
312 case 'd': /* sample density */
313 if (*++cp != '=')
314 break;
315 if (!*++cp || isspace(*cp))
316 continue;
317 if (isintd(cp, " \t\n\r")) {
318 thisillum.sampdens = atoi(cp);
319 } else {
320 error(WARNING, "direct BSDF input unsupported");
321 goto opterr;
322 }
323 cp = sskip(cp);
324 continue;
325 case 's': /* surface super-samples */
326 if (*++cp != '=')
327 break;
328 if (!isintd(++cp, " \t\n\r"))
329 break;
330 thisillum.nsamps = atoi(cp);
331 cp = sskip(cp);
332 continue;
333 case 'l': /* light sources */
334 cp++;
335 if (*cp == '+')
336 thisillum.flags |= IL_LIGHT;
337 else if (*cp == '-')
338 thisillum.flags &= ~IL_LIGHT;
339 else
340 break;
341 cp++;
342 continue;
343 case 'b': /* brightness */
344 if (*++cp != '=')
345 break;
346 if (!isfltd(++cp, " \t\n\r"))
347 break;
348 thisillum.minbrt = atof(cp);
349 if (thisillum.minbrt < 0.)
350 thisillum.minbrt = 0.;
351 cp = sskip(cp);
352 continue;
353 case 'o': /* output file */
354 if (*++cp != '=')
355 break;
356 if (!*++cp || isspace(*cp))
357 break;
358 atos(buf, sizeof(buf), cp);
359 cp = sskip(cp);
360 if (freopen(buf, "w", stdout) == NULL) {
361 sprintf(errmsg,
362 "cannot open output file \"%s\"", buf);
363 error(SYSTEM, errmsg);
364 }
365 doneheader = 0;
366 continue;
367 case '!': /* processed file! */
368 sprintf(errmsg, "(%s): already processed!", nm);
369 error(WARNING, errmsg);
370 matselect = S_NONE;
371 return;
372 }
373 opterr: /* skip faulty option */
374 while (*cp && !isspace(*cp))
375 cp++;
376 nerrs++;
377 }
378 /* print header? */
379 checkhead();
380 /* issue warnings? */
381 if (nerrs) {
382 sprintf(errmsg, "(%s): %d error(s) in option line:",
383 nm, nerrs);
384 error(WARNING, errmsg);
385 wputs(s);
386 printf("# %s: the following option line has %d error(s):\n",
387 progname, nerrs);
388 }
389 /* print pure comment */
390 printf("# %s", s+2);
391 }
392
393 void
394 printopts(void) /* print out option default values */
395 {
396 printf("m=%-15s\t\t# material name\n", thisillum.matname);
397 printf("f=%-15s\t\t# data file name\n", thisillum.datafile);
398 if (thisillum.flags & IL_COLAVG)
399 if (thisillum.flags & IL_COLDST)
400 printf("c=d\t\t\t\t# color distribution\n");
401 else
402 printf("c=a\t\t\t\t# color average\n");
403 else
404 printf("c=n\t\t\t\t# color none\n");
405 if (thisillum.flags & IL_LIGHT)
406 printf("l+\t\t\t\t# light type on\n");
407 else
408 printf("l-\t\t\t\t# light type off\n");
409 printf("d=%d\t\t\t\t# density of directions\n", thisillum.sampdens);
410 printf("s=%d\t\t\t\t# samples per direction\n", thisillum.nsamps);
411 printf("b=%f\t\t\t# minimum average brightness\n", thisillum.minbrt);
412 }
413
414
415 void
416 printhead( /* print out header */
417 int ac,
418 char **av
419 )
420 {
421 putchar('#');
422 while (ac-- > 0) {
423 putchar(' ');
424 fputs(*av++, stdout);
425 }
426 fputs("\n#@mkillum !\n", stdout);
427 }
428
429
430 void
431 xobject( /* translate an object from fp */
432 FILE *fp,
433 char *nm
434 )
435 {
436 OBJREC thisobj;
437 char str[MAXSTR];
438 int doit;
439 /* read the object */
440 if (fgetword(thisillum.altmat, MAXSTR, fp) == NULL)
441 goto readerr;
442 if (fgetword(str, MAXSTR, fp) == NULL)
443 goto readerr;
444 /* is it an alias? */
445 if (!strcmp(str, ALIASKEY)) {
446 if (fgetword(str, MAXSTR, fp) == NULL)
447 goto readerr;
448 printf("\n%s %s %s", thisillum.altmat, ALIASKEY, str);
449 if (fgetword(str, MAXSTR, fp) == NULL)
450 goto readerr;
451 printf("\t%s\n", str);
452 return;
453 }
454 thisobj.omod = OVOID; /* unused field */
455 if ((thisobj.otype = otype(str)) < 0) {
456 sprintf(errmsg, "(%s): unknown type \"%s\"", nm, str);
457 error(USER, errmsg);
458 }
459 if (fgetword(str, MAXSTR, fp) == NULL)
460 goto readerr;
461 thisobj.oname = str;
462 if (readfargs(&thisobj.oargs, fp) != 1)
463 goto readerr;
464 thisobj.os = NULL;
465 /* check for translation */
466 switch (matselect) {
467 case S_NONE:
468 doit = 0;
469 break;
470 case S_ALL:
471 doit = 1;
472 break;
473 case S_ELEM:
474 doit = !strcmp(thisillum.altmat, matcheck);
475 break;
476 case S_COMPL:
477 doit = strcmp(thisillum.altmat, matcheck);
478 break;
479 }
480 doit = doit && issurface(thisobj.otype);
481 /* print header? */
482 checkhead();
483 /* process object */
484 if (doit)
485 switch (thisobj.otype) {
486 case OBJ_FACE:
487 my_face(&thisobj, &thisillum, nm);
488 break;
489 case OBJ_SPHERE:
490 my_sphere(&thisobj, &thisillum, nm);
491 break;
492 case OBJ_RING:
493 my_ring(&thisobj, &thisillum, nm);
494 break;
495 default:
496 my_default(&thisobj, &thisillum, nm);
497 break;
498 }
499 else
500 printobj(thisillum.altmat, &thisobj);
501 /* free arguments */
502 freefargs(&thisobj.oargs);
503 return;
504 readerr:
505 sprintf(errmsg, "(%s): error reading input", nm);
506 error(USER, errmsg);
507 }