home *** CD-ROM | disk | FTP | other *** search
/ Virtual Reality Zone / VRZONE.ISO / mac / PC / PCGLOVE / GLOVE / OBJGLV.ZIP / SRC / DEMO4B / SUPP / PLG.CPP < prev    next >
C/C++ Source or Header  |  1993-04-07  |  5KB  |  237 lines

  1. /* PLG file i/o */
  2.  
  3. /* Written by Bernie Roehl, March 1992 */
  4.  
  5. #include <stdio.h>
  6. #include <string.h>
  7. #include <alloc.h>
  8. #include <stdlib.h>
  9.  
  10. #include "rend386.hpp"
  11. #include "plg.h"
  12.  
  13. /* Copyright 1992 by Dave Stampe and Bernie Roehl.
  14.    May be freely used to write software for release into the public domain;
  15.    all commercial endeavours MUST contact Bernie Roehl and Dave Stampe
  16.    for permission to incorporate any part of this software into their
  17.    products!
  18.  */
  19.  
  20. int load_err = 0; /* set if an error was encountered during loading */
  21.  
  22. static long xshift = 0, yshift = 0, zshift = 0;
  23. static float xrescale = 1, yrescale = 1, zrescale = 1;
  24. static int depthsort = 0;
  25.  
  26. static unsigned *cmap;
  27. static int mapsize = 0;
  28.  
  29. long lx, ly, lz; /* DEBUG */
  30.  
  31. static unsigned mapcolor(unsigned orig)
  32. {
  33.     if ((orig & 0x8000) == 0) return orig; /* only map if top bit set */
  34.     orig &= 0x7FFF; /* turn the top bit off */
  35.     if (cmap == NULL) return orig; /* no map */
  36.     if (orig > mapsize) return orig; /* color not in map */
  37.     return cmap[orig]; /* map it */
  38. }
  39.  
  40. void set_loadplg_colormap(unsigned *map, int msize)
  41. {
  42.     cmap = map;
  43.     mapsize = msize;
  44. }
  45.  
  46. void set_loadplg_offset(long x, long y, long z)
  47. {
  48.     xshift = x; 
  49.     yshift = y; 
  50.     zshift = z;
  51. }
  52.  
  53. void set_loadplg_scale(float x, float y, float z)
  54. {
  55.     xrescale = x; 
  56.     yrescale = y; 
  57.     zrescale = z;
  58. }
  59.  
  60. void set_loadplg_depthsort(int type)
  61. {
  62.     depthsort = type;
  63. }
  64.  
  65. void strip_comment(char *buff) /* also trim newline character(s) */
  66. {
  67.     char *p;
  68.     if ((p = strchr(buff, '\n')) != NULL) *p = '\0'; /* trim newline */
  69.     if ((p = strchr(buff, '#')) != NULL) *p = '\0'; /* trim comment */
  70.     if ((p = strchr(buff, '*')) != NULL) *p = '\0'; /* future expansion */
  71. }
  72.  
  73. static int load_in_plg_file(FILE *in, OBJECT **obj)
  74. {
  75.     char tbuff[1000], objname[100];
  76.     int nv, np, i;
  77.     char *p;
  78.     long size = 0;
  79.     int multi = (*obj) ? 1 : 0; /* multi-reps if not null object */
  80.  
  81.     /* skip blank lines */
  82.     do {
  83.         if (fgets(tbuff, sizeof(tbuff), in) == NULL) return -1;
  84.         if (strstr(tbuff,"#MULTI")) multi++;
  85.         strip_comment(tbuff);
  86.     }
  87.     while (tbuff[0] == '\0');
  88.  
  89.     if (sscanf(tbuff, "%s %d %d", objname, &nv, &np) != 3)
  90.     { 
  91.         load_err = -1; 
  92.         return -1; 
  93.     }
  94.  
  95.     if (multi && (p = strchr(objname, '_')) != NULL)
  96.     {
  97.         *p++ = 0;
  98.         size = atol(p);
  99.     }
  100.     else size = 0; /* default: use largest detail always */
  101.  
  102.     if (*obj == NULL)
  103.     {
  104.         if ((*obj = new_obj(0, nv, np)) == NULL)
  105.         { 
  106.             load_err = -2; 
  107.             return -1; 
  108.         }
  109.         set_rep_size(*obj, size);
  110.     }
  111.     else
  112.         {
  113.         if (add_representation(*obj, size, nv, np) == NULL)
  114.         { 
  115.             load_err = -2; 
  116.             return -1; 
  117.         }
  118.     }
  119.  
  120.     for (i = 0; i < nv; ++i) /* load in vertices */
  121.     {
  122.         float x, y, z;
  123.         /* skip blank lines */
  124.         do
  125.             {
  126.             if (fgets(tbuff, sizeof(tbuff), in) == NULL)
  127.             { 
  128.                 load_err = -4; 
  129.                 return -1; 
  130.             }
  131.             strip_comment(tbuff);
  132.         }
  133.         while (tbuff[0] == '\0');
  134.  
  135.         if (sscanf(tbuff, "%f %f %f", &x, &y, &z) != 3)
  136.         { 
  137.             load_err = -5; 
  138.             return -1; 
  139.         }
  140.  
  141.         add_vertex(*obj, (lx = (long) (x*xrescale))+xshift,
  142.         (ly = (long) (y*yrescale))+yshift,
  143.         (lz = (long) (z*zrescale))+zshift);
  144.         lx++;
  145.     }
  146.  
  147.     for (i = 0; i < np; ++i) /* load polygons */
  148.     {
  149.         int j, npoints;
  150.         unsigned color;
  151.         POLY *poly;
  152.         char *p;
  153.         /* skip blank lines */
  154.         do
  155.             {
  156.             if (fgets(tbuff, sizeof(tbuff), in) == NULL)
  157.             { 
  158.                 load_err = -6; 
  159.                 return -1; 
  160.             }
  161.             strip_comment(tbuff);
  162.         }
  163.         while (tbuff[0] == '\0');
  164.  
  165.         color = (unsigned) strtoul(tbuff,&p,0) ; /* req so hex colors usable */
  166.         color = mapcolor(color);
  167.         if ((p = strtok(p, " \t")) == NULL)
  168.         { 
  169.             load_err = -8; 
  170.             return -1; 
  171.         }
  172.         npoints = atoi(p);
  173.         if ((poly = add_poly(*obj, color, npoints)) == NULL)
  174.         { 
  175.             load_err = -9; 
  176.             return -1; 
  177.         }
  178.         for (j = 0; j < npoints; ++j)
  179.         {
  180.             if ((p = strtok(NULL, " \t")) == NULL)
  181.             { 
  182.                 load_err = -9; 
  183.                 return -1; 
  184.             }
  185.             add_point(*obj, poly, atoi(p));
  186.         }
  187.     }
  188.     compute_obj(*obj); /* will do current rep only */
  189.     load_err = 0;
  190.     return 0;
  191. }
  192.  
  193. OBJECT *load_plg(FILE *in)
  194. {
  195.     OBJECT *obj = NULL;
  196.     load_err = 0;
  197.     if (load_in_plg_file(in, &obj)) return NULL;
  198.     set_object_sorting(obj, depthsort);
  199.     return obj;
  200. }
  201.  
  202. OBJECT *load_multi_plg(FILE *in)
  203. {
  204.     OBJECT *obj = NULL;
  205.     load_err = 0;
  206.     while (load_in_plg_file(in, &obj) == 0)
  207.         ;
  208.     set_object_sorting(obj, depthsort);
  209.     return obj;
  210. }
  211.  
  212.  
  213. save_plg(OBJECT *obj, FILE *out)
  214. {
  215.     int nv, np, i;
  216.     char buff[100];
  217.  
  218.     get_obj_info(obj, &nv, &np);
  219.     fprintf(out, "SAVED %d %d\n", nv, np);
  220.     for (i = 0; i < nv; ++i)
  221.     {
  222.         long x, y, z;
  223.         get_vertex_world_info(obj, i, &x, &y, &z);
  224.         fprintf(out, "%ld %ld %ld\n", x, y, z);
  225.     }
  226.     for (i = 0; i < np; ++i)
  227.     {
  228.         int j, n, verts[1000];
  229.         unsigned c;
  230.         get_poly_info(obj, i, &c, &n, verts, sizeof(verts)/sizeof(int));
  231.         fprintf(out, "0x%04.4X %d", c & 0x7FFF, n);
  232.         for (j = 0; j < n; ++j) fprintf(out, " %d", verts[j]);
  233.         fprintf(out, "\n");
  234.     }
  235.     return 0;
  236. }
  237.