home *** CD-ROM | disk | FTP | other *** search
/ gondwana.ecr.mu.oz.au/pub/ / Graphics.tar / Graphics / VOGLE.ZIP / VOGLE / EXAMPLES / LCUBE.C < prev    next >
C/C++ Source or Header  |  2000-02-11  |  4KB  |  219 lines

  1.  
  2. #include <stdio.h>
  3. #include <vogle.h>
  4.  
  5. #define    CUBE_SIZE    200.0
  6. #define    TRANS        25.0
  7. #define    SCAL        0.1
  8. #define FACE        1
  9. #define FILLED        2
  10. #define OUTLINE        3
  11.  
  12. main(argc, argv)
  13.     int    argc;
  14.     char    *argv[];
  15. {
  16.         char    device[10], *p;
  17.     float    x, y, tdir = TRANS;
  18.     float    scal = 1.0 + SCAL;
  19.     int    but, nplanes;
  20.     int    back, fill, hatch, i, n;
  21.  
  22.     fprintf(stderr,"Enter output device: ");
  23.     gets(device);
  24.  
  25.  
  26.     prefposition(50, 50);
  27.     prefsize(500, 500);
  28.  
  29.     vinit(device);
  30.  
  31.     window(-800.0, 800.0, -800.0, 800.0, -800.0, 800.0);
  32.     lookat(0.0, 0.0, 1500.0, 0.0, 0.0, 0.0, 0.0);
  33.  
  34.     /*
  35.      * Start with a very ordinary filled cube like the old demo..
  36.      */
  37.     polyhatch(0);
  38.     hatchang(45.0);
  39.     hatchpitch(40.0);
  40.     polyfill(1);
  41.  
  42.     fill = 1;
  43.     hatch = 0;
  44.     back = 1;
  45.  
  46.     makeobj(FACE);     /* hatched or filled polygon */
  47.         makepoly();
  48.             rect(-CUBE_SIZE, -CUBE_SIZE, CUBE_SIZE, CUBE_SIZE);
  49.         closepoly();
  50.     closeobj();
  51.  
  52.     makecube(FILLED);
  53.  
  54.     if ((nplanes = getdepth()) == 1)
  55.         makecube(OUTLINE);
  56.  
  57.     backface(1);
  58.         
  59.     if (backbuffer() < 0) {
  60.         vexit();
  61.         fprintf(stderr, "lcube: device doesn't support double buffering.\n"); 
  62.         exit(0); 
  63.     }        
  64.  
  65.     while((but = slocator(&x, &y)) != 44) {
  66.         pushmatrix();
  67.             rotate(100.0 * x, 'y');
  68.             rotate(100.0 * y, 'x');
  69.             color(BLACK);
  70.             clear();
  71.             callobj(FILLED);    /* The filled or hatched one */
  72.             if (nplanes == 1 && (fill || hatch))
  73.                 callobj(OUTLINE);    /* The outline */
  74.  
  75.         popmatrix();
  76.         swapbuffers();
  77.  
  78.         switch (but = checkkey()) {
  79.         case 'p':
  80.             voutput("lcube.ps");
  81.             vnewdev("postscript");
  82.             pushmatrix();
  83.                 rotate(100.0 * x, 'y');
  84.                 rotate(100.0 * y, 'x');
  85.                 color(BLACK);
  86.                 clear();
  87.                 callobj(FILLED);
  88.                 if (nplanes == 1 && (fill || hatch))
  89.                     callobj(OUTLINE);
  90.             popmatrix();
  91.             vnewdev(device);
  92.             (void)backbuffer();
  93.             break;
  94.         case 'f':    /* Toggle filling */
  95.             fill = !fill;
  96.             hatch = 0;
  97.             polyfill(fill);
  98.             break;
  99.         case 'h':    /* Toggle hatching */
  100.             hatch = !hatch;
  101.             fill = 0;
  102.             polyhatch(hatch);
  103.             break;
  104.         case 'b':     /* Toggle backfacing */
  105.             back = !back;
  106.             backface(back);
  107.             break;
  108.         case 's':
  109.             scale(scal, scal, scal);
  110.             break;
  111.         case 'x':
  112.             translate(tdir, 0.0, 0.0);
  113.             break;
  114.         case 'y':
  115.             translate(0.0, tdir, 0.0);
  116.             break;
  117.         case 'z':
  118.             translate(0.0, 0.0, tdir);
  119.             break;
  120.         case '-':
  121.             tdir = -tdir;
  122.  
  123.             if (scal < 1.0)
  124.                 scal = 1.0 + SCAL;
  125.             else
  126.                 scal = 1.0 - SCAL;
  127.  
  128.             break;
  129.         case '+':
  130.             tdir = TRANS;
  131.             break;
  132.         case 27: /* ESC */
  133.         case 'q':
  134.             vexit();
  135.             exit(0);
  136.         case 512:
  137.         case 513:
  138.             printf("Win-change\n");
  139.             pushviewport();
  140.             popviewport();
  141.             break;
  142.         default:
  143.             ;
  144.         }
  145.     }
  146.  
  147.     vexit();
  148. }
  149.  
  150. makecube(obj)
  151.     int    obj;
  152. {
  153.     makeobj(obj);
  154.         if (obj == OUTLINE) {
  155.             pushattributes();
  156.             polyfill(0);
  157.             polyhatch(0);
  158.             color(BLACK);
  159.         }
  160.  
  161.         pushmatrix();
  162.             translate(0.0, 0.0, CUBE_SIZE);
  163.             if (obj == FILLED)
  164.                 color(RED);
  165.  
  166.             callobj(FACE);
  167.         popmatrix();
  168.  
  169.         pushmatrix();
  170.             translate(CUBE_SIZE, 0.0, 0.0);
  171.             rotate(90.0, 'y');
  172.             if (obj == FILLED)
  173.                 color(GREEN);
  174.  
  175.             callobj(FACE);
  176.         popmatrix();
  177.  
  178.         pushmatrix();
  179.             translate(0.0, 0.0, -CUBE_SIZE);
  180.             rotate(180.0, 'y');
  181.             if (obj == FILLED)
  182.                 color(BLUE);
  183.  
  184.             callobj(FACE);
  185.         popmatrix();
  186.  
  187.         pushmatrix();
  188.             translate(-CUBE_SIZE, 0.0, 0.0);
  189.             rotate(-90.0, 'y');
  190.             if (obj == FILLED)
  191.                 color(CYAN);
  192.  
  193.             callobj(FACE);
  194.         popmatrix();
  195.  
  196.         pushmatrix();
  197.             translate(0.0, CUBE_SIZE, 0.0);
  198.             rotate(-90.0, 'x');
  199.             if (obj == FILLED)
  200.                 color(MAGENTA);
  201.  
  202.             callobj(FACE);
  203.         popmatrix();
  204.  
  205.         pushmatrix();
  206.             translate(0.0, -CUBE_SIZE, 0.0);
  207.             rotate(90.0, 'x');
  208.             if (obj == FILLED)
  209.                 color(YELLOW);
  210.  
  211.             callobj(FACE);
  212.         popmatrix();
  213.  
  214.         if (obj == OUTLINE)
  215.             popattributes();
  216.         
  217.     closeobj();
  218. }
  219.