home *** CD-ROM | disk | FTP | other *** search
/ Crawly Crypt Collection 2 / crawlyvol2.bin / graphics / ftpovstc / povray.c < prev    next >
C/C++ Source or Header  |  1994-07-25  |  38KB  |  6 lines

  1. /******************************************************************************  ATTENTION!!!**  THIS FILE HAS BEEN MODIFIED!!! IT IS NOT PART OF THE OFFICAL*  POV-RAY 2.2 DISTRIBUTION!!!**  THIS FILE IS PART OF "FASTER THAN POV-RAY" (VERSION 1.1),*  A SPED-UP VERSION OF POV-RAY 2.2. USE AT YOUR OWN RISK!!!!!!**  New files: addon0.c, addon1.c, addon2.c, addon3.c, addon.h**  The additional modules were written by Dieter Bayer.**  Send comments, suggestions, bugs, ideas ... to:**  dieter@cip.e-technik.uni-erlangen.de**  All changed/added lines are enclosed in #ifdef DB_CODE ... #endif**  The vista projection was taken from:**    A. Hashimoto, T. Akimoto, K. Mase, and Y. Suenaga, *    "Vista Ray-Tracing: High Speed Ray Tracing Using Perspective*    Projection Image", New Advances in Computer Graphics, Proceedings*    of CG International '89, R. A. Earnshaw, B. Wyvill (Eds.), *    Springer, ..., pp. 549-560**  The idea for the light buffer was taken from:**    E. Haines and D. Greenberg, "The Light Buffer: A Shadow-Testing *    Accelerator", IEEE CG&A, Vol. 6, No. 9, Sept. 1986, pp. 6-16******************************************************************************//*****************************************************************************                povray.c**  This module contains the entry routine for the raytracer and the code to*  parse the parameters on the command line.**  from Persistence of Vision Raytracer*  Copyright 1993 Persistence of Vision Team*---------------------------------------------------------------------------*  NOTICE: This source code file is provided so that users may experiment*  with enhancements to POV-Ray and to port the software to platforms other *  than those supported by the POV-Ray Team.  There are strict rules under*  which you are permitted to use this file.  The rules are in the file*  named POVLEGAL.DOC which should be distributed with this file. If *  POVLEGAL.DOC is not available or for more info please contact the POV-Ray*  Team Coordinator by leaving a message in CompuServe's Graphics Developer's*  Forum.  The latest version of POV-Ray may be found there as well.** This program is based on the popular DKB raytracer version 2.12.* DKBTrace was originally written by David K. Buck.* DKBTrace Ver 2.0-2.12 were written by David K. Buck & Aaron A. Collins.******************************************************************************/#include <ctype.h>#include <time.h>          /* BP */#include "frame.h"        /* common to ALL modules in this program */#include "povproto.h"#ifdef DB_CODE#include "addon.h"#endif#define MAX_FILE_NAMES 1unsigned int Options;unsigned long Quality_Flags;int Quality,Use_Slabs;int Case_Sensitive_Flag = CASE_SENSITIVE_DEFAULT;#ifdef DB_CODEextern unsigned long nChecked, nEnqueued;extern unsigned long Project_Tests, Project_Tests_Succeeded;extern unsigned Extended_Options, Project_Algorithm;#endifextern FRAME Frame;OBJECT *Root_Object;char Input_File_Name[FILE_NAME_LENGTH], Output_File_Name[FILE_NAME_LENGTH], Stat_File_Name[FILE_NAME_LENGTH];#define MAX_LIBRARIES 10char *Library_Paths[MAX_LIBRARIES];int Library_Path_Index;int Max_Symbols = 1000;FILE_HANDLE *Output_File_Handle;int File_Buffer_Size;static int Number_Of_Files;static int inflag, outflag; DBL VTemp;DBL Antialias_Threshold;int First_Line, Last_Line;int First_Column, Last_Column;DBL First_Column_Temp, Last_Column_Temp;DBL First_Line_Temp, Last_Line_Temp;int Display_Started = FALSE;int Shadow_Test_Flag = FALSE;DBL Clock_Value = 0.0;DBL Language_Version = 2.0;long Bounds_Threshold = 0;long AntialiasDepth = 3;DBL JitterScale = 1.0;/* Quality constants */  long Quality_Values[10]=    {    QUALITY_0, QUALITY_1, QUALITY_2, QUALITY_3, QUALITY_4,    QUALITY_5, QUALITY_6, QUALITY_7, QUALITY_8, QUALITY_9    };/* Stats kept by the ray tracer: */long Number_Of_Pixels, Number_Of_Rays, Number_Of_Pixels_Supersampled;long Ray_Sphere_Tests, Ray_Sphere_Tests_Succeeded;long Ray_Box_Tests, Ray_Box_Tests_Succeeded;    long Ray_Blob_Tests, Ray_Blob_Tests_Succeeded;  long Ray_Cone_Tests, Ray_Cone_Tests_Succeeded;long Ray_Disc_Tests, Ray_Disc_Tests_Succeeded;long Ray_Plane_Tests, Ray_Plane_Tests_Succeeded;long Ray_Triangle_Tests, Ray_Triangle_Tests_Succeeded;long Ray_Quadric_Tests, Ray_Quadric_Tests_Succeeded;long Ray_Poly_Tests, Ray_Poly_Tests_Succeeded;long Ray_Bicubic_Tests, Ray_Bicubic_Tests_Succeeded;long Ray_Ht_Field_Tests, Ray_Ht_Field_Tests_Succeeded;long Ray_Ht_Field_Box_Tests, Ray_HField_Box_Tests_Succeeded;long Bounding_Region_Tests, Bounding_Region_Tests_Succeeded;long Clipping_Region_Tests, Clipping_Region_Tests_Succeeded;long Calls_To_Noise, Calls_To_DNoise;/* SJA */long Shadow_Ray_Tests, Shadow_Rays_Succeeded, Shadow_Cache_Hits;/* SJA */long Reflected_Rays_Traced, Refracted_Rays_Traced;long Transmitted_Rays_Traced;long Istack_overflows;int Number_of_istacks;int Max_Intersections;ISTACK *free_istack;DBL    tused;             /* Trace timer variables. - BP */time_t tstart, tstop;char DisplayFormat, OutputFormat, VerboseFormat, PaletteOption, Color_Bits;struct Constant_Struct Constants[MAX_CONSTANTS];#ifdef NOCMDLINE    /* a main() by any other name... */#ifdef ALTMAIN  MAIN_RETURN_TYPE alt_main()#else  MAIN_RETURN_TYPE main()#endif#else#ifdef ALTMAIN  MAIN_RETURN_TYPE alt_main(argc, argv)#else  MAIN_RETURN_TYPE main(argc, argv)#endif    int argc;char **argv;#endif            /* ...would be a lot less hassle!! :-) AAC */  {  register int i;  FILE *stat_file;  STARTUP_POVRAY  PRINT_CREDITS  PRINT_OTHER_CREDITS  /* Parse the command line parameters */#ifndef NOCMDLINE  if (argc == 1)    usage();#endif  init_vars();  Output_File_Name[0]='\0';  Library_Paths[0] = NULL;  Library_Path_Index = 0;  /* Read the default parameters from povray.def */  get_defaults();#ifndef NOCMDLINE  for (i = 1 ; i < argc ; i++ )    if ((*argv[i] == '+') || (*argv[i] == '-'))      parse_option(argv[i]);    else      parse_file_name(argv[i]);#endif  if (Last_Line == -1)    Last_Line = Frame.Screen_Height;  if (Last_Column == -1)    Last_Column = Frame.Screen_Width;  if (Options & DISKWRITE)     {    switch (OutputFormat)     {    case '\0':    case 'd':    case 'D':      if ((Output_File_Handle = Get_Dump_File_Handle()) == NULL)         {        close_all();        exit(1);        }      break;      /*         case 'i':         case 'I':                   if ((Output_File_Handle = Get_Iff_File_Handle()) == NULL) {                      close_all();                      exit(1);                      }                   break;*/    case 'r':    case 'R':      if ((Output_File_Handle = Get_Raw_File_Handle()) == NULL)        {        close_all();        exit(1);        }      break;    case 't':    case 'T':      if ((Output_File_Handle = Get_Targa_File_Handle()) == NULL)     {        close_all();        exit(1);    }      break;    default:      fprintf (stderr, "Unrecognized output file format %c\n", OutputFormat);      close_all();       exit(1);    }    if (Output_File_Name[0] == '\0')      strcpy (Output_File_Name, Default_File_Name (Output_File_Handle));    }  Print_Options();  Initialize_Tokenizer(Input_File_Name);  fprintf (stderr,"\nParsing...");  if (Options & VERBOSE_FILE)    {    stat_file = fopen(Stat_File_Name,"w+t");    fprintf (stat_file, "\nParsing...\n");    fclose(stat_file);    }  Parse ();  Terminate_Tokenizer();#ifdef DB_CODE  /* Init additional stuff BEFORE the bounding slabs are build. */  Init_Additionals_1();#endif  if (Use_Slabs)    {    fprintf (stderr, "Preprocessing...\n");  /* Added */    BuildBoundingSlabs(&Root_Object);        /* Added */    }#ifdef DB_CODE  /* Init additional stuff AFTER the bounding slabs are build. */  Init_Additionals_2();#endif  if (Options & DISPLAY)    {    printf ("Displaying...\n");    display_init(Frame.Screen_Width, Frame.Screen_Height);    Display_Started = TRUE;    }#ifdef DB_CODE  /* Draw rectangles around the projected objects */  if ((Options & DISPLAY) && (Extended_Options & USE_PREVIEW))  {    Draw_Vista_Tree();  }#endif  /* Get things ready for ray tracing */  if (Options & DISKWRITE)    if (Options & CONTINUE_TRACE)    {    if (Open_File (Output_File_Handle, Output_File_Name,      &Frame.Screen_Width, &Frame.Screen_Height, File_Buffer_Size,      READ_MODE) != 1)      {      fprintf (stderr, "Error opening continue trace output file\n");      fprintf (stderr, "Opening new output file %s.\n",Output_File_Name);      Options &= ~CONTINUE_TRACE; /* Turn off continue trace */      if (Open_File (Output_File_Handle, Output_File_Name,    &Frame.Screen_Width, &Frame.Screen_Height, File_Buffer_Size,    WRITE_MODE) != 1)    {    fprintf (stderr, "Error opening output file\n");    close_all();    exit(1);    }      }    Initialize_Renderer();    if (Options & CONTINUE_TRACE)      Read_Rendered_Part();    }    else    {    if (Open_File (Output_File_Handle, Output_File_Name,      &Frame.Screen_Width, &Frame.Screen_Height, File_Buffer_Size,      WRITE_MODE) != 1)      {      fprintf (stderr, "Error opening output file\n");      close_all();      exit(1);      }    Initialize_Renderer();    }  else    Initialize_Renderer();  Initialize_Noise();  START_TIME  /* Store start time for trace. Timer macro in CONFIG.H */  /* Ok, go for it - trace the picture */  if ((Options & VERBOSE) && (VerboseFormat !='1'))    printf ("Rendering...\n");  else if ((Options & VERBOSE) && (VerboseFormat=='1'))    fprintf (stderr,"\nRendering %s to %s\n",Input_File_Name,Output_File_Name);  if (Options & VERBOSE_FILE)    {    stat_file = fopen(Stat_File_Name,"w+t");    fprintf (stat_file,"Parsed ok. Now rendering %s to %s\n",Input_File_Name,Output_File_Name);    fclose(stat_file);    }  CONFIG_MATH               /* Macro for setting up any special FP options */  Start_Tracing ();  if (Options & VERBOSE && VerboseFormat=='1')    fprintf (stderr,"\n");  /* Record the time so well spent... */  STOP_TIME                  /* Get trace done time. */  tused = TIME_ELAPSED       /* Calc. elapsed time. Define TIME_ELAPSED as */  /* 0 in your specific CONFIG.H if unsupported */  /* Clean up and leave */  display_finished();  close_all ();  PRINT_STATS  if (Options & VERBOSE_FILE)    {    stat_file = fopen(Stat_File_Name,"a+t");    fprintf (stat_file,"Done Tracing\n");    fclose(stat_file);    }  FINISH_POVRAY  }/* Print out usage error message */void usage ()  {  fprintf (stdout,"\nUsage: POVRAY  [+/-] Option1 [+/-] Option2 ...");  fprintf (stdout,"\n  Example: +L\\povray\\include +Iscene.pov +Oscene.tga +W320 +H200");  fprintf (stdout,"\n  Example: +Iscene.pov +Oscene.tga +W160 +H200 +V -D +X ");  fprintf (stdout,"\n");  fprintf (stdout,"\n[ Paused for keypress... ]\n");  WAIT_FOR_KEYPRESS;  fprintf (stdout,"\n\n\n\n\n Options:");  fprintf (stdout,"\n    Dxy = display in format x, using palette option y");  fprintf (stdout,"\n    V   = verbose messages on");  fprintf (stdout,"\n    P  = pause before exit");  fprintf (stdout,"\n    X  = enable early exit by key hit");  fprintf (stdout,"\n    Fx = write output file in format x");  fprintf (stdout,"\n         FT - Uncompressed Targa-24  |  FD - DKB/QRT Dump  | FR - RGB Raw Files");  fprintf (stdout,"\n    C  = continue aborted trace");  fprintf (stdout,"\n    Qx = image quality 0=rough, 9=full");  fprintf (stdout,"\n    A0.x = perform antialiasing");  fprintf (stdout,"\n    Bxxx = Use xxx KB for output file buffer");  fprintf (stdout,"\n    Jx.x = set aa-jitter amount");  fprintf (stdout,"\n    Kx.x = set frame clocK to x.x");  fprintf (stdout,"\n    MBxxx = use slabs if more than xxx objects");  fprintf (stdout,"\n    MSxxx = set max symbol table size to xxx");  fprintf (stdout,"\n    MVx.x = set compability to version x.x");  fprintf (stdout,"\n    Rn   = set aa-depth (use n X n rays/pixel)");  fprintf (stdout,"\n    SRxx = start at row xxx         |  SR0.xx start row at x%% of screen");  fprintf (stdout,"\n    ERxx = end   at row xxx         |  ER0.xx end   row at x%% of screen");  fprintf (stdout,"\n    SCxx = start at col xxx         |  SC0.xx start col at x%% of screen");  fprintf (stdout,"\n    ECxx = end   at col xxx         |  EC0.xx end   col at x%% of screen");  fprintf (stdout,"\n    I<filename> = input file name   |  O<filename> = output file name");  fprintf (stdout,"\n    L<pathname> = library path prefix");#ifdef DB_CODE  /* Print the new options */  fprintf (stdout,"\n[ Paused for keypress... ]\n");  WAIT_FOR_KEYPRESS;  fprintf (stdout,"\n Non-Standard Options:");  fprintf (stdout,"\n    UVB = use vista buffer for primary rays");  fprintf (stdout,"\n    ULB = use light buffer for shadow rays");  fprintf (stdout,"\n    USF = use splitting of CSG unions with finite children");  fprintf (stdout,"\n    USI = use splitting of all CSG unions");  fprintf (stdout,"\n    UBQ = use bounding of quadrics");  fprintf (stdout,"\n    UPV = use preview");  fprintf (stdout,"\n    UM1 = use vista/light buffer without slab-testing");  fprintf (stdout,"\n    UM2 = use vista/light with leaf slab-testing");  fprintf (stdout,"\n    UM3 = use vista/light with node slab-testing");#endif  fprintf (stdout,"\n");  exit(1);  }void init_vars()  {  Output_File_Handle = NULL;  File_Buffer_Size = 0;  Options = JITTER;  Quality_Flags = QUALITY_9;  Quality = 9;  Use_Slabs=TRUE;  Number_Of_Files = 0;  Frame.Screen_Height = 100;  Frame.Screen_Width = 100;  First_Line = 0;  Last_Line = -1;  First_Column = 0;  Last_Column = -1;  First_Line_Temp = (DBL) First_Line+1;  Last_Line_Temp = (DBL) Last_Line;  First_Column_Temp = (DBL) First_Column+1;  Last_Column_Temp = (DBL) Last_Column;  Color_Bits = 8;  Number_Of_Pixels = 0L;  Number_Of_Rays = 0L;  Number_Of_Pixels_Supersampled = 0L;  Ray_Ht_Field_Tests = 0L;  Ray_Ht_Field_Tests_Succeeded = 0L;  Ray_Ht_Field_Box_Tests = 0L;  Ray_HField_Box_Tests_Succeeded = 0L;  Ray_Bicubic_Tests = 0L;  Ray_Bicubic_Tests_Succeeded = 0L;  Ray_Blob_Tests = 0L;  Ray_Blob_Tests_Succeeded = 0L;  Ray_Box_Tests = 0L;  Ray_Box_Tests_Succeeded = 0L;  Ray_Disc_Tests = 0L;  Ray_Disc_Tests_Succeeded = 0L;  Ray_Cone_Tests = 0L;  Ray_Cone_Tests_Succeeded = 0L;  Ray_Sphere_Tests = 0L;  Ray_Sphere_Tests_Succeeded = 0L;  Ray_Plane_Tests = 0L;  Ray_Plane_Tests_Succeeded = 0L;  Ray_Triangle_Tests = 0L;  Ray_Triangle_Tests_Succeeded = 0L;  Ray_Quadric_Tests = 0L;  Ray_Quadric_Tests_Succeeded = 0L;  Ray_Poly_Tests = 0L;  Ray_Poly_Tests_Succeeded = 0L;  Bounding_Region_Tests = 0L;  Bounding_Region_Tests_Succeeded = 0L;  Clipping_Region_Tests = 0L;  Clipping_Region_Tests_Succeeded = 0L;  Calls_To_Noise = 0L;  Calls_To_DNoise = 0L;  Shadow_Ray_Tests = 0L;  /* SJA */  Shadow_Cache_Hits = 0L;  /* SJA */  Shadow_Rays_Succeeded = 0L;  Reflected_Rays_Traced = 0L;  Refracted_Rays_Traced = 0L;  Transmitted_Rays_Traced = 0L;  Istack_overflows = 0L;  Number_of_istacks = 0;  free_istack = NULL;  Max_Intersections = 64; /*128*/  Antialias_Threshold = 0.3;  strcpy (Input_File_Name, "object.pov");  return;  }/* Close all the stuff that has been opened. */void close_all ()  {  if ((Options & DISPLAY) && Display_Started)    display_close();  if (Output_File_Handle)    Close_File (Output_File_Handle);  }/* Read the default parameters from povray.def */void get_defaults()  {  FILE *defaults_file;  char Option_String[256], *Option_String_Ptr;  /* READ_ENV_VAR_? should be defined in config.h */  /* Only one READ_ENV_VAR_? should ever be defined. */  /* This allows some machines to read environment variable before */  /* reading povray.def and others to do it after depending on the */  /* operating system. IBM-PC is before. Default is after if not */  /* defined in config.h. CDW 2/92 */  /* Set Diskwrite as default */  Options |= DISKWRITE;  OutputFormat = DEFAULT_OUTPUT_FORMAT;  READ_ENV_VAR_BEFORE  if ((defaults_file = Locate_File("povray.def", "r")) != NULL)     {    while (fgets(Option_String, 256, defaults_file) != NULL)      read_options(Option_String);    fclose (defaults_file);    }  READ_ENV_VAR_AFTER  }void read_options (Option_Line)char *Option_Line;  {  register int c, String_Index, Option_Started;  short Option_Line_Index = 0;  char Option_String[80];  String_Index = 0;  Option_Started = FALSE;  while ((c = Option_Line[Option_Line_Index++]) != '\0')    {    if (Option_Started)      if (isspace(c))        {        Option_String[String_Index] = '\0';        parse_option (Option_String);        Option_Started = FALSE;        String_Index = 0;        }      else        Option_String[String_Index++] = (char) c;    else /* Option_Started */      if ((c == (int) '-') || (c == (int) '+'))        {        String_Index = 0;        Option_String[String_Index++] = (char) c;    Option_Started = TRUE;        }      else        if (!isspace(c))      {          fprintf (stderr,             "\nCommand line or .DEF error. Bad character (%c), val: %d.\n",             (char) c, c);          exit (1);          }    }  if (Option_Started)    {    Option_String[String_Index] = '\0';    parse_option (Option_String);    }  }/* parse the command line parameters */void parse_option (Option_String)char *Option_String;  {  register int Add_Option;  unsigned int Option_Number;  long bounds_thresh;  DBL threshold;  inflag = outflag = FALSE;   /* if these flags aren't immediately used, reset them on next -/+ option! */  if (*(Option_String++) == '-')    Add_Option = FALSE;  else    Add_Option = TRUE;  Option_Number = 0;  switch (*Option_String)  {  case 'B':  case 'b':    sscanf (&Option_String[1], "%d", &File_Buffer_Size);    File_Buffer_Size *= 1024;    if (File_Buffer_Size < BUFSIZ)   /* system default MIN */      File_Buffer_Size = BUFSIZ;    if (File_Buffer_Size > MAX_BUFSIZE)    /* unsigned short MAX */      File_Buffer_Size = MAX_BUFSIZE;    break;  case 'C':  case 'c':      Option_Number = CONTINUE_TRACE;    break;  case 'D':  case 'd':      Option_Number = DISPLAY;    DisplayFormat = '0';    PaletteOption = '3';    if (Option_String[1] != '\0')      DisplayFormat = (char)toupper(Option_String[1]);    if (Option_String[1] != '\0' && Option_String[2] != '\0')      PaletteOption = (char)toupper(Option_String[2]);    break;  case '@':      Option_Number = VERBOSE_FILE;    if(Option_String[1] == '\0')      strcpy(Stat_File_Name, "POVSTAT.OUT");    else      strncpy (Stat_File_Name, &Option_String[1], FILE_NAME_LENGTH);    break;  case 'V':  case 'v':    Option_Number = VERBOSE;    VerboseFormat = (char)toupper(Option_String[1]);    if (VerboseFormat == '\0')      VerboseFormat = '1';    break;  case 'W':  case 'w':      sscanf (&Option_String[1], "%d", &Frame.Screen_Width);    break;  case 'H':  case 'h':      sscanf (&Option_String[1], "%d", &Frame.Screen_Height);    break;  case 'F':  case 'f':      Option_Number = DISKWRITE;    if (isupper(Option_String[1]))      OutputFormat = (char)tolower(Option_String[1]);    else      OutputFormat = Option_String[1];    /* Default the output format to the default in the config file */    if (OutputFormat == '\0')      OutputFormat = DEFAULT_OUTPUT_FORMAT;    break;  case 'P':  case 'p':    Option_Number = PROMPTEXIT;    break;  case 'I':  case 'i':      if (Option_String[1] == '\0')      inflag = TRUE;    else       strncpy (Input_File_Name, &Option_String[1], FILE_NAME_LENGTH);    break;  case 'O':  case 'o':      if (Option_String[1] == '\0')      outflag = TRUE;    else      strncpy (Output_File_Name, &Option_String[1], FILE_NAME_LENGTH);    break;  case 'A':  case 'a':      Option_Number = ANTIALIAS;    if (sscanf (&Option_String[1], DBL_FORMAT_STRING, &threshold) != EOF)      Antialias_Threshold = threshold;    break;  case 'J':  case 'j':    Option_Number = JITTER;    if (sscanf (&Option_String[1], DBL_FORMAT_STRING, &threshold) != EOF)       JitterScale = threshold;    if (JitterScale<=0.0)       Add_Option = FALSE;    break;   case 'R':  case 'r':      sscanf (&Option_String[1], "%ld", &AntialiasDepth);    if (AntialiasDepth < 1)      AntialiasDepth = 1;    if (AntialiasDepth > 9)      AntialiasDepth = 9;    break;  case 'X':  case 'x':    Option_Number = EXITENABLE;    break;  case 'L':  case 'l':      if (Library_Path_Index >= MAX_LIBRARIES)       {      fprintf (stderr, "Too many library directories specified\n");      exit(1);      }    Library_Paths [Library_Path_Index] = malloc (strlen(Option_String));    if (Library_Paths [Library_Path_Index] == NULL)       {      fprintf (stderr, "Out of memory. Cannot allocate memory for library pathname\n");      exit(1);      }    strcpy (Library_Paths [Library_Path_Index], &Option_String[1]);    Library_Path_Index++;    break;  case 'T':  case 't':      switch (toupper(Option_String[1]))    {    case 'Y':      Case_Sensitive_Flag = 0;      break;    case 'N':      Case_Sensitive_Flag = 1;      break;    case 'O':      Case_Sensitive_Flag = 2;      break;    default:      Case_Sensitive_Flag = 2;      break;    }      break;  case 'S':  case 's':      switch (Option_String[1])    {    case 'c':    case 'C':      sscanf (&Option_String[2], DBL_FORMAT_STRING, &First_Column_Temp);      break;    case 'r':     case 'R':      sscanf (&Option_String[2], DBL_FORMAT_STRING, &First_Line_Temp);      break;    default:      sscanf (&Option_String[1], DBL_FORMAT_STRING, &First_Line_Temp);      break;    }    if(First_Column_Temp > 0.0 && First_Column_Temp < 1.0)      First_Column = (int) (Frame.Screen_Width * First_Column_Temp);    else      First_Column = (int) First_Column_Temp-1;    if(First_Line_Temp > 0.0 && First_Line_Temp < 1.0)      First_Line = (int) (Frame.Screen_Height * First_Line_Temp);    else      First_Line = (int) First_Line_Temp-1;    if (First_Column < 0)      First_Column = 0;    if (First_Line < 0)      First_Line = 0;    break;  case 'E':  case 'e':     switch (Option_String[1])    {    case 'c':     case 'C':      sscanf (&Option_String[2], DBL_FORMAT_STRING, &Last_Column_Temp);      break;    case 'r':     case 'R':      sscanf (&Option_String[2], DBL_FORMAT_STRING, &Last_Line_Temp);      break;    default:      sscanf (&Option_String[1], DBL_FORMAT_STRING, &Last_Line_Temp);      break;    }    if(Last_Column_Temp > 0.0 && Last_Column_Temp < 1.0)      Last_Column = (int) (Frame.Screen_Width * Last_Column_Temp);    else      Last_Column = (int) Last_Column_Temp;    if(Last_Line_Temp > 0.0 && Last_Line_Temp < 1.0)      Last_Line = (int) (Frame.Screen_Height * Last_Line_Temp);    else      Last_Line = (int) Last_Line_Temp;    if (Last_Column < 0 || Last_Column > Frame.Screen_Width)      Last_Column = Frame.Screen_Width;    if (Last_Line > Frame.Screen_Height)      Last_Line = Frame.Screen_Height;    break;  case 'M': /* Switch used so other max values can be inserted easily */  case 'm':      switch (Option_String[1])    {    case 's': /* Max Symbols */    case 'S':      sscanf (&Option_String[2], "%d", &Max_Symbols);      break;    case 'v': /* Max Version */    case 'V':      sscanf (&Option_String[2], DBL_FORMAT_STRING, &Language_Version);      break;    case 'b': /* Min Bounded */    case 'B':      if (sscanf (&Option_String[2], "%ld", &bounds_thresh) != EOF)    Bounds_Threshold=bounds_thresh;      Use_Slabs = Add_Option;      break;    default:      break;    }    break;  case 'Q':  case 'q':    sscanf (&Option_String[1], "%d", &Quality);    if ((Quality < 0) || (Quality > 9))      Error("Illegal +Q switch setting");    Quality_Flags = Quality_Values[Quality];    break;    /* Turn on debugging print statements. */  case 'Z':  case 'z':    Option_Number = DEBUGGING;    break;    /* +Y switch to remain undocumented.  Add to +Q later */  case 'Y':  case 'y':    Use_Slabs = Add_Option;    break;  case 'K':  case 'k':    sscanf (&Option_String[1], DBL_FORMAT_STRING, &Clock_Value);    break;#ifdef DB_CODE  /* Get new options */  case 'U':  case 'u':    if (((Option_String[1] == 'L') || (Option_String[1] == 'l')) &&    ((Option_String[2] == 'B') || (Option_String[2] == 'b')))    {      Option_Number = USE_LIGHT_BUFFER;    }    if (((Option_String[1] == 'V') || (Option_String[1] == 'v')) &&    ((Option_String[2] == 'B') || (Option_String[2] == 'b')))    {      Option_Number = USE_VISTA_BUFFER;    }    if (((Option_String[1] == 'S') || (Option_String[1] == 's')) &&    ((Option_String[2] == 'F') || (Option_String[2] == 'f')))    {      Option_Number = USE_SPLIT_FINITE_UNIONS;    }    if (((Option_String[1] == 'S') || (Option_String[1] == 's')) &&    ((Option_String[2] == 'I') || (Option_String[2] == 'i')))    {      Option_Number = USE_SPLIT_INFINITE_UNIONS;    }    if (((Option_String[1] == 'B') || (Option_String[1] == 'b')) &&    ((Option_String[2] == 'Q') || (Option_String[2] == 'q')))    {      Option_Number = USE_BOUND_QUADRICS;    }    if (((Option_String[1] == 'P') || (Option_String[1] == 'p')) &&    ((Option_String[2] == 'V') || (Option_String[2] == 'v')))    {      Option_Number = USE_PREVIEW;    }    if ((Option_String[1] == 'M') || (Option_String[1] == 'm'))    {      switch (Option_String[2])      {    case '1' : Project_Algorithm = PROJECTIONS_WITHOUT_SLABS;           break;    case '2' : Project_Algorithm = PROJECTIONS_WITH_LEAF_SLABS;           break;    case '3' : Project_Algorithm = PROJECTIONS_WITH_NODE_SLABS;           break;    default  : Project_Algorithm = PROJECTIONS_WITH_LEAF_SLABS;           fprintf(stderr, "\nUnknown tree-descending-method: %c\n\n", Option_String[2]);      }    }    if (Option_Number != 0)    {      if (Add_Option)    Extended_Options |= Option_Number;      else    Extended_Options &= ~Option_Number;    }    Option_Number = 0;    break;#endif  default:    fprintf (stderr, "\nInvalid option: %s\n\n", --Option_String);  }  if (Option_Number != 0)    if (Add_Option)      Options |= Option_Number;    else Options &= ~Option_Number;  }  void Print_Options()    {    int i;    fprintf (stdout,"\nOptions:\n");#ifdef DB_CODE    /* print new options used */    if (Extended_Options & USE_VISTA_BUFFER)      fprintf(stdout, "+uvb ");    if (Extended_Options & USE_LIGHT_BUFFER)      fprintf(stdout, "+ulb ");    if (Extended_Options & USE_SPLIT_FINITE_UNIONS)      fprintf(stdout, "+usf ");    if (Extended_Options & USE_SPLIT_INFINITE_UNIONS)      fprintf(stdout, "+usi ");    if (Extended_Options & USE_BOUND_QUADRICS)      fprintf(stdout, "+ubq ");    if (Extended_Options & USE_PREVIEW)      fprintf(stdout, "+upv ");    if (Project_Algorithm)      fprintf(stdout, "-um%d ", Project_Algorithm);#endif    if (Options & CONTINUE_TRACE)      fprintf (stdout,"+c ");    if (Options & DISPLAY)      fprintf (stdout,"+d%c%c ", DisplayFormat, PaletteOption);    if (Options & VERBOSE)      fprintf (stdout,"+v%c ", VerboseFormat);    if (Options & VERBOSE_FILE)      fprintf (stdout,"+@%s ", Stat_File_Name);    if (Options & DISKWRITE)      fprintf (stdout,"+f%c ", OutputFormat);    if (Options & PROMPTEXIT)      fprintf (stdout,"+p ");    if (Options & EXITENABLE)      fprintf (stdout,"+x ");
  2.     fprintf (stdout,"\n");
  3.     if (Use_Slabs)      fprintf (stdout,"+mb%d ", Bounds_Threshold);    else      fprintf (stdout,"-mb ");    if (Options & DEBUGGING)      fprintf (stdout,"+z ");    if (File_Buffer_Size != 0)      fprintf (stdout,"-b%d ", File_Buffer_Size/1024);    if (Options & ANTIALIAS)      {      fprintf (stdout,"+a%.3f ", Antialias_Threshold);      if (Options & JITTER)        fprintf (stdout,"+j%.3f ", JitterScale);      fprintf (stdout,"+r%ld ",AntialiasDepth);      }    /* quality flags rewrite in progress by CEY */    fprintf (stdout,"-q%d -w%d -h%d -s%d -e%d ",Quality,      Frame.Screen_Width, Frame.Screen_Height, First_Line+1, Last_Line);    fprintf (stdout, "-k%.3f -mv%.1f\n-i%s ", Clock_Value, Language_Version,      Input_File_Name);    if (Options & DISKWRITE)      fprintf (stdout,"-o%s\n", Output_File_Name);    for (i = 0 ; i < Library_Path_Index ; i++)      fprintf (stdout,"-l%s ", Library_Paths[i]);    fprintf (stdout,"\n");    }void parse_file_name (File_Name)char *File_Name;  {  FILE *defaults_file;  char Option_String[256];  if (inflag)   /* file names may now be separated by spaces from cmdline option */    {    strncpy (Input_File_Name, File_Name, FILE_NAME_LENGTH);    inflag = FALSE;    return;    }  if (outflag)  /* file names may now be separated by spaces from cmdline option */    {    strncpy (Output_File_Name, File_Name, FILE_NAME_LENGTH);    outflag = FALSE;    return;    }  if (++Number_Of_Files > MAX_FILE_NAMES)    {    fprintf (stderr, "\nOnly %d option file names are allowed in a command line.",      MAX_FILE_NAMES);    exit(1);    }  if ((defaults_file = Locate_File(File_Name, "r")) != NULL)     {    while (fgets(Option_String, 256, defaults_file) != NULL)      read_options(Option_String);    fclose (defaults_file);    }  else    printf("\nError opening option file %s.",File_Name);    }void print_stats()  {  long hours,min;  DBL sec;  FILE *stat_out;  long Pixels_In_Image;  if (Options & VERBOSE_FILE)    stat_out = fopen(Stat_File_Name,"w+t");  else    stat_out = stdout;    Pixels_In_Image = (long)Frame.Screen_Width * (long)Frame.Screen_Height;  fprintf (stat_out,"\n%s statistics\n",Input_File_Name);  if(Pixels_In_Image > Number_Of_Pixels)    fprintf (stat_out,"  Partial Image Rendered");  fprintf (stat_out,"--------------------------------------\n");  fprintf (stat_out,"Resolution %d x %d\n",Frame.Screen_Width, Frame.Screen_Height);  fprintf (stat_out,"# Rays:  %10ld    # Pixels:  %10ld  # Pixels supersampled: %10ld\n",    Number_Of_Rays, Number_Of_Pixels, Number_Of_Pixels_Supersampled);  fprintf (stat_out,"  Ray->Shape Intersection Tests:\n");  fprintf (stat_out,"   Type             Tests    Succeeded   Percentage\n");  fprintf (stat_out,"  -----------------------------------------------------------\n");  if(Ray_Sphere_Tests)    fprintf (stat_out,"  Sphere       %10ld  %10ld  %10.2f\n", Ray_Sphere_Tests, Ray_Sphere_Tests_Succeeded, ( ((DBL)Ray_Sphere_Tests_Succeeded/(DBL)Ray_Sphere_Tests) *100.0 ) );  if(Ray_Plane_Tests)    fprintf (stat_out,"  Plane        %10ld  %10ld  %10.2f\n", Ray_Plane_Tests, Ray_Plane_Tests_Succeeded, ( ((DBL)Ray_Plane_Tests_Succeeded/(DBL)Ray_Plane_Tests) *100.0 ));  if(Ray_Triangle_Tests)    fprintf (stat_out,"  Triangle     %10ld  %10ld  %10.2f\n", Ray_Triangle_Tests, Ray_Triangle_Tests_Succeeded, ( ((DBL)Ray_Triangle_Tests_Succeeded/(DBL)Ray_Triangle_Tests) *100.0 ));  if(Ray_Quadric_Tests)    fprintf (stat_out,"  Quadric      %10ld  %10ld  %10.2f\n", Ray_Quadric_Tests, Ray_Quadric_Tests_Succeeded, ( ((DBL)Ray_Quadric_Tests_Succeeded/(DBL)Ray_Quadric_Tests) *100.0 ));  if(Ray_Blob_Tests)    fprintf (stat_out,"  Blob         %10ld  %10ld  %10.2f\n", Ray_Blob_Tests, Ray_Blob_Tests_Succeeded, ( ((DBL)Ray_Blob_Tests_Succeeded/(DBL)Ray_Blob_Tests) *100.0 ));  if(Ray_Box_Tests)    fprintf (stat_out,"  Box          %10ld  %10ld  %10.2f\n", Ray_Box_Tests, Ray_Box_Tests_Succeeded, ( ((DBL)Ray_Box_Tests_Succeeded/(DBL)Ray_Box_Tests) *100.0 ));  if(Ray_Cone_Tests)    fprintf (stat_out,"  Cone         %10ld  %10ld  %10.2f\n", Ray_Cone_Tests, Ray_Cone_Tests_Succeeded, ( ((DBL)Ray_Cone_Tests_Succeeded/(DBL)Ray_Cone_Tests) *100.0 ) );  if(Ray_Disc_Tests)    fprintf (stat_out,"  Disc         %10ld  %10ld  %10.2f\n", Ray_Disc_Tests, Ray_Disc_Tests_Succeeded, ( ((DBL)Ray_Disc_Tests_Succeeded/(DBL)Ray_Disc_Tests) *100.0 ) );  if(Ray_Poly_Tests)    fprintf (stat_out,"  Quartic\\Poly %10ld  %10ld  %10.2f\n", Ray_Poly_Tests, Ray_Poly_Tests_Succeeded, ( ((DBL)Ray_Poly_Tests_Succeeded/(DBL)Ray_Poly_Tests) *100.0 ));  if(Ray_Bicubic_Tests)    fprintf (stat_out,"  Bezier Patch %10ld  %10ld  %10.2f\n", Ray_Bicubic_Tests, Ray_Bicubic_Tests_Succeeded, ( ((DBL)Ray_Bicubic_Tests_Succeeded/(DBL)Ray_Bicubic_Tests) *100.0 ));  if(Ray_Ht_Field_Tests)    fprintf (stat_out,"  Height Fld   %10ld  %10ld  %10.2f\n", Ray_Ht_Field_Tests, Ray_Ht_Field_Tests_Succeeded, ( ((DBL)Ray_Ht_Field_Tests_Succeeded/(DBL)Ray_Ht_Field_Tests) *100.0 ));  if(Ray_Ht_Field_Box_Tests)    fprintf (stat_out,"  Hght Fld Box %10ld  %10ld  %10.2f\n", Ray_Ht_Field_Box_Tests, Ray_HField_Box_Tests_Succeeded, ( ((DBL)Ray_HField_Box_Tests_Succeeded/(DBL)Ray_Ht_Field_Box_Tests) *100.0 ));  if(Bounding_Region_Tests)    fprintf (stat_out,"  Bounds       %10ld  %10ld  %10.2f\n", Bounding_Region_Tests, Bounding_Region_Tests_Succeeded, ( ((DBL)Bounding_Region_Tests_Succeeded/(DBL)Bounding_Region_Tests) *100.0 ));  if(Clipping_Region_Tests)    fprintf (stat_out,"  Clips        %10ld  %10ld  %10.2f\n", Clipping_Region_Tests, Clipping_Region_Tests_Succeeded, ( ((DBL)Clipping_Region_Tests_Succeeded/(DBL)Clipping_Region_Tests) *100.0 ));#ifdef DB_CODE  /* print some additional info */  if(nChecked)    fprintf (stat_out,"  Slabs        %10ld  %10ld  %10.2f\n", nChecked, nEnqueued, ( ((DBL)nEnqueued/(DBL)nChecked) *100.0 ));  if(Project_Tests)    fprintf (stat_out,"  Project      %10ld  %10ld  %10.2f\n", Project_Tests, Project_Tests_Succeeded, ( ((DBL)Project_Tests_Succeeded/(DBL)Project_Tests) *100.0 ));#endif  if(Calls_To_Noise)    fprintf (stat_out,"  Calls to Noise:   %10ld\n", Calls_To_Noise);  if(Calls_To_DNoise)    fprintf (stat_out,"  Calls to DNoise:  %10ld\n", Calls_To_DNoise);  if(Shadow_Ray_Tests)    fprintf (stat_out,"  Shadow Ray Tests: %10ld     Blocking Objects Found:  %10ld\n",      Shadow_Ray_Tests, Shadow_Rays_Succeeded);  if(Reflected_Rays_Traced)    fprintf (stat_out,"  Reflected Rays:   %10ld\n", Reflected_Rays_Traced);  if(Refracted_Rays_Traced)    fprintf (stat_out,"  Refracted Rays:   %10ld\n", Refracted_Rays_Traced);  if(Transmitted_Rays_Traced)    fprintf (stat_out,"  Transmitted Rays: %10ld\n", Transmitted_Rays_Traced);  if(Istack_overflows)    fprintf (stat_out,"  I-Stack overflows:%10ld\n", Istack_overflows);  if(tused==0)    {    STOP_TIME                  /* Get trace done time. */    tused = TIME_ELAPSED       /* Calc. elapsed time. Define TIME_ELAPSED as */    /* 0 in your specific CONFIG.H if unsupported */    }  if (tused != 0)    {    /* Convert seconds to hours, min & sec. CdW */    hours = (long) tused/3600;    min = (long) (tused - hours*3600)/60;    sec = tused - (DBL) (hours*3600 + min*60);#ifdef DB_CODE    /* I want the total tracing time in seconds */    fprintf (stat_out,"  Time For Trace:   %2ld hours %2ld minutes %4.2f seconds (%.2f sec)\n", hours,min,sec,tused);#else    fprintf (stat_out,"  Time For Trace:   %2ld hours %2ld minutes %4.2f seconds\n", hours,min,sec);#endif    }  if (Options & VERBOSE_FILE)    fclose(stat_out);  }/* Find a file in the search path. */FILE *Locate_File (filename, mode)char *filename, *mode;  {  FILE *f;  int i;  char pathname[FILE_NAME_LENGTH];  /* Check the current directory first. */  if ((f = fopen (filename, mode)) != NULL)    return (f);  for (i = 0 ; i < Library_Path_Index ; i++)     {    strcpy (pathname, Library_Paths[i]);    if (FILENAME_SEPARATOR != NULL)      strcat (pathname, FILENAME_SEPARATOR);    strcat (pathname, filename);    if ((f = fopen (pathname, mode)) != NULL)      return (f);    }  return (NULL);  }
  4. void print_credits()  {  fprintf (stderr,"*------------------------------------------------------------------------*\n");
  5.   fprintf (stderr,"| Persistence of Vision Raytracer Ver 2.2.u (C) 1993 POV-Team.           |\n");  fprintf (stderr,"| Faster-than-POV (FTP) enhancement Ver 2.1 (C) 1993 Dieter Bayer.       |\n");  fprintf (stderr,"|  (e-mail: dieter@cip.e-technik.uni-erlangen.de)                        |\n");  fprintf (stderr,"| The POV-Ray team is not responsible for supporting this version.       |\n");  fprintf (stderr,"*------------------------------------------------------------------------*\n");  fprintf (stderr,"| Atari-TOS compatible versions ported by Black Scorpion Team.           |\n");  fprintf (stderr,"| Target: MC680X0 based Atari-ST & compatibles.                          |\n");  fprintf (stderr,"*------------------------------------------------------------------------*\n");  fprintf (stderr,"| POV-Ray is based on DKBTrace 2.12 by David K. Buck & Aaron A. Collins. |\n");  fprintf (stderr,"|   Contributing Authors: (Alphabetically)                               |\n");  fprintf (stderr,"|      Steve Anger        Steve A. Bennett   David K. Buck               |\n");  fprintf (stderr,"|      Aaron A. Collins   Alexander Enzmann  Dan Farmer                  |\n");  fprintf (stderr,"|      Douglas Muir       Bill Pulver        Robert Skinner              |\n");  fprintf (stderr,"|      Scott Taylor       Drew Wells         Chris Young                 |\n");  fprintf (stderr,"|   Other contributors listed in the documentation.                      |\n");  fprintf (stderr,"*------------------------------------------------------------------------*\n");
  6.   }