#/*
# * Copyright (c) 1993-1997, Silicon Graphics, Inc.
# * ALL RIGHTS RESERVED 
# * Permission to use, copy, modify, and distribute this software for 
# * any purpose and without fee is hereby granted, provided that the above
# * copyright notice appear in all copies and that both the copyright notice
# * and this permission notice appear in supporting documentation, and that 
# * the name of Silicon Graphics, Inc. not be used in advertising
# * or publicity pertaining to distribution of the software without specific,
# * written prior permission. 
# *
# * THE MATERIAL EMBODIED ON THIS SOFTWARE IS PROVIDED TO YOU "AS-IS"
# * AND WITHOUT WARRANTY OF ANY KIND, EXPRESS, IMPLIED OR OTHERWISE,
# * INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY OR
# * FITNESS FOR A PARTICULAR PURPOSE.  IN NO EVENT SHALL SILICON
# * GRAPHICS, INC.  BE LIABLE TO YOU OR ANYONE ELSE FOR ANY DIRECT,
# * SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY
# * KIND, OR ANY DAMAGES WHATSOEVER, INCLUDING WITHOUT LIMITATION,
# * LOSS OF PROFIT, LOSS OF USE, SAVINGS OR REVENUE, OR THE CLAIMS OF
# * THIRD PARTIES, WHETHER OR NOT SILICON GRAPHICS, INC.  HAS BEEN
# * ADVISED OF THE POSSIBILITY OF SUCH LOSS, HOWEVER CAUSED AND ON
# * ANY THEORY OF LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE
# * POSSESSION, USE OR PERFORMANCE OF THIS SOFTWARE.
# * 
# * US Government Users Restricted Rights 
# * Use, duplication, or disclosure by the Government is subject to
# * restrictions set forth in FAR 52.227.19(c)(2) or subparagraph
# * (c)(1)(ii) of the Rights in Technical Data and Computer Software
# * clause at DFARS 252.227-7013 and/or in similar or successor
# * clauses in the FAR or the DOD or NASA FAR Supplement.
# * Unpublished-- rights reserved under the copyright laws of the
# * United States.  Contractor/manufacturer is Silicon Graphics,
# * Inc., 2011 N.  Shoreline Blvd., Mountain View, CA 94039-7311.
# *
# * OpenGL(R) is a registered trademark of Silicon Graphics, Inc.
# */
#
#/*
# *  aapoly.c
# *  This program draws filled polygons with antialiased
# *  edges.  The special GL_SRC_ALPHA_SATURATE blending 
# *  function is used.
# *  Pressing the 't' key turns the antialiasing on and off.
# */

require "opengl"
require "glut"

$polySmooth = true

def init
   GL::CullFace (GL::BACK);
   GL::Enable (GL::CULL_FACE);
   GL::BlendFunc (GL::SRC_ALPHA_SATURATE, GL::ONE);
   GL::ClearColor (0.0, 0.0, 0.0, 0.0);
end

NFACE=6
NVERT=8
$indices = [
  [4, 5, 6, 7], [2, 3, 7, 6], [0, 4, 7, 3],
  [0, 1, 5, 4], [1, 5, 6, 2], [0, 3, 2, 1]
]

def drawCube(x0, x1, y0, y1, z0, z1)
   v = [[],[],[],[],[],[],[],[]]
   c = [
      [0.0, 0.0, 0.0, 1.0], [1.0, 0.0, 0.0, 1.0],
      [0.0, 1.0, 0.0, 1.0], [1.0, 1.0, 0.0, 1.0],
      [0.0, 0.0, 1.0, 1.0], [1.0, 0.0, 1.0, 1.0],
      [0.0, 1.0, 1.0, 1.0], [1.0, 1.0, 1.0, 1.0]
   ];

#/*  indices of front, top, left, bottom, right, back faces  */

   v[0][0] = v[3][0] = v[4][0] = v[7][0] = x0;
   v[1][0] = v[2][0] = v[5][0] = v[6][0] = x1;
   v[0][1] = v[1][1] = v[4][1] = v[5][1] = y0;
   v[2][1] = v[3][1] = v[6][1] = v[7][1] = y1;
   v[0][2] = v[1][2] = v[2][2] = v[3][2] = z0;
   v[4][2] = v[5][2] = v[6][2] = v[7][2] = z1;

   GL::EnableClientState (GL::VERTEX_ARRAY);
   GL::EnableClientState (GL::COLOR_ARRAY);
   GL::VertexPointer (3, GL::FLOAT, 0, v.flatten!.pack("f*"));
   GL::ColorPointer (4, GL::FLOAT, 0, c.flatten!.pack("f*"));
   GL::DrawElements (GL::QUADS, NFACE*4, GL::UNSIGNED_BYTE, $indices.flatten.pack("C*"));
   GL::DisableClientState (GL::VERTEX_ARRAY);
   GL::DisableClientState (GL::COLOR_ARRAY);
end

#/*  Note:  polygons must be drawn from front to back
# *  for proper blending.
# */
display = proc {
   if ($polySmooth)
      GL::Clear (GL::COLOR_BUFFER_BIT);
      GL::Enable (GL::BLEND);
      GL::Enable (GL::POLYGON_SMOOTH);
      GL::Disable (GL::DEPTH_TEST);
   else
      GL::Clear (GL::COLOR_BUFFER_BIT | GL::DEPTH_BUFFER_BIT);
      GL::Disable (GL::BLEND);
      GL::Disable (GL::POLYGON_SMOOTH);
      GL::Enable (GL::DEPTH_TEST);
   end

   GL::PushMatrix ();
      GL::Translate(0.0, 0.0, -8.0);    
      GL::Rotate(30.0, 1.0, 0.0, 0.0);
      GL::Rotate(60.0, 0.0, 1.0, 0.0); 
      drawCube(-0.5, 0.5, -0.5, 0.5, -0.5, 0.5);
   GL::PopMatrix ();

   GL::Flush ();
}

reshape = proc {|w, h|
   GL::Viewport(0, 0, w, h);
   GL::MatrixMode(GL::PROJECTION);
   GL::LoadIdentity();
   GLU::Perspective(30.0,  w.to_f/ h.to_f, 1.0, 20.0);
   GL::MatrixMode(GL::MODELVIEW);
   GL::LoadIdentity();
}

# /* ARGSUSED1 */
keyboard = proc {|key, x, y|
   case (key)
   when ?t ,?T
         $polySmooth = !$polySmooth;
         GLUT::PostRedisplay();
   when 27
         exit(0);  #/*  Escape key  */
   end
}

#/*  Main Loop
# */
#int main(int argc, char** argv)
#{
   GLUT.Init
   GLUT.InitDisplayMode (GLUT::SINGLE | GLUT::RGB | GLUT::ALPHA | GLUT::DEPTH);
   GLUT.InitWindowSize(200, 200);
   GLUT.CreateWindow($0)
   init ();
   GLUT.ReshapeFunc (reshape);
   GLUT.KeyboardFunc (keyboard);
   GLUT.DisplayFunc (display);
   GLUT.MainLoop();

