home *** CD-ROM | disk | FTP | other *** search
/ Resource Library: Graphics / graphics-16000.iso / msdos / raytrace / rayshade / src / options.c < prev    next >
C/C++ Source or Header  |  1992-05-04  |  10KB  |  341 lines

  1. /*
  2.  * options.c
  3.  *
  4.  * Copyright (C) 1989, 1991, Craig E. Kolb
  5.  * All rights reserved.
  6.  *
  7.  * This software may be freely copied, modified, and redistributed
  8.  * provided that this copyright notice is preserved on all copies.
  9.  *
  10.  * You may not distribute this software, in whole or in part, as part of
  11.  * any commercial product without the express consent of the authors.
  12.  *
  13.  * There is no warranty or other guarantee of fitness of this software
  14.  * for any purpose.  It is provided solely "as is".
  15.  *
  16.  * $Id: options.c,v 4.0.1.3 92/01/14 18:29:59 cek Exp Locker: cek $
  17.  *
  18.  * $Log:    options.c,v $
  19.  * Revision 4.0.1.3  92/01/14  18:29:59  cek
  20.  * patch3: Added "-u" (cpp) option.
  21.  * 
  22.  * Revision 4.0.1.2  91/12/13  12:09:53  cek
  23.  * patch3: Fixed "-W" option typo.
  24.  * 
  25.  * Revision 4.0.1.1  91/10/05  18:23:15  cek
  26.  * patch1: Changes for new window/crop options.
  27.  * patch1: Corrected help message.
  28.  * 
  29.  * Revision 4.0  91/07/17  14:46:47  kolb
  30.  * Initial version.
  31.  * 
  32.  */
  33. #include "rayshade.h"
  34. #include "options.h"
  35. #include "stats.h"
  36. #include "viewing.h"
  37.  
  38. RSOptions    Options;
  39.  
  40. static void usage();
  41.  
  42. void
  43. RSOptionsSet(argc, argv)
  44. int argc;
  45. char **argv;
  46. {
  47.     extern void OpenStatsFile();
  48.  
  49.     Options.progname = strsave(argv[0]);
  50.     Options.inputname = (char *)NULL;
  51.  
  52.     while (--argc) {
  53.         argv++;
  54.         if (argv[0][0] != '-') {
  55.             /*
  56.              * Must be the input file name.
  57.              * If already given, complain and then exit.
  58.              */
  59.             if (Options.inputname != (char *)NULL) {
  60.                 usage();    
  61.                 exit(1);
  62.             }
  63.             Options.inputname = strsave(argv[0]);
  64.             continue;
  65.         }
  66.         /* else */
  67.         switch(argv[0][1]) {
  68.             case 'A':
  69.                 /*
  70.                  * First frame number
  71.                  */
  72.                 Options.startframe = atoi(argv[1]);
  73.                 argv++; argc--;
  74.                 break;
  75. #ifdef URT
  76.             case 'a':
  77.                 Options.alpha = !Options.alpha;
  78.                 break;
  79. #endif
  80.             case 'C':
  81.                 Options.cutoff.r = atof(argv[1]);
  82.                 Options.cutoff.g = atof(argv[2]);
  83.                 Options.cutoff.b = atof(argv[3]);
  84.                 Options.cutoff_set = TRUE;
  85.                 argv += 3; argc -= 3;
  86.                 break;
  87. #ifdef URT
  88.             case 'c':
  89.                 Options.appending = TRUE;
  90.                 break;
  91. #endif
  92.             case 'D':
  93.                 Options.maxdepth = atoi(argv[1]);
  94.                 Options.maxdepth_set = TRUE;
  95.                 argv++; argc--;
  96.                 break;
  97.             case 'E':
  98.                 Options.eyesep = atof(argv[1]);
  99.                 Options.eyesep_set = TRUE;
  100.                 argc--; argv++;
  101.                 break;
  102. #ifdef URT
  103.             case 'e':
  104.                 Options.exp_output = TRUE;
  105.                 break;
  106. #endif
  107.             case 'F':
  108.                 Options.report_freq = atoi(argv[1]);
  109.                 if (Options.report_freq < 1)
  110.                     Options.report_freq = 1;
  111.                 Options.freq_set = TRUE;
  112.                 argv++; argc--;
  113.                 break;
  114.             case 'f':
  115.                 Options.flipnorm = !Options.flipnorm;
  116.                 break;
  117.             case 'G':
  118.                 Options.gamma = atof(argv[1]);
  119.                 argv++; argc--;
  120.                 break;
  121.             case 'g':
  122.                 Options.gaussian = !Options.gaussian;
  123.                 break;
  124.             case 'h':
  125.                 usage();
  126.                 exit(0);
  127.                 break;
  128.             case 'j':
  129.                 Options.jitter = !Options.jitter;
  130.                 Options.jitter_set = TRUE;
  131.                 break;
  132.             case 'l':
  133.                 Options.stereo = LEFT;
  134.                 break;
  135. #ifdef URT
  136.             case 'm':
  137.                 Options.samplemap = !Options.samplemap;
  138.                 break;
  139. #endif
  140.             case 'N':
  141.                 Options.totalframes = atof(argv[1]);
  142.                 Options.totalframes_set = TRUE;
  143.                 argv++; argc--;
  144.                 break;
  145.             case 'n':
  146.                 Options.no_shadows = !Options.no_shadows;
  147.                 break;
  148.             case 'O':
  149.                 Options.imgname = strsave(argv[1]);
  150.                 argv++;
  151.                 argc--;
  152.                 break;
  153.             case 'o':
  154.                 Options.shadowtransp = !Options.shadowtransp;
  155.                 break;
  156.             case 'P':
  157. #ifdef __WATCOMC__
  158.                 Options.cpp=TRUE;
  159. #endif
  160.                 Options.cppargs = argv[1];
  161.                 argv++; argc--;
  162.                 break;
  163.             case 'p':
  164.                 /*
  165.                  * Preview-quality rendering
  166.                  * no shadows
  167.                  * max depth of 0
  168.                  * 1 jittered sample/pixel
  169.                  */
  170.                 Options.no_shadows = TRUE;
  171.                 Options.maxdepth = 0;
  172.                 Options.maxdepth_set = TRUE;
  173.                 Options.jitter = TRUE;
  174.                 Options.jitter_set = TRUE;
  175.                 Options.samples = 1;
  176.                 Options.samples_set = TRUE;
  177.                 break;
  178.             case 'q':
  179.                 Options.quiet = TRUE;
  180.                 break;
  181.             case 'R':
  182.                 Screen.xres = atoi(argv[1]);
  183.                 Screen.yres = atoi(argv[2]);
  184.                 Options.resolution_set = TRUE;
  185.                 argv += 2;
  186.                 argc -= 2;
  187.                 break;
  188.             case 'r':
  189.                 Options.stereo = RIGHT;
  190.                 break;
  191.             case 'S':
  192.                 Options.samples = atoi(argv[1]);
  193.                 if (Options.samples < 1)
  194.                     Options.samples = 1;
  195.                 Options.samples_set = TRUE;
  196.                 argv++; argc--;
  197.                 break;
  198.             case 's':
  199.                 Options.cache = !Options.cache;
  200.                 break;
  201.             case 'T':
  202.                 Options.contrast.r = atof(argv[1]);
  203.                 Options.contrast.g = atof(argv[2]);
  204.                 Options.contrast.b = atof(argv[3]);
  205.                 Options.contrast_set = TRUE;
  206.                 argv += 3;
  207.                 argc -= 3;
  208.                 break;
  209.             case 'u':
  210.                 Options.cpp = !Options.cpp;
  211.                 break;
  212.             case 'v':
  213.                 Options.verbose = TRUE;
  214.                 break;
  215.             case 'V':
  216.                 Options.verbose = TRUE;
  217.                 if (argv[1][0] == '-') {
  218.                     /* User probably blew it, and
  219.                      * it's difficult to remove a file
  220.                      * that begins with '-'...
  221.                      */
  222.                     usage();
  223.                     exit(2);
  224.                 }
  225.                 Options.statsname = strsave(argv[1]);
  226.                 OpenStatsFile();
  227.                 argv++; argc--;
  228.                 break;
  229.             case 'W':
  230.                 Options.window[LOW][X] = atoi(argv[1]);
  231.                 Options.window[HIGH][X] = atoi(argv[2]);
  232.                 Options.window[LOW][Y] = atoi(argv[3]);
  233.                 Options.window[HIGH][Y] = atoi(argv[4]);
  234.                 Options.window_set = TRUE;
  235.                 argv += 4; argc -= 4;
  236.                 break;
  237.             case 'X':
  238.                 Options.crop[LOW][X] = atof(argv[1]);
  239.                 Options.crop[HIGH][X] = atof(argv[2]);
  240.                 Options.crop[LOW][Y] = atof(argv[3]);
  241.                 Options.crop[HIGH][Y] = atof(argv[4]);
  242.                 Options.crop_set = TRUE;
  243.                 argv += 4; argc -= 4;
  244.                 break;
  245.             default:
  246.                 RLerror(RL_PANIC,"Bad argument: %s\n",argv[0]);
  247.         }
  248.     }
  249. }
  250.  
  251. void
  252. RSOptionsList()
  253. {
  254.     if (Options.totalframes > 1) {
  255.         fprintf(Stats.fstats,"Rendering frames %d through %d.\n",
  256.             Options.startframe, Options.endframe);
  257.     } else {
  258.         fprintf(Stats.fstats,"Rendering frame %d.\n", Options.startframe);
  259.     }
  260.  
  261.     fprintf(Stats.fstats,"Screen resolution: %d x %d\n",
  262.         Screen.xres,Screen.yres);
  263.     fprintf(Stats.fstats,"Image window: (%d - %d), (%d - %d).\n",
  264.             Screen.minx, Screen.maxx, Screen.miny, Screen.maxy);
  265.  
  266.     if (Options.jitter)
  267.         fprintf(Stats.fstats,"Using jittered sampling, ");
  268.     fprintf(Stats.fstats,"Max sampling rate %d %s/pixel.\n",
  269.         Options.samples*Options.samples,
  270.         Options.samples == 1 ? "sample" : "samples");
  271.  
  272.     fprintf(Stats.fstats,
  273.         "Maximum contrast: %g red, %g green, %g blue.\n",
  274.         Options.contrast.r, Options.contrast.g,
  275.         Options.contrast.b);
  276.     fprintf(Stats.fstats,"Maximum ray depth: %d.  Cutoff thresh: %g %g %g.\n",
  277.             Options.maxdepth,
  278.             Options.cutoff.r, Options.cutoff.g, Options.cutoff.b);
  279.     if (Options.stereo == LEFT)
  280.         fprintf(Stats.fstats,"Rendering image for left eye.\n");
  281.     else if (Options.stereo == RIGHT)
  282.         fprintf(Stats.fstats,"Rendering image for right eye.\n");
  283.     if (Options.no_shadows) {
  284.         fprintf(Stats.fstats,"No shadows are rendered.\n");
  285.     } else if (Options.shadowtransp) {
  286.         fprintf(Stats.fstats,
  287.             "Object opacity affects depth of shadowing.\n");
  288.     }
  289.     if (!Options.cache)
  290.         fprintf(Stats.fstats,"Shadow caching is disabled.\n");
  291.     if (Options.totalframes != 1)
  292.         fprintf(Stats.fstats,"Rendering %d frames.\n",
  293.             Options.totalframes);
  294. }
  295.  
  296. static void
  297. usage()
  298. {
  299.     fprintf(stderr,"usage: %s [options] [filename]\n", Options.progname);
  300.     fprintf(stderr,"Where options include:\n");
  301.     fprintf(stderr,"\t-A frame\t(Begin with given frame #.)\n");
  302. #ifdef URT
  303.     fprintf(stderr,"\t-a \t\t(Toggle writing of alpha channel.)\n");
  304. #endif
  305.     fprintf(stderr,"\t-C thresh\t(Set adaptive ray tree cutoff value.)\n");
  306. #ifdef URT
  307.     fprintf(stderr,"\t-c \t\t(Continue interrupted rendering.)\n");
  308. #endif
  309.     fprintf(stderr,"\t-D depth\t(Set maximum ray tree depth.)\n");
  310.     fprintf(stderr,"\t-E eye_sep\t(Set eye separation in stereo pairs.)\n");
  311. #ifdef URT
  312.     fprintf(stderr,"\t-e \t\t(Write exponential RLE file.)\n");
  313. #endif
  314.     fprintf(stderr,"\t-F freq\t\t(Set frequency of status report.)\n");
  315.     fprintf(stderr,"\t-f \t\t(Flip all triangle normals.)\n");
  316.     fprintf(stderr,"\t-G gamma\t(Use given gamma correction exponent.)\n");
  317.     fprintf(stderr,"\t-g \t\t(Use Gaussian pixel filter.)\n");
  318.     fprintf(stderr,"\t-h \t\t(Print this message.)\n");
  319.     fprintf(stderr,"\t-j \t\t(Toggle jittered sampling.)\n");
  320.     fprintf(stderr,"\t-l \t\t(Render image for left eye view.)\n");
  321. #ifdef URT
  322.     fprintf(stderr,"\t-m \t\t(Output sample map in alpha channel.)\n");
  323. #endif
  324.     fprintf(stderr,"\t-N number\t(Render given number of frames.)\n");
  325.     fprintf(stderr,"\t-n \t\t(Do not render shadows.)\n");
  326.     fprintf(stderr,"\t-O outfile \t(Set output file name.)\n");
  327.     fprintf(stderr,"\t-o \t\t(Toggle opacity effect on shadowing.)\n");
  328.     fprintf(stderr,"\t-P cpp-args\t(Options to pass to C pre-processor.\n");
  329.     fprintf(stderr,"\t-p \t\t(Preview-quality rendering.)\n");
  330.     fprintf(stderr,"\t-q \t\t(Run quietly.)\n");
  331.     fprintf(stderr,"\t-R xres yres\t(Render at given resolution.)\n");
  332.     fprintf(stderr,"\t-r \t\t(Render image for right eye view.)\n");
  333.     fprintf(stderr,"\t-S samples\t(Max density of samples^2 samples.)\n");
  334.     fprintf(stderr,"\t-s \t\t(Don't cache shadowing information.)\n");
  335.     fprintf(stderr,"\t-T r g b\t(Set contrast threshold (0. - 1.).)\n");
  336.     fprintf(stderr,"\t-V filename \t(Write verbose output to filename.)\n");
  337.     fprintf(stderr,"\t-v \t\t(Verbose output.)\n");
  338.     fprintf(stderr,"\t-W x x y y \t(Render subwindow.)\n");
  339.     fprintf(stderr,"\t-X l r b t \t(Crop window.)\n");
  340. }
  341.