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

  1. /*
  2.  *    A Present for Eric
  3.  *
  4.  *    (An example of Software Reuse in action :-)
  5.  */
  6.  
  7. #include <stdio.h>
  8. #ifdef TC
  9. extern double sin(), cos();
  10. #else
  11. #include <math.h>
  12. #endif
  13. #include "vogle.h"
  14.  
  15. #define    BEERGLASS    1
  16.  
  17. main(argc, argv)
  18.     int    argc;
  19.     char    **argv;
  20. {
  21.     char    c, dev[20];
  22.     int    i;
  23.     float    rotval = 0.0, drotval = 10.0, zeye = 5.0;
  24.     float    R = 1.6, tx = 0.0, tz = R;
  25.     char    device[10], *p;
  26.  
  27.     prefsize(400, 400);
  28.  
  29.     fprintf(stderr,"Enter output device: ");
  30.     gets(device);
  31.  
  32.     vinit(device);          /* set up device */
  33.  
  34.     font("futura.l");
  35.  
  36.     makebeer();
  37.  
  38.     /*
  39.      * set up a perspective projection with a field of view of
  40.      * 40.0 degrees, aspect ratio of 1.0, near clipping plane 0.1,
  41.      * and the far clipping plane at 1000.0.
  42.      */
  43.     perspective(40.0, 1.0, 0.001, 15.0);
  44.     lookat(0.0, 0.0, zeye, 0.0, 0.0, 0.0, 0.0);
  45.  
  46.     /*
  47.      * Setup drawing into the backbuffer....
  48.      */
  49.  
  50.     if (backbuffer() < 0) {
  51.         vexit();
  52.         fprintf(stderr, "The device '%s' can't support doublebuffering\n", vgetdev(dev));
  53.         exit(1);
  54.     }
  55.  
  56.     do {
  57.         for (rotval = 0.0; rotval < 360.0; rotval += drotval) {
  58.             color(BLACK);
  59.             clear();
  60.  
  61.             /*
  62.              * Rotate the whole scene...(this acumulates - hence
  63.              * drotval)
  64.              */
  65.             rotate(drotval * 0.1, 'x');
  66.             rotate(drotval * 0.1, 'z');
  67.  
  68.             color(GREEN);
  69.             move(0.0, 0.0, 0.0);
  70.             boxtext(-0.9 * R, -0.1 * R, 1.8 * R, 0.2 * R, "Don't spill it!");
  71.             
  72.             /*
  73.              * Remember! The order of the transformations is
  74.              * the reverse of what is specified here in between
  75.              * the pushmatrix and the popmatrix. These ones don't
  76.              * accumulate because of the push and pop.
  77.              */
  78.             pushmatrix();
  79.                 translate(tx, 0.0, tz);
  80.                 rotate(rotval, 'x');
  81.                 rotate(rotval, 'y');
  82.                 rotate(rotval, 'z');
  83.                 scale(0.4, 0.4, 0.4);
  84.                 callobj(BEERGLASS);
  85.             popmatrix();
  86.  
  87.             tz = R * cos((double)(rotval * 3.1415926535 / 180));
  88.             tx = R * sin((double)(rotval * 3.1415926535 / 180));
  89.  
  90.             swapbuffers();
  91.  
  92.             c = checkkey();
  93.  
  94.             if (c != 0) {
  95.                 vexit();
  96.                 exit(0);
  97.             }
  98.         }
  99.  
  100.     } while (1);
  101. }
  102.  
  103. #define    SIZE 1.5
  104. #define HEAD 0.2
  105. #define TOPRAD 0.4
  106. #define BOTRAD 0.3
  107.  
  108. /*
  109.  * makebeer
  110.  *
  111.  *    generate a beer glass
  112.  */
  113. makebeer()
  114. {
  115.     int    i, j;
  116.     float    x, y, z;
  117.     float    a;
  118.  
  119.     makeobj(BEERGLASS);
  120.  
  121.     color(WHITE);
  122.     pushmatrix();
  123.         rotate(90.0, 'x');
  124.         translate(0.0, 0.0, -SIZE / 2.0);
  125.         circle(0.0, 0.0, TOPRAD);
  126.         translate(0.0, 0.0, -HEAD);
  127.         circle(0.0, 0.0, TOPRAD);
  128.     popmatrix();
  129.  
  130.     for (i = 0; i < 180; i += 30)
  131.     {
  132.         pushmatrix();
  133.             rotate((float) i, 'y');
  134.             color(YELLOW);
  135.             move(TOPRAD, SIZE / 2.0, 0.0);
  136.             draw(BOTRAD, -SIZE / 2.0, 0.0);
  137.             draw(-BOTRAD, -SIZE / 2.0, 0.0);
  138.             draw(-TOPRAD, SIZE / 2.0, 0.0);
  139.             color(WHITE);
  140.             draw(-TOPRAD, SIZE / 2.0 + HEAD, 0.0);
  141.             draw(TOPRAD, SIZE / 2.0 + HEAD, 0.0);
  142.             draw(TOPRAD, SIZE / 2.0, 0.0);
  143.             draw(-TOPRAD, SIZE / 2.0, 0.0);
  144.         popmatrix();
  145.     }
  146.     pushmatrix();
  147.         color(YELLOW);
  148.         rotate(90.0, 'x');
  149.         translate(0.0, 0.0, SIZE / 2.0);
  150.         for (i = 0; i < 6; i++)
  151.         {
  152.             circle(0.0, 0.0,
  153.                    BOTRAD + (TOPRAD - BOTRAD) * (float) i / 6.0);
  154.             translate(0.0, 0.0, -SIZE / 6.0);
  155.         }
  156.     popmatrix();
  157.  
  158.     closeobj();
  159. }
  160.