| 35 | 
  | 
 | 
| 36 | 
  | 
int  nproc = 1;                         /* number of processes */ | 
| 37 | 
  | 
 | 
| 38 | 
< | 
extern char  *formstr();                /* string from format */ | 
| 38 | 
> | 
extern char  *formstr(int f);           /* string from format */ | 
| 39 | 
> | 
extern int  setrtoutput(void);          /* set output values */ | 
| 40 | 
> | 
 | 
| 41 | 
  | 
int  inform = 'a';                      /* input format */ | 
| 42 | 
  | 
int  outform = 'a';                     /* output format */ | 
| 43 | 
  | 
char  *outvals = "v";                   /* output specification */ | 
| 45 | 
  | 
int  hresolu = 0;                       /* horizontal (scan) size */ | 
| 46 | 
  | 
int  vresolu = 0;                       /* vertical resolution */ | 
| 47 | 
  | 
 | 
| 48 | 
+ | 
int  castonly = 0;                      /* only doing ray-casting? */ | 
| 49 | 
+ | 
 | 
| 50 | 
  | 
int  imm_irrad = 0;                     /* compute immediate irradiance? */ | 
| 51 | 
  | 
int  lim_dist = 0;                      /* limit distance? */ | 
| 52 | 
  | 
 | 
| 73 | 
  | 
#define  check(ol,al)           if (argv[i][ol] || \ | 
| 74 | 
  | 
                                badarg(argc-i-1,argv+i+1,al)) \ | 
| 75 | 
  | 
                                goto badopt | 
| 76 | 
< | 
#define  bool(olen,var)         switch (argv[i][olen]) { \ | 
| 76 | 
> | 
#define  check_bool(olen,var)           switch (argv[i][olen]) { \ | 
| 77 | 
  | 
                                case '\0': var = !var; break; \ | 
| 78 | 
  | 
                                case 'y': case 'Y': case 't': case 'T': \ | 
| 79 | 
  | 
                                case '+': case '1': var = 1; break; \ | 
| 80 | 
  | 
                                case 'n': case 'N': case 'f': case 'F': \ | 
| 81 | 
  | 
                                case '-': case '0': var = 0; break; \ | 
| 82 | 
  | 
                                default: goto badopt; } | 
| 83 | 
+ | 
        extern char  *octname; | 
| 84 | 
  | 
        int  persist = 0; | 
| 85 | 
  | 
        char  *octnm = NULL; | 
| 86 | 
  | 
        char  **tralp = NULL; | 
| 93 | 
  | 
        for (i = 0; addobjnotify[i] != NULL; i++) | 
| 94 | 
  | 
                ; | 
| 95 | 
  | 
        addobjnotify[i] = tranotify; | 
| 91 | 
– | 
                                        /* set our defaults */ | 
| 92 | 
– | 
        rand_samp = 1; | 
| 93 | 
– | 
        maxdepth = -10; | 
| 94 | 
– | 
        minweight = 2e-3; | 
| 96 | 
  | 
                                        /* option city */ | 
| 97 | 
  | 
        for (i = 1; i < argc; i++) { | 
| 98 | 
  | 
                                                /* expand arguments */ | 
| 135 | 
  | 
                        break; | 
| 136 | 
  | 
                case 'w':                               /* warnings */ | 
| 137 | 
  | 
                        rval = erract[WARNING].pf != NULL; | 
| 138 | 
< | 
                        bool(2,rval); | 
| 138 | 
> | 
                        check_bool(2,rval); | 
| 139 | 
  | 
                        if (rval) erract[WARNING].pf = wputs; | 
| 140 | 
  | 
                        else erract[WARNING].pf = NULL; | 
| 141 | 
  | 
                        break; | 
| 146 | 
  | 
                case 'l':                               /* limit distance */ | 
| 147 | 
  | 
                        if (argv[i][2] != 'd') | 
| 148 | 
  | 
                                goto badopt; | 
| 149 | 
< | 
                        bool(3,lim_dist); | 
| 149 | 
> | 
                        check_bool(3,lim_dist); | 
| 150 | 
  | 
                        break; | 
| 151 | 
  | 
                case 'I':                               /* immed. irradiance */ | 
| 152 | 
< | 
                        bool(2,imm_irrad); | 
| 152 | 
> | 
                        check_bool(2,imm_irrad); | 
| 153 | 
  | 
                        break; | 
| 154 | 
  | 
                case 'f':                               /* format i/o */ | 
| 155 | 
  | 
                        switch (argv[i][2]) { | 
| 181 | 
  | 
                        break; | 
| 182 | 
  | 
                case 'h':                               /* header output */ | 
| 183 | 
  | 
                        rval = loadflags & IO_INFO; | 
| 184 | 
< | 
                        bool(2,rval); | 
| 184 | 
> | 
                        check_bool(2,rval); | 
| 185 | 
  | 
                        loadflags = rval ? loadflags | IO_INFO : | 
| 186 | 
  | 
                                        loadflags & ~IO_INFO; | 
| 187 | 
  | 
                        break; | 
| 195 | 
  | 
                                        tralp = tralist; | 
| 196 | 
  | 
                                } | 
| 197 | 
  | 
                                if (argv[i][2] == 'I') {        /* file */ | 
| 198 | 
< | 
                                        rval = wordfile(tralp, | 
| 198 | 
> | 
                                        rval = wordfile(tralp, MAXMODLIST-(tralp-tralist), | 
| 199 | 
  | 
                                        getpath(argv[++i],getrlibpath(),R_OK)); | 
| 200 | 
  | 
                                        if (rval < 0) { | 
| 201 | 
  | 
                                                sprintf(errmsg, | 
| 217 | 
  | 
                                        tralp = tralist; | 
| 218 | 
  | 
                                } | 
| 219 | 
  | 
                                if (argv[i][2] == 'E') {        /* file */ | 
| 220 | 
< | 
                                        rval = wordfile(tralp, | 
| 220 | 
> | 
                                        rval = wordfile(tralp, MAXMODLIST-(tralp-tralist), | 
| 221 | 
  | 
                                        getpath(argv[++i],getrlibpath(),R_OK)); | 
| 222 | 
  | 
                                        if (rval < 0) { | 
| 223 | 
  | 
                                                sprintf(errmsg, | 
| 316 | 
  | 
#endif | 
| 317 | 
  | 
        if (outform != 'a') | 
| 318 | 
  | 
                SET_FILE_BINARY(stdout); | 
| 319 | 
< | 
        readoct(octnm, loadflags, &thescene, NULL); | 
| 319 | 
> | 
        rval = setrtoutput(); | 
| 320 | 
> | 
        readoct(octname = octnm, loadflags, &thescene, NULL); | 
| 321 | 
  | 
        nsceneobjs = nobjects; | 
| 322 | 
  | 
 | 
| 323 | 
  | 
        if (loadflags & IO_INFO) {      /* print header */ | 
| 324 | 
  | 
                printargs(i, argv, stdout); | 
| 325 | 
  | 
                printf("SOFTWARE= %s\n", VersionID); | 
| 326 | 
  | 
                fputnow(stdout); | 
| 327 | 
+ | 
                if (rval > 0)           /* saved from setrtoutput() call */ | 
| 328 | 
+ | 
                        printf("NCOMP=%d\n", rval); | 
| 329 | 
+ | 
                if ((outform == 'f') | (outform == 'd')) | 
| 330 | 
+ | 
                        fputendian(stdout); | 
| 331 | 
  | 
                fputformat(formstr(outform), stdout); | 
| 332 | 
  | 
                putchar('\n'); | 
| 333 | 
  | 
        } | 
| 328 | 
– | 
         | 
| 329 | 
– | 
        ray_init_pmap();     /* PMAP: set up & load photon maps */ | 
| 330 | 
– | 
         | 
| 331 | 
– | 
        marksources();                  /* find and mark sources */ | 
| 334 | 
  | 
 | 
| 335 | 
< | 
        setambient();                   /* initialize ambient calculation */ | 
| 336 | 
< | 
         | 
| 335 | 
> | 
        if (!castonly) {        /* any actual ray traversal to do? */ | 
| 336 | 
> | 
 | 
| 337 | 
> | 
                ray_init_pmap();        /* PMAP: set up & load photon maps */ | 
| 338 | 
> | 
                 | 
| 339 | 
> | 
                marksources();          /* find and mark sources */ | 
| 340 | 
> | 
 | 
| 341 | 
> | 
                setambient();           /* initialize ambient calculation */ | 
| 342 | 
> | 
        } | 
| 343 | 
  | 
#ifdef  PERSIST | 
| 344 | 
  | 
        if (persist) { | 
| 345 | 
  | 
                fflush(stdout); | 
| 396 | 
  | 
        return 1; /* pro forma return */ | 
| 397 | 
  | 
 | 
| 398 | 
  | 
#undef  check | 
| 399 | 
< | 
#undef  bool | 
| 399 | 
> | 
#undef  check_bool | 
| 400 | 
  | 
} | 
| 401 | 
  | 
 | 
| 402 | 
  | 
 | 
| 488 | 
  | 
                case 't': case 'T': printf(" trace"); break; | 
| 489 | 
  | 
                case 'o': printf(" origin"); break; | 
| 490 | 
  | 
                case 'd': printf(" direction"); break; | 
| 491 | 
+ | 
                case 'r': printf(" reflect_contrib"); break; | 
| 492 | 
+ | 
                case 'R': printf(" reflect_length"); break; | 
| 493 | 
+ | 
                case 'x': printf(" unreflect_contrib"); break; | 
| 494 | 
+ | 
                case 'X': printf(" unreflect_length"); break; | 
| 495 | 
  | 
                case 'v': printf(" value"); break; | 
| 496 | 
  | 
                case 'V': printf(" contribution"); break; | 
| 497 | 
  | 
                case 'l': printf(" length"); break; |