home *** CD-ROM | disk | FTP | other *** search
/ Mega Top 1 / os2_top1.zip / os2_top1 / APPS / RAYTRACE / PVQUAN16 / DISPLAY / DISPLAY.C next >
Text File  |  1992-03-03  |  5KB  |  183 lines

  1. /************************************************************************
  2.  *                                                                      *
  3.  *                  Copyright (c) 1991, Frank van der Hulst             *
  4.  *                          All Rights Reserved                         *
  5.  *                                                                      *
  6.  ************************************************************************
  7.  *                                                                      *
  8.  * Authors:                                                             *
  9.  *          FvdH - Frank van der Hulst (Wellington, NZ)                     *
  10.  *                                                                      *
  11.  * Versions:                                                            *
  12.  *    V1.1 910626 FvdH - DISPLAY released as part of DBW_RENDER           *
  13.  *    V1.2 910913 FvdH - DISPLAY released as part of DKB_TRACE            *
  14.  *    V1.3 911031 FvdH - Added 320x200x256x4 pages support                    *
  15.  *                                                                      *
  16.  ************************************************************************/
  17.  
  18. /* VGA 320*400*256 or 320*200*256 ray tracer display program.
  19.  
  20. Written by: F van der Hulst, 26/6/91
  21.  
  22. This program reads files produced by QUANT.EXE and displays them on a VGA
  23. screen in 320*400 or 320*200 mode.
  24.  
  25. Command line format:
  26.     display FILE1 [FILE2]... [/W] [/C] [/R]
  27.  
  28.     where FILE1, FILE2... are the names (with extensions) of files to be
  29.             displayed.
  30.     /W     => wait after each following image has been displayed
  31.     /C    => clear screen after each image
  32.     /R        => reverse eye-image sync for following 3D images
  33. */
  34.  
  35. #include <stdlib.h>
  36. #include <stdio.h>
  37. #include <ctype.h>
  38. #include <conio.h>
  39. #include <dos.h>
  40.  
  41. #include "vga.h"
  42.  
  43. #define SC_INDEX           0x3c4
  44. #define MAP_MASK           2
  45.  
  46. FILE *fp;
  47. PALETTE palette;
  48. int    colours;
  49. char    wait_flag = 1, clr_scr = 1, rev = 0;
  50. int    num_rows = 400;
  51.  
  52. void            cdecl (*display_pixel)(unsigned int x, unsigned int y, unsigned char colour);
  53. void            cdecl (*setvispage)(int page);
  54. char far *    cdecl (*setactpage)(int page);
  55. void            cdecl (*end_graphics)(void);
  56.  
  57. void display_320(char format)
  58. {
  59. int plane, mask;
  60. char far *base;
  61.  
  62.     if (rev) {
  63.         setvispage(1);            /* Reverse 3D image */
  64.         base = setactpage(1);
  65.     } else base = setactpage(0);
  66.  
  67.     if (clr_scr)    mask = 0xf00;
  68.     else                mask = 0x100;
  69.     for (plane = 0; plane < 4; plane++, mask <<= 1) {
  70.         outport(SC_INDEX, (mask & 0xf00) | MAP_MASK);
  71.         fread(base, num_rows * (320/4), 1, fp);
  72.     }
  73.     if (format == '3') {                    /* 3D image */
  74.         if (rev) {
  75.             setvispage(0);            /* Reverse */
  76.             base = setactpage(0);
  77.         } else {
  78.             setvispage(1);                /* Normal */
  79.             base = setactpage(1);
  80.         }
  81.         for (plane = 0; plane < 4; plane++) {
  82.             outport(SC_INDEX, (0x100 << plane) | MAP_MASK);
  83.             fread(base, 400 * (320/4), 1, fp);
  84.         }
  85.     }
  86.     fclose(fp);
  87.     if (format == '3') {                    /* 3D image */
  88.         while (!kbhit()) {
  89.             WaitForVerticalRetrace();
  90.             setvispage(0);
  91.             WaitForVerticalRetrace();
  92.             setvispage(1);
  93.         }
  94.     }
  95.     if (wait_flag) getch();
  96. }
  97.  
  98. void goto_400(void)
  99. {
  100.     set320x400mode();
  101.     display_pixel     = putpixel_400;
  102.     setvispage        = setvis_400;
  103.     setactpage        = setact_400;
  104.     end_graphics    = end320x400mode;
  105.     num_rows = 400;
  106. }
  107.  
  108. void goto_200(void)
  109. {
  110.     set320x200x4mode();
  111.     display_pixel     = putpixel_200;
  112.     setvispage        = setvis_200;
  113.     setactpage        = setact_200;
  114.     end_graphics    = end320x200mode;
  115.     num_rows = 200;
  116. }
  117.  
  118. void draw_view(char *fname)
  119. {
  120. int maxcol, maxrow;
  121. char format;
  122.  
  123.     fp = fopen(fname,"rb");
  124.     if (fp == NULL) {
  125.         end_graphics();
  126.         printf( "Error opening %s.\n", fname);
  127.         exit(1);
  128.     }
  129.     format = getc(fp);
  130.     if ((format < '2') || (format > '3') || getc(fp) != 'D') {        /* Check signature for 320x400 format */
  131.         end_graphics();
  132.         printf( "Incorrect signature on file.\n");
  133.         exit(1);
  134.     }
  135.  
  136.     maxcol = getw(fp);         /* store columns */
  137.     maxrow = getw(fp);        /* store rows */
  138.     if (maxcol != 320 || (maxrow != 400 && maxrow != 200)) {
  139.         end_graphics();
  140.         printf( "Invalid image size -- must be 320*200 or 320*400, but is %d*%d.\n",
  141.                     maxcol, maxrow);
  142.         exit(1);
  143.     }
  144.     if (maxrow != num_rows) {
  145.         end_graphics();
  146.         if (maxrow == 400)     goto_400();
  147.         else                        goto_200();
  148.     }
  149.  
  150.     colours = getc(fp);
  151.     if (colours == 0) colours = 256;
  152.     fread(palette, 3, colours, fp);
  153.     setvgapalette(&palette, colours);
  154.     display_320(format);
  155. }
  156.  
  157. void cdecl main(int argc, char *argv[])
  158. {
  159. int par;
  160.  
  161.     if (argc < 2) {
  162.         printf("Filename(s) must be specified\n");
  163.         exit(1);
  164.     }
  165.  
  166.     goto_400();
  167.     for (par = 1; par < argc; par++)    {
  168.         if (argv[par][0] == '/') {
  169.             switch(toupper(argv[par][1])) {
  170.             case 'R': rev             = !rev;            break;
  171.             case 'W': wait_flag     = !wait_flag;    break;
  172.             case 'C': clr_scr        = !clr_scr;        break;
  173.             case 'H':
  174.                 if (num_rows == 400)        goto_200();
  175.                 else                             goto_400();
  176.                 break;
  177.             }
  178.         } else draw_view(argv[par]);
  179.     }
  180.     end_graphics();
  181. }
  182.  
  183.