home *** CD-ROM | disk | FTP | other *** search
/ gondwana.ecr.mu.oz.au/pub/ / Graphics.tar / Graphics / VOGLE.ZIP / EXAMPLES / PCUBE.P < prev    next >
Text File  |  2000-02-11  |  5KB  |  218 lines

  1. program cube;
  2.  
  3. #include <Vogle.h>
  4.  
  5. var
  6.  
  7.     c: char;
  8.     device: string_t;
  9.     r, t, dr, dt: real;
  10.     nkey, nplanes: integer;
  11.     fill, back, backdir: boolean;
  12.     carray: array[1..8, 1..3] of real;
  13.  
  14.     procedure init;
  15.     begin
  16.         dr := 10.0;
  17.         dt := 0.2;
  18.         carray[1, 1] := -1.0;
  19.         carray[1, 2] := -1.0;
  20.         carray[1, 3] :=  1.0;
  21.         carray[2, 1] :=  1.0;
  22.         carray[2, 2] := -1.0;
  23.         carray[2, 3] :=  1.0;
  24.         carray[3, 1] :=  1.0;
  25.         carray[3, 2] :=  1.0;
  26.         carray[3, 3] :=  1.0;
  27.         carray[4, 1] := -1.0;
  28.         carray[4, 2] :=  1.0;
  29.         carray[4, 3] :=  1.0;
  30.         carray[5, 1] := -1.0;
  31.         carray[5, 2] := -1.0;
  32.         carray[5, 3] := -1.0;
  33.         carray[6, 1] :=  1.0;
  34.         carray[6, 2] := -1.0;
  35.         carray[6, 3] := -1.0;
  36.         carray[7, 1] :=  1.0;
  37.         carray[7, 2] :=  1.0;
  38.         carray[7, 3] := -1.0;
  39.         carray[8, 1] := -1.0;
  40.         carray[8, 2] :=  1.0;
  41.         carray[8, 3] := -1.0
  42.     end;
  43.  
  44.  
  45.     (*
  46.      * drawcube
  47.      *
  48.      *    draw the cube setting colours if available
  49.      *)
  50.     procedure drawcube;
  51.     begin
  52.         if nplanes > 1 then
  53.             Color(RED);
  54.  
  55.         MakePoly;    (* Front *)
  56.             Move(carray[1][1], carray[1][2], carray[1][3]);
  57.             Draw(carray[2][1], carray[2][2], carray[2][3]);
  58.             Draw(carray[3][1], carray[3][2], carray[3][3]);
  59.             Draw(carray[4][1], carray[4][2], carray[4][3]);
  60.             Draw(carray[1][1], carray[1][2], carray[1][3]);
  61.         ClosePoly;
  62.         
  63.         if nplanes > 1 then
  64.             Color(GREEN);
  65.  
  66.         MakePoly;    (* Back *)
  67.             Move(carray[6][1], carray[6][2], carray[6][3]);
  68.             Draw(carray[5][1], carray[5][2], carray[5][3]);
  69.             Draw(carray[8][1], carray[8][2], carray[8][3]);
  70.             Draw(carray[7][1], carray[7][2], carray[7][3]);
  71.             Draw(carray[6][1], carray[6][2], carray[6][3]);
  72.         ClosePoly;
  73.  
  74.         if nplanes > 1 then
  75.             Color(YELLOW);
  76.  
  77.         MakePoly;    (* Right side *)
  78.             Move(carray[2][1], carray[2][2], carray[2][3]);
  79.             Draw(carray[6][1], carray[6][2], carray[6][3]);
  80.             Draw(carray[7][1], carray[7][2], carray[7][3]);
  81.             Draw(carray[3][1], carray[3][2], carray[3][3]);
  82.             Draw(carray[2][1], carray[2][2], carray[2][3]);
  83.         ClosePoly;
  84.  
  85.         if nplanes > 1 then
  86.             Color(BLUE);
  87.  
  88.         MakePoly;    (* Left side *)
  89.             Move(carray[1][1], carray[1][2], carray[1][3]);
  90.             Draw(carray[4][1], carray[4][2], carray[4][3]);
  91.             Draw(carray[8][1], carray[8][2], carray[8][3]);
  92.             Draw(carray[5][1], carray[5][2], carray[5][3]);
  93.             Draw(carray[1][1], carray[1][2], carray[1][3]);
  94.         ClosePoly;
  95.  
  96.         if nplanes > 1 then
  97.             Color(MAGENTA);
  98.  
  99.         MakePoly;    (* Top *)
  100.             Move(carray[3][1], carray[3][2], carray[3][3]);
  101.             Draw(carray[7][1], carray[7][2], carray[7][3]);
  102.             Draw(carray[8][1], carray[8][2], carray[8][3]);
  103.             Draw(carray[4][1], carray[4][2], carray[4][3]);
  104.             Draw(carray[3][1], carray[3][2], carray[3][3]);
  105.         ClosePoly;
  106.         
  107.         if nplanes > 1 then
  108.             Color(CYAN);
  109.  
  110.         MakePoly;    (* Bottom *)
  111.             Move(carray[1][1], carray[1][2], carray[1][3]);
  112.             Draw(carray[5][1], carray[5][2], carray[5][3]);
  113.             Draw(carray[6][1], carray[6][2], carray[6][3]);
  114.             Draw(carray[2][1], carray[2][2], carray[2][3]);
  115.             Draw(carray[1][1], carray[1][2], carray[1][3]);
  116.         ClosePoly
  117.     end;
  118.  
  119.  
  120. begin
  121.     init;
  122.  
  123.     write('Enter output device: ');
  124.     readln(device);
  125.  
  126.     PrefSize(300, 300);
  127.  
  128.     Vinit(device);
  129.  
  130.     nplanes := GetDepth;
  131.  
  132.     fill := true;
  133.     back := true;
  134.     backdir := true;
  135.     PolyFill(fill);
  136.     BackFace(back);
  137.     BackFaceDir(backdir);
  138.  
  139.     Color(BLACK);
  140.     Clear;
  141.  
  142.     Window(-1.5, 1.5, -1.5, 1.5, 9.0, -5.0);
  143.     LookAt(0.0, 0.0, 12.0, 0.0, 0.0, 0.0, 0.0);
  144.  
  145.     BackFace(true);
  146.     
  147.     if BackBuffer < 0 then
  148.     begin
  149.         VgetDev(device);
  150.         Vexit;
  151.         writeln('cube: device ', device, ' doesn''t support double buffering.');
  152.         halt
  153.     end;
  154.  
  155.     t := 0.0;
  156.     c := chr(0);
  157.  
  158.     repeat 
  159.         r := 0.0;
  160.         while r < 360.0 do
  161.         begin
  162.             Color(BLACK);
  163.             Clear;
  164.             PushMatrix;
  165.                 Translate(0.0, 0.0, t);
  166.                 Rotate(r, 'y');
  167.                 Rotate(r, 'z');
  168.                 Rotate(r, 'x');
  169.                 Color(WHITE);
  170.                 drawcube;
  171.                 if (nplanes = 1) and fill then
  172.                 begin
  173.                     PolyFill(false);
  174.                     Color(BLACK);
  175.                     drawcube;
  176.                     PolyFill(fill)
  177.                 end;
  178.  
  179.             PopMatrix;
  180.  
  181.             if c = 'p' then
  182.             begin
  183.                 VnewDev(device);
  184.                 c := chr(0)
  185.             end;
  186.  
  187.             t := t + dt;
  188.             if (t > 3.0) or (t < -18.0) then
  189.                 dt := -dt;
  190.  
  191.             SwapBuffers;
  192.  
  193.             c := chr(CheckKey);
  194.             if c <> chr(0) then
  195.             begin
  196.                 if c = 'p' then begin
  197.                     Voutput('cube.ps');
  198.                     VnewDev('postscript')
  199.                 end else if c = 'b' then begin
  200.                     back := not back;
  201.                     BackFace(back);
  202.                 end else if c = 'f' then begin
  203.                     fill := not fill;
  204.                     PolyFill(fill);
  205.                 end else if c = 'd' then begin
  206.                     backdir := not backdir;
  207.                     BackFaceDir(backdir);
  208.                 end else begin
  209.                     Vexit;
  210.                     halt
  211.                 end
  212.             end;
  213.  
  214.             r := r + dr
  215.         end
  216.     until(false);
  217. end.
  218.