home *** CD-ROM | disk | FTP | other *** search
/ DP Tool Club 8 / CDASC08.ISO / NEWS / RADIANCE / SRC / GEN / GENBOX.C < prev    next >
C/C++ Source or Header  |  1993-10-07  |  4KB  |  230 lines

  1. /* Copyright (c) 1986 Regents of the University of California */
  2.  
  3. #ifndef lint
  4. static char SCCSid[] = "@(#)genbox.c 2.2 12/19/91 LBL";
  5. #endif
  6.  
  7. /*
  8.  *  genbox.c - generate a parallelepiped.
  9.  *
  10.  *     1/8/86
  11.  */
  12.  
  13. #include  <stdio.h>
  14.  
  15. #ifndef atof
  16. extern double  atof();
  17. #endif
  18.  
  19. char  let[]="0123456789._ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
  20.  
  21. char  *cmtype;        /* ppd material type */
  22.  
  23. char  *cname;        /* ppd name */
  24.  
  25. double  size[3];    /* ppd size */
  26.  
  27. double  bevel = 0.0;    /* bevel amount */
  28.  
  29. int  round = 0;        /* boolean true for round edges */
  30.  
  31. int  reverse = 0;    /* boolean true for reversed normals */
  32.  
  33.  
  34. main(argc, argv)
  35. int  argc;
  36. char  **argv;
  37. {
  38.     int  i;
  39.     
  40.     if (argc < 6)
  41.         goto userr;
  42.  
  43.     cmtype = argv[1];
  44.     cname = argv[2];
  45.     size[0] = atof(argv[3]);
  46.     size[1] = atof(argv[4]);
  47.     size[2] = atof(argv[5]);
  48.  
  49.     for (i = 6; i < argc; i++) {
  50.         if (argv[i][0] != '-')
  51.             goto userr;
  52.         switch (argv[i][1]) {
  53.         case 'r':
  54.             round = 1;
  55.             /* fall through */
  56.         case 'b':
  57.             bevel = atof(argv[++i]);
  58.             break;
  59.         case 'i':
  60.             reverse = 1;
  61.             break;
  62.         default:
  63.             goto userr;
  64.         }
  65.     }
  66.  
  67.     printhead(argc, argv);
  68.  
  69.     if (bevel > 0.0) {
  70.                     /* minor faces */
  71.         side(051, 055, 054, 050);
  72.         side(064, 066, 062, 060);
  73.         side(032, 033, 031, 030);
  74.         side(053, 052, 056, 057);
  75.         side(065, 061, 063, 067);
  76.         side(036, 034, 035, 037);
  77.     }
  78.     if (bevel > 0.0 && !round) {
  79.                     /* bevel faces */
  80.         side(031, 051, 050, 030);
  81.         side(060, 062, 032, 030);
  82.         side(050, 054, 064, 060);
  83.         side(034, 036, 066, 064);
  84.         side(037, 057, 056, 036);
  85.         side(052, 062, 066, 056);
  86.         side(052, 053, 033, 032);
  87.         side(057, 067, 063, 053);
  88.         side(061, 031, 033, 063);
  89.         side(065, 067, 037, 035);
  90.         side(055, 051, 061, 065);
  91.         side(034, 054, 055, 035);
  92.                     /* bevel corners */
  93.         corner(030, 050, 060);
  94.         corner(051, 031, 061);
  95.         corner(032, 062, 052);
  96.         corner(064, 054, 034);
  97.         corner(036, 056, 066);
  98.         corner(065, 035, 055);
  99.         corner(053, 063, 033);
  100.         corner(037, 067, 057);
  101.     }
  102.     if (bevel > 0.0 && round) {
  103.                     /* round edges */
  104.         cylinder(070, 071);
  105.         cylinder(070, 074);
  106.         cylinder(070, 072);
  107.         cylinder(073, 071);
  108.         cylinder(073, 072);
  109.         cylinder(073, 077);
  110.         cylinder(075, 071);
  111.         cylinder(075, 074);
  112.         cylinder(075, 077);
  113.         cylinder(076, 072);
  114.         cylinder(076, 074);
  115.         cylinder(076, 077);
  116.                     /* round corners */
  117.         sphere(070);
  118.         sphere(071);
  119.         sphere(072);
  120.         sphere(073);
  121.         sphere(074);
  122.         sphere(075);
  123.         sphere(076);
  124.         sphere(077);
  125.     }
  126.     if (bevel == 0.0 ) {
  127.                     /* only need major faces */
  128.         side(1, 5, 4, 0);
  129.         side(4, 6, 2, 0);
  130.         side(2, 3, 1, 0);
  131.         side(3, 2, 6, 7);
  132.         side(5, 1, 3, 7);
  133.         side(6, 4, 5, 7);
  134.     }
  135.     exit(0);
  136. userr:
  137.     fprintf(stderr, "Usage: %s ", argv[0]);
  138.     fprintf(stderr, "material name xsize ysize zsize ");
  139.     fprintf(stderr, "[-i] [-b bevel | -r round]\n");
  140.     exit(1);
  141. }
  142.  
  143.  
  144. side(a, b, c, d)        /* generate a rectangular face */
  145. int  a, b, c, d;
  146. {
  147.     printf("\n%s polygon %s.%c%c%c%c\n", cmtype, cname,
  148.             let[a], let[b], let[c], let[d]);
  149.     printf("0\n0\n12\n");
  150.     if (reverse) {
  151.         vertex(d);
  152.         vertex(c);
  153.         vertex(b);
  154.         vertex(a);
  155.     } else {
  156.         vertex(a);
  157.         vertex(b);
  158.         vertex(c);
  159.         vertex(d);
  160.     }
  161. }
  162.  
  163.  
  164. corner(a, b, c)            /* generate a triangular face */
  165. int  a, b, c;
  166. {
  167.     printf("\n%s polygon %s.%c%c%c\n", cmtype, cname,
  168.             let[a], let[b], let[c]);
  169.     printf("0\n0\n9\n");
  170.     if (reverse) {
  171.         vertex(c);
  172.         vertex(b);
  173.         vertex(a);
  174.     } else {
  175.         vertex(a);
  176.         vertex(b);
  177.         vertex(c);
  178.     }
  179. }
  180.  
  181.  
  182. cylinder(v0, v1)        /* generate a cylinder */
  183. int  v0, v1;
  184. {
  185.     printf("\n%s cylinder %s.%c%c\n", cmtype, cname, v0+'0', v1+'0');
  186.     printf("0\n0\n7\n");
  187.     vertex(v0);
  188.     vertex(v1);
  189.     printf("\t%18.12g\n", bevel);
  190. }
  191.  
  192.  
  193. sphere(v0)            /* generate a sphere */
  194. int  v0;
  195. {
  196.     printf("\n%s sphere %s.%c\n", cmtype, cname, v0+'0');
  197.     printf("0\n0\n4\n");
  198.     vertex(v0);
  199.     printf("\t%18.12g\n", bevel);
  200. }
  201.  
  202.  
  203. vertex(v)
  204. register int  v;
  205. {
  206.     register int  i;
  207.  
  208.     for (i = 0; i < 3; i++) {
  209.         if (v & 010)
  210.             printf("\t%18.12g", v & 01 ? size[i]-bevel : bevel);
  211.         else
  212.             printf("\t%18.12g", v & 01 ? size[i] : 0.0);
  213.         v >>= 1;
  214.     }
  215.     printf("\n");
  216. }
  217.  
  218.  
  219. printhead(ac, av)        /* print command header */
  220. register int  ac;
  221. register char  **av;
  222. {
  223.     putchar('#');
  224.     while (ac--) {
  225.         putchar(' ');
  226.         fputs(*av++, stdout);
  227.     }
  228.     putchar('\n');
  229. }
  230.