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

  1.  
  2. program patches;
  3.  
  4. #include 'Vogle.h'
  5.  
  6. (*
  7.  *    Draws patches of various bases
  8.  *)
  9.  
  10. var    basis: array[1..4] of Matrix44_t;
  11.     x1, y1, z1, x2, y2, z2: Matrix44_t;
  12.  
  13.     labels: array[1..4] of string_t;
  14.  
  15.     dev: string_t;
  16.     dum, i: integer;
  17.     
  18.  
  19.     procedure init;
  20.     begin
  21.         (* 
  22.          * Gee, I really really really love Pascal sometimes....
  23.          *)
  24.         (*
  25.          * patch basis types
  26.          *)
  27.  
  28.         (* Bezier *)
  29.         basis[1, 1, 1] := -1.0;
  30.         basis[1, 1, 2] :=  3.0;
  31.         basis[1, 1, 3] := -3.0;
  32.         basis[1, 1, 4] :=  1.0;
  33.         basis[1, 2, 1] :=  3.0; 
  34.         basis[1, 2, 2] := -6.0;
  35.         basis[1, 2, 3] :=  3.0;
  36.         basis[1, 2, 4] :=  0.0;
  37.         basis[1, 3, 1] := -3.0;
  38.         basis[1, 3, 2] :=  3.0;
  39.         basis[1, 3, 3] :=  0.0;
  40.         basis[1, 3, 4] :=  0.0;
  41.         basis[1, 4, 1] :=  1.0;
  42.         basis[1, 4, 2] :=  0.0;
  43.         basis[1, 4, 3] :=  0.0;
  44.         basis[1, 4, 4] :=  0.0;
  45.  
  46.         (* Cardinal basis *)
  47.         basis[2, 1, 1] := -0.5;
  48.         basis[2, 1, 2] :=  1.5;
  49.         basis[2, 1, 3] := -1.5;
  50.         basis[2, 1, 4] :=  0.5;
  51.         basis[2, 2, 1] :=  1.0;
  52.         basis[2, 2, 2] := -2.5;
  53.         basis[2, 2, 3] :=  2.0;
  54.         basis[2, 2, 4] := -0.5;
  55.         basis[2, 3, 1] := -0.5;
  56.         basis[2, 3, 2] :=  0.0;
  57.         basis[2, 3, 3] :=  0.5;
  58.         basis[2, 3, 4] :=  0.0;
  59.         basis[2, 4, 1] :=  0.0;
  60.         basis[2, 4, 2] :=  1.0;
  61.         basis[2, 4, 3] :=  0.0;
  62.         basis[2, 4, 4] :=  0.0;
  63.  
  64.         
  65.         (* Bspline basis *)
  66.         basis[3, 1, 1] := -0.166666;
  67.         basis[3, 1, 2] :=  0.5;
  68.         basis[3, 1, 3] := -0.5;
  69.         basis[3, 1, 4] :=  0.166666;
  70.         basis[3, 2, 1] :=  0.5;
  71.         basis[3, 2, 2] := -1.0;
  72.         basis[3, 2, 3] :=  0.5;
  73.         basis[3, 2, 4] :=  0.0;
  74.         basis[3, 3, 1] := -0.5;
  75.         basis[3, 3, 2] :=  0.0;
  76.         basis[3, 3, 3] :=  0.5;
  77.         basis[3, 3, 4] :=  0.0;
  78.         basis[3, 4, 1] :=  0.166666;
  79.         basis[3, 4, 2] :=  0.666666;
  80.         basis[3, 4, 3] :=  0.166666;
  81.         basis[3, 4, 4] :=  0.0;
  82.  
  83.         (* 'Power' basis *)
  84.         basis[4, 1, 1] := 1.0;
  85.         basis[4, 1, 2] := 0.0;
  86.         basis[4, 1, 3] := 0.0;
  87.         basis[4, 1, 4] := 0.0;
  88.         basis[4, 2, 1] := 0.0;
  89.         basis[4, 2, 2] := 1.0;
  90.         basis[4, 2, 3] := 0.0;
  91.         basis[4, 2, 4] := 0.0;
  92.         basis[4, 3, 1] := 0.0;
  93.         basis[4, 3, 2] := 0.0;
  94.         basis[4, 3, 3] := 1.0;
  95.         basis[4, 3, 4] := 0.0;
  96.         basis[4, 4, 1] := 0.0;
  97.         basis[4, 4, 2] := 0.0;
  98.         basis[4, 4, 3] := 0.0;
  99.         basis[4, 4, 4] := 1.0;
  100.  
  101.         (*
  102.          * Geometry matricies
  103.          *)
  104.         x1[1, 1] :=  0.00;
  105.         x1[2, 1] :=  0.00;
  106.         x1[3, 1] :=  0.00;
  107.         x1[4, 1] :=  0.00;
  108.         x1[1, 2] :=  0.26;
  109.         x1[2, 2] :=  0.52;
  110.         x1[3, 2] :=  0.52;
  111.         x1[4, 2] :=  0.26;
  112.         x1[1, 3] :=  0.50;
  113.         x1[2, 3] :=  1.00;
  114.         x1[3, 3] :=  1.00;
  115.         x1[4, 3] :=  0.50;
  116.         x1[1, 4] :=  0.71;
  117.         x1[2, 4] :=  1.41;
  118.         x1[3, 4] :=  1.41;
  119.         x1[4, 4] :=  0.71;
  120.  
  121.         y1[1, 1] :=  1.00;
  122.         y1[2, 1] :=  2.00;
  123.         y1[3, 1] :=  2.00;
  124.         y1[4, 1] :=  1.00;
  125.         y1[1, 2] :=  0.97;
  126.         y1[2, 2] :=  1.93;
  127.         y1[3, 2] :=  1.93;
  128.         y1[4, 2] :=  0.97;
  129.         y1[1, 3] :=  0.87;
  130.         y1[2, 3] :=  1.73;
  131.         y1[3, 3] :=  1.73;
  132.         y1[4, 3] :=  0.87;
  133.         y1[1, 4] :=  0.71;
  134.         y1[2, 4] :=  1.41;
  135.         y1[3, 4] :=  1.41;
  136.         y1[4, 4] :=  0.71;
  137.  
  138.         z1[1, 1] :=  1.00;
  139.         z1[2, 1] :=  1.00;
  140.         z1[3, 1] :=  0.00;
  141.         z1[4, 1] :=  0.00;
  142.         z1[1, 2] :=  1.00;
  143.         z1[2, 2] :=  1.00;
  144.         z1[3, 2] :=  0.00;
  145.         z1[4, 2] :=  0.00;
  146.         z1[1, 3] :=  1.00;
  147.         z1[2, 3] :=  1.00;
  148.         z1[3, 3] :=  0.00;
  149.         z1[4, 3] :=  0.00;
  150.         z1[1, 4] :=  1.00;
  151.         z1[2, 4] :=  1.00;
  152.         z1[3, 4] :=  0.00;
  153.         z1[4, 4] :=  0.00;
  154.  
  155.         x2[1, 1] :=  0.71;
  156.         x2[2, 1] :=  1.41;
  157.         x2[3, 1] :=  1.41;
  158.         x2[4, 1] :=  0.71;
  159.         x2[1, 2] :=  0.87;
  160.         x2[2, 2] :=  1.73;
  161.         x2[3, 2] :=  1.73;
  162.         x2[4, 2] :=  0.87;
  163.         x2[1, 3] :=  0.97;
  164.         x2[2, 3] :=  1.93;
  165.         x2[3, 3] :=  1.93;
  166.         x2[4, 3] :=  0.97;
  167.         x2[1, 4] :=  1.00;
  168.         x2[2, 4] :=  2.00;
  169.         x2[3, 4] :=  2.00;
  170.         x2[4, 4] :=  1.00;
  171.  
  172.         y2[1, 1] :=  0.71;
  173.         y2[2, 1] :=  1.41;
  174.         y2[3, 1] :=  1.41;
  175.         y2[4, 1] :=  0.71;
  176.         y2[1, 2] :=  0.50;
  177.         y2[2, 2] :=  1.00;
  178.         y2[3, 2] :=  1.00;
  179.         y2[4, 2] :=  0.50;
  180.         y2[1, 3] :=  0.26;
  181.         y2[2, 3] :=  0.52;
  182.         y2[3, 3] :=  0.52;
  183.         y2[4, 3] :=  0.26;
  184.         y2[1, 4] :=  0.00;
  185.         y2[2, 4] :=  0.00;
  186.         y2[3, 4] :=  0.00;
  187.         y2[4, 4] :=  0.00;
  188.  
  189.         z2[1, 1] :=  1.00;
  190.         z2[2, 1] :=  1.00;
  191.         z2[3, 1] :=  0.00;
  192.         z2[4, 1] :=  0.00;
  193.         z2[1, 2] :=  1.00;
  194.         z2[2, 2] :=  1.00;
  195.         z2[3, 2] :=  0.00;
  196.         z2[4, 2] :=  0.00;
  197.         z2[1, 3] :=  1.00;
  198.         z2[2, 3] :=  1.00;
  199.         z2[3, 3] :=  0.00;
  200.         z2[4, 3] :=  0.00;
  201.         z2[1, 4] :=  1.00;
  202.         z2[2, 4] :=  1.00;
  203.         z2[3, 4] :=  0.00;
  204.         z2[4, 4] :=  0.00;
  205.  
  206.         labels[1] := 'Bezier Patch(es)';
  207.         labels[2] := 'Cardinal Patch(es)';
  208.         labels[3] := 'B-Spline Patch(es)';
  209.         labels[4] := '''Power'' Patch(es)'
  210.     end;
  211.  
  212.     (*
  213.      * axes
  214.      *
  215.      *    draw the axes
  216.      *)
  217.  
  218.     procedure axes;
  219.     begin
  220.         Color(YELLOW);
  221.         Move(0.0, 0.0, 0.0);
  222.         Draw(4.0, 0.0, 0.0);
  223.  
  224.         Move(0.0, 0.0, 0.0);
  225.         Draw(0.0, 4.0, 0.0);
  226.  
  227.         Move(0.0, 0.0, 0.0);
  228.         Draw(0.0, 0.0, 4.0)
  229.     end;
  230.  
  231.     (*
  232.      * drawhull
  233.      *
  234.      *    draw the hull for x, y, and z.
  235.      *)
  236.     procedure drawhull(x, y, z: Matrix44_t);
  237.         var i, j: integer;
  238.     begin
  239.  
  240.         Color(MAGENTA);    
  241.  
  242.         for i := 1 to 4 do begin
  243.             Move(x[i, 1], y[i, 1], z[i, 1]);
  244.             for j := 1 to 4 do
  245.                 Draw(x[i, j], y[i, j], z[i, j])
  246.         end;
  247.  
  248.         for i := 1 to 4 do begin
  249.             Move(x[1, i], y[1, i], z[1, i]);
  250.             for j := 1 to 4 do
  251.                 Draw(x[j, i], y[j, i], z[j, i])
  252.         end;
  253.  
  254.         (* 
  255.          * Set color for The patch
  256.          *)
  257.         Color(GREEN)
  258.     end;
  259.  
  260.  
  261. begin
  262.     (*
  263.      * demonstrate patches
  264.      *)
  265.  
  266.     init;
  267.  
  268.     write('Enter device: ');
  269.     readln(dev);
  270.  
  271.     Vinit(dev);
  272.     VsetFlush(false);
  273.  
  274.     Color(BLACK);
  275.     Clear;
  276.  
  277.     (*
  278.      * Set up two viewports (They actually overlap)
  279.      *)
  280.  
  281.     ViewPort(-1.0, 0.3, -1.0, 0.3);
  282.     Ortho(-2.0, 5.0, -2.0, 5.0, -2.0, 5.0);
  283.     LookAt(0.0, 0.0, 0.0, -3.0, 2.0, -4.0, 0.0);
  284.     (*
  285.      * Save it 
  286.      *)
  287.     PushViewPort;
  288.     PushMatrix;
  289.  
  290.     ViewPort(-0.3, 1.0, -0.3, 1.0);
  291.     Ortho(-2.0, 5.0, -2.0, 5.0, -2.0, 5.0);
  292.     LookAt(0.0, 0.0, 0.0, 3.0, 2.0, -4.0, 0.0);
  293.  
  294.     TextSize(0.4, 0.4);
  295.  
  296.     (*
  297.      * patchcurves provides a number of curves in the t and u
  298.      * directions. patchprecision gives the minimum number of line
  299.      * segments making up the curves in the t and u directions. The
  300.      * actual number of linesegments in t or u is equal to the closest
  301.      * integer multiple of the number of curves, > nsegs, in t or u,
  302.      * greater than or equal to the number set by patchprecision in u or
  303.      * t. eg. curves in t will be made up of 21 line segments so that we
  304.      * can match up the 7 curves in u; curves in u will have 24 as 4 by 5
  305.      * gives 20.
  306.      *)
  307.     PatchCurves(4, 7);
  308.     PatchPrecision(20, 20);
  309.  
  310.     for i := 1 to 4 do
  311.     begin
  312.  
  313.         axes;
  314.  
  315.  
  316.         (*
  317.          * patchbasis sets the basis matrices for the t and u
  318.          * functions
  319.          * 
  320.          *)
  321.         PatchBasis(basis[i], basis[i]);
  322.  
  323.         (* 
  324.          * Draw with viewport 2
  325.          *)
  326.         Move(0.0, 4.0, 0.0);
  327.         DrawStr(labels[i]);
  328.  
  329.         (*
  330.          * now draw the patches according to the geometry matrices in
  331.          * x1, y1, and z1, x2, y2, z2.
  332.          *)
  333.         drawhull(x1, y1, z1);
  334.         Patch(x1, y1, z1);
  335.  
  336.         drawhull(x2, y2, z2);
  337.         Patch(x2, y2, z2);
  338.  
  339.         (*
  340.          * Now with viewport 1
  341.          *)
  342.         PopViewPort;
  343.         PopMatrix;
  344.  
  345.         axes;
  346.  
  347.         Move(0.0, 4.0, 0.0);
  348.         DrawStr(labels[i]);
  349.  
  350.         (*
  351.          * now draw the patches according to the geometry matrices in
  352.          * x1, y1, and z1, x2, y2, z2.
  353.          *)
  354.         drawhull(x1, y1, z1);
  355.         Patch(x1, y1, z1);
  356.  
  357.         drawhull(x2, y2, z2);
  358.         Patch(x2, y2, z2);
  359.  
  360.         dum := GetKey;
  361.  
  362.         (*
  363.          * Save viewport 1 again and reset to viewport 2
  364.          *)
  365.         PushViewPort;
  366.         PushMatrix;
  367.  
  368.         ViewPort(-0.3, 1.0, -0.3, 1.0);
  369.         Ortho(-1.5, 5.0, -1.5, 5.0, -1.5, 5.0);
  370.         LookAt(0.0, 0.0, 0.0, 3.0, 2.0, -4.0, 0.0);
  371.  
  372.         Color(BLACK);
  373.         Clear
  374.     end;
  375.  
  376.     Vexit
  377. end.
  378.  
  379.