| 1 | – | /* Copyright (c) 1991 Regents of the University of California */ | 
| 2 | – |  | 
| 1 |  | #ifndef lint | 
| 2 | < | static char SCCSid[] = "$SunId$ LBL"; | 
| 2 | > | static const char RCSid[] = "$Id$"; | 
| 3 |  | #endif | 
| 6 | – |  | 
| 4 |  | /* | 
| 5 |  | * Make illum sources for optimizing rendering process | 
| 6 |  | */ | 
| 7 |  |  | 
| 11 | – | #include  "mkillum.h" | 
| 12 | – |  | 
| 8 |  | #include  <signal.h> | 
| 14 | – |  | 
| 9 |  | #include  <ctype.h> | 
| 10 |  |  | 
| 11 | + | #include  "platform.h" | 
| 12 | + | #include  "mkillum.h" | 
| 13 | + | #include  "random.h" | 
| 14 | + |  | 
| 15 |  | /* default parameters */ | 
| 16 |  | #define  SAMPDENS       48              /* points per projected steradian */ | 
| 17 |  | #define  NSAMPS         32              /* samples per point */ | 
| 24 |  | #define  S_ALL          3               /* select all */ | 
| 25 |  |  | 
| 26 |  | /* rtrace command and defaults */ | 
| 27 | < | char  *rtargv[64] = { "rtrace", "-dj", ".25", "-dr", "3", "-di+", | 
| 28 | < | "-ab", "2", "-ad", "256", "-as", "128", "-aa", ".15", }; | 
| 27 | > | char  *rtargv[64] = { "rtrace", "-dj", ".25", "-dr", "3", "-dv-", | 
| 28 | > | "-ab", "2", "-ad", "1024", "-as", "512", "-aa", ".1", }; | 
| 29 |  | int  rtargc = 14; | 
| 30 |  | /* overriding rtrace options */ | 
| 31 | < | char  *myrtopts[] = { "-I-", "-i-", "-ov", "-h-", "-fff", NULL }; | 
| 31 | > | char  *myrtopts[] = { "-I-", "-i-", "-ld-", "-ov", "-h-", | 
| 32 | > | "-fff", "-y", "0", NULL }; | 
| 33 |  |  | 
| 34 |  | struct rtproc   rt;             /* our rtrace process */ | 
| 35 |  |  | 
| 58 |  |  | 
| 59 |  | int     warnings = 1;           /* print warnings? */ | 
| 60 |  |  | 
| 61 | < | extern char     *fgetline(), *fgetword(), *sskip(), | 
| 62 | < | *atos(), *iskip(), *fskip(), *strcpy(); | 
| 63 | < | extern FILE     *popen(); | 
| 61 | > | void init(void); | 
| 62 | > | void filter(register FILE       *infp, char     *name); | 
| 63 | > | void xoptions(char      *s, char        *nm); | 
| 64 | > | void printopts(void); | 
| 65 | > | void printhead(register int  ac, register char  **av); | 
| 66 | > | void xobject(FILE  *fp, char  *nm); | 
| 67 |  |  | 
| 68 |  |  | 
| 69 | < | main(argc, argv)                /* compute illum distributions using rtrace */ | 
| 70 | < | int     argc; | 
| 71 | < | char    *argv[]; | 
| 69 | > | int | 
| 70 | > | main(           /* compute illum distributions using rtrace */ | 
| 71 | > | int     argc, | 
| 72 | > | char    *argv[] | 
| 73 | > | ) | 
| 74 |  | { | 
| 71 | – | extern char     *getenv(), *getpath(); | 
| 75 |  | char    *rtpath; | 
| 76 |  | FILE    *fp; | 
| 77 |  | register int    i; | 
| 79 |  | gargv = argv; | 
| 80 |  | /* set up rtrace command */ | 
| 81 |  | for (i = 1; i < argc; i++) { | 
| 82 | < | if (argv[i][0] == '<' && !argv[i][1]) | 
| 82 | > | if (argv[i][0] == '<' && argv[i][1] == '\0') | 
| 83 |  | break; | 
| 84 |  | rtargv[rtargc++] = argv[i]; | 
| 85 |  | if (argv[i][0] == '-' && argv[i][1] == 'w') | 
| 86 | < | warnings = !warnings; | 
| 86 | > | switch (argv[i][2]) { | 
| 87 | > | case '\0': | 
| 88 | > | warnings = !warnings; | 
| 89 | > | break; | 
| 90 | > | case '+': | 
| 91 | > | case 'T': case 't': | 
| 92 | > | case 'Y': case 'y': | 
| 93 | > | case '1': | 
| 94 | > | warnings = 1; | 
| 95 | > | break; | 
| 96 | > | case '-': | 
| 97 | > | case 'F': case 'f': | 
| 98 | > | case 'N': case 'n': | 
| 99 | > | case '0': | 
| 100 | > | warnings = 0; | 
| 101 | > | break; | 
| 102 | > | } | 
| 103 |  | } | 
| 104 | < | if ((gargc = i) < 2) | 
| 86 | < | error(USER, "too few arguments"); | 
| 104 | > | gargc = i; | 
| 105 |  | rtargc--; | 
| 106 |  | for (i = 0; myrtopts[i] != NULL; i++) | 
| 107 |  | rtargv[rtargc++] = myrtopts[i]; | 
| 120 |  | perror(rtpath); | 
| 121 |  | exit(1); | 
| 122 |  | } | 
| 123 | + | if (gargc < 2 || argv[gargc-1][0] == '-') | 
| 124 | + | error(USER, "missing octree argument"); | 
| 125 |  | /* else initialize and run our calculation */ | 
| 126 |  | init(); | 
| 127 |  | if (gargc+1 < argc) | 
| 136 |  | } | 
| 137 |  | else | 
| 138 |  | filter(stdin, "standard input"); | 
| 139 | < | quit(0); | 
| 139 | > | return 0; | 
| 140 |  | } | 
| 141 |  |  | 
| 142 |  |  | 
| 143 | + | void | 
| 144 |  | quit(status)                    /* exit with status */ | 
| 145 |  | int  status; | 
| 146 |  | { | 
| 147 |  | int     rtstat; | 
| 148 |  |  | 
| 149 | < | rtstat = close_process(rt.pd); | 
| 150 | < | if (status == 0) | 
| 149 | > | rtstat = close_process(&(rt.pd)); | 
| 150 | > | if (status == 0) { | 
| 151 |  | if (rtstat < 0) | 
| 152 |  | error(WARNING, | 
| 153 |  | "unknown return status from rtrace process"); | 
| 154 |  | else | 
| 155 |  | status = rtstat; | 
| 156 | + | } | 
| 157 |  | exit(status); | 
| 158 |  | } | 
| 159 |  |  | 
| 160 | < |  | 
| 161 | < | init()                          /* start rtrace and set up buffers */ | 
| 160 | > | void | 
| 161 | > | init(void)                              /* start rtrace and set up buffers */ | 
| 162 |  | { | 
| 163 |  | extern int  o_face(), o_sphere(), o_ring(); | 
| 164 |  | int     maxbytes; | 
| 167 |  | ofun[OBJ_SPHERE].funp = o_sphere; | 
| 168 |  | ofun[OBJ_RING].funp = o_ring; | 
| 169 |  | /* set up signal handling */ | 
| 170 | + | #ifdef SIGPIPE /* not present on Windows */ | 
| 171 |  | signal(SIGPIPE, quit); | 
| 172 | + | #endif | 
| 173 |  | /* start rtrace process */ | 
| 174 | < | maxbytes = open_process(rt.pd, rtargv); | 
| 174 | > | errno = 0; | 
| 175 | > | maxbytes = open_process(&(rt.pd), rtargv); | 
| 176 |  | if (maxbytes == 0) { | 
| 177 |  | eputs(rtargv[0]); | 
| 178 |  | eputs(": command not found\n"); | 
| 187 |  | error(SYSTEM, "out of memory in init"); | 
| 188 |  | rt.nrays = 0; | 
| 189 |  | /* set up urand */ | 
| 190 | < | initurand(2048); | 
| 190 | > | initurand(16384); | 
| 191 |  | } | 
| 192 |  |  | 
| 193 |  |  | 
| 194 | < | eputs(s)                                /* put string to stderr */ | 
| 195 | < | register char  *s; | 
| 194 | > | void | 
| 195 | > | eputs(                          /* put string to stderr */ | 
| 196 | > | register char  *s | 
| 197 | > | ) | 
| 198 |  | { | 
| 199 |  | static int  midline = 0; | 
| 200 |  |  | 
| 208 |  | } | 
| 209 |  |  | 
| 210 |  |  | 
| 211 | + | void | 
| 212 |  | wputs(s)                        /* print warning if enabled */ | 
| 213 |  | char  *s; | 
| 214 |  | { | 
| 217 |  | } | 
| 218 |  |  | 
| 219 |  |  | 
| 220 | < | filter(infp, name)              /* process stream */ | 
| 221 | < | register FILE   *infp; | 
| 222 | < | char    *name; | 
| 220 | > | void | 
| 221 | > | filter(         /* process stream */ | 
| 222 | > | register FILE   *infp, | 
| 223 | > | char    *name | 
| 224 | > | ) | 
| 225 |  | { | 
| 226 |  | char    buf[512]; | 
| 227 |  | FILE    *pfp; | 
| 251 |  | } | 
| 252 |  |  | 
| 253 |  |  | 
| 254 | < | xoptions(s, nm)                 /* process options in string s */ | 
| 255 | < | char    *s; | 
| 256 | < | char    *nm; | 
| 254 | > | void | 
| 255 | > | xoptions(                       /* process options in string s */ | 
| 256 | > | char    *s, | 
| 257 | > | char    *nm | 
| 258 | > | ) | 
| 259 |  | { | 
| 260 |  | extern FILE     *freopen(); | 
| 261 |  | char    buf[64]; | 
| 272 |  | case ' ': | 
| 273 |  | case '\t': | 
| 274 |  | case '\n': | 
| 275 | + | case '\r': | 
| 276 | + | case '\f': | 
| 277 |  | cp++; | 
| 278 |  | continue; | 
| 279 |  | case 'm':                       /* material name */ | 
| 280 |  | if (*++cp != '=') | 
| 281 |  | break; | 
| 282 | < | if (!*++cp) | 
| 282 | > | if (!*++cp || isspace(*cp)) | 
| 283 |  | break; | 
| 284 |  | atos(thisillum.matname, MAXSTR, cp); | 
| 285 |  | cp = sskip(cp); | 
| 291 |  | case 'f':                       /* data file name */ | 
| 292 |  | if (*++cp != '=') | 
| 293 |  | break; | 
| 294 | < | if (!*++cp) { | 
| 294 | > | if (!*++cp || isspace(*cp)) { | 
| 295 |  | strcpy(thisillum.datafile,thisillum.matname); | 
| 296 |  | thisillum.dfnum = 0; | 
| 297 |  | thisillum.flags &= ~IL_DATCLB; | 
| 341 |  | case 'd':                       /* point sample density */ | 
| 342 |  | if (*++cp != '=') | 
| 343 |  | break; | 
| 344 | < | if (!isintd(++cp, " \t\n")) | 
| 344 | > | if (!isintd(++cp, " \t\n\r")) | 
| 345 |  | break; | 
| 346 |  | thisillum.sampdens = atoi(cp); | 
| 347 |  | cp = sskip(cp); | 
| 349 |  | case 's':                       /* point super-samples */ | 
| 350 |  | if (*++cp != '=') | 
| 351 |  | break; | 
| 352 | < | if (!isintd(++cp, " \t\n")) | 
| 352 | > | if (!isintd(++cp, " \t\n\r")) | 
| 353 |  | break; | 
| 354 |  | thisillum.nsamps = atoi(cp); | 
| 355 |  | cp = sskip(cp); | 
| 367 |  | case 'b':                       /* brightness */ | 
| 368 |  | if (*++cp != '=') | 
| 369 |  | break; | 
| 370 | < | if (!isfltd(++cp, " \t\n")) | 
| 370 | > | if (!isfltd(++cp, " \t\n\r")) | 
| 371 |  | break; | 
| 372 |  | thisillum.minbrt = atof(cp); | 
| 373 |  | if (thisillum.minbrt < 0.) | 
| 377 |  | case 'o':                       /* output file */ | 
| 378 |  | if (*++cp != '=') | 
| 379 |  | break; | 
| 380 | < | if (!*++cp) | 
| 380 | > | if (!*++cp || isspace(*cp)) | 
| 381 |  | break; | 
| 382 |  | atos(buf, sizeof(buf), cp); | 
| 383 |  | cp = sskip(cp); | 
| 395 |  | return; | 
| 396 |  | } | 
| 397 |  | opterr:                                 /* skip faulty option */ | 
| 398 | < | cp = sskip(cp); | 
| 398 | > | while (*cp && !isspace(*cp)) | 
| 399 | > | cp++; | 
| 400 |  | nerrs++; | 
| 401 |  | } | 
| 402 |  | /* print header? */ | 
| 414 |  | printf("# %s", s+2); | 
| 415 |  | } | 
| 416 |  |  | 
| 417 | < |  | 
| 418 | < | printopts()                     /* print out option default values */ | 
| 417 | > | void | 
| 418 | > | printopts(void)                 /* print out option default values */ | 
| 419 |  | { | 
| 420 |  | printf("m=%-15s\t\t# material name\n", thisillum.matname); | 
| 421 |  | printf("f=%-15s\t\t# data file name\n", thisillum.datafile); | 
| 422 | < | printf("c=n\t\t\t\t# color none\n"); | 
| 422 | > | if (thisillum.flags & IL_COLAVG) | 
| 423 | > | if (thisillum.flags & IL_COLDST) | 
| 424 | > | printf("c=d\t\t\t\t# color distribution\n"); | 
| 425 | > | else | 
| 426 | > | printf("c=a\t\t\t\t# color average\n"); | 
| 427 | > | else | 
| 428 | > | printf("c=n\t\t\t\t# color none\n"); | 
| 429 | > | if (thisillum.flags & IL_LIGHT) | 
| 430 | > | printf("l+\t\t\t\t# light type on\n"); | 
| 431 | > | else | 
| 432 | > | printf("l-\t\t\t\t# light type off\n"); | 
| 433 |  | printf("d=%d\t\t\t\t# density of points\n", thisillum.sampdens); | 
| 434 |  | printf("s=%d\t\t\t\t# samples per point\n", thisillum.nsamps); | 
| 435 |  | printf("b=%f\t\t\t# minimum average brightness\n", thisillum.minbrt); | 
| 436 |  | } | 
| 437 |  |  | 
| 438 |  |  | 
| 439 | < | printhead(ac, av)                       /* print out header */ | 
| 440 | < | register int  ac; | 
| 441 | < | register char  **av; | 
| 439 | > | void | 
| 440 | > | printhead(                      /* print out header */ | 
| 441 | > | register int  ac, | 
| 442 | > | register char  **av | 
| 443 | > | ) | 
| 444 |  | { | 
| 445 |  | putchar('#'); | 
| 446 |  | while (ac-- > 0) { | 
| 451 |  | } | 
| 452 |  |  | 
| 453 |  |  | 
| 454 | < | xobject(fp, nm)                         /* translate an object from fp */ | 
| 455 | < | FILE  *fp; | 
| 456 | < | char  *nm; | 
| 454 | > | void | 
| 455 | > | xobject(                                /* translate an object from fp */ | 
| 456 | > | FILE  *fp, | 
| 457 | > | char  *nm | 
| 458 | > | ) | 
| 459 |  | { | 
| 460 |  | OBJREC  thisobj; | 
| 461 |  | char  str[MAXSTR]; | 
| 466 |  | if (fgetword(str, MAXSTR, fp) == NULL) | 
| 467 |  | goto readerr; | 
| 468 |  | /* is it an alias? */ | 
| 469 | < | if (!strcmp(str, ALIASID)) { | 
| 469 | > | if (!strcmp(str, ALIASKEY)) { | 
| 470 |  | if (fgetword(str, MAXSTR, fp) == NULL) | 
| 471 |  | goto readerr; | 
| 472 | < | printf("\n%s %s %s", thisillum.altmat, ALIASID, str); | 
| 472 | > | printf("\n%s %s %s", thisillum.altmat, ALIASKEY, str); | 
| 473 |  | if (fgetword(str, MAXSTR, fp) == NULL) | 
| 474 |  | goto readerr; | 
| 475 |  | printf("\t%s\n", str); |