OpenGL for Win32
A picture is worth a thousand words.
Napoléon
*** The contents of this page are obsolete ***
Introduction
OpenGL is the most widely adopted, cross-platform standard for 3D rendering 
and 3D hardware acceleration. The software runtime library ships with all 
Windows, MacOS, Linux and Unix systems.
OpenGL is built for compatibility across hardware and operating systems. 
This architecture makes it easy to port OpenGL programs from one system to 
another.
The OpenGL Perl module allows a Perl program to use OpenGL by letting it 
make OpenGL function calls.
You will find here a ppm package for this module. It uses
GLUT for Win32, a 
port by Nate Robins of the original GLUT (OpenGL Utility Toolkit) library written by Mark 
Kilgard.
Limitations, bugs
Caveats
  -     
  This is a port of the version 0.54 of the module. All the functions 
  supported by the module (and by Windows) works now.  
  
 
  -  
  Of course, the GLX library is not implemented: it's an OpenGL library for 
  the X Window System. So, don't use the 
glx* functions in your 
  script! Caution: the glpOpenWindow function uses internaly some 
  GLX functions; don't use it.  
     
  - The WGL library is not implemented. I'm working on this extension. Be patient!
 
  - I increased the doc but it remains light well:
      
OpenGL.pod 
Implementation dependent differences:
(from the Nate Robins readme-file README-win32.txt )
There are a few differences between the Win32 version of GLUT and the X11 
version of GLUT.  Those are outlined here.  Note that MOST of these 
differences are allowed by the GLUT specification.  Bugs and unsupported 
features are outlined in the next section.
  - glutInit:
  The following command line options have no meaning (and are ignored) in 
  GLUT for Win32: -display, -indirect, -direct, -sync.
   
  - glutInitWindowPosition, glutPositionWindow:
  Win32 has two different coordinate systems for windows. One is in terms 
  of client space and the other is the whole window space (including the 
  decorations).  If you glutPositionWindow(0, 0), GLUT for Win32 will place 
  the window CLIENT area at 0, 0.  This will cause the window decorations 
  (title bar and left edge) to be OFF-SCREEN, but it gives the user the 
  most flexibility in positioning. HOWEVER, if the user specifies 
  glutInitWindowPosition(0, 0), the window is placed relative to window 
  space at 0, 0. This will cause the window to be opened in the upper left 
  corner with all the decorations showing.  This behaviour is acceptable 
  under the current GLUT specification.
   
  - glutSetIconTitle, glutSetWindowTitle:
  There is no separation between Icon title and Window title in Win32. 
  Therefore, setting an icon title in Win32 has no effect.
   
  - glutSetCursor:
  As indicated in the GLUT specification, cursors may be different on 
  different platforms.  This is the case in GLUT for Win32.  For the most 
  part, the cursors will match the meaning, but not necessarily the shape. 
  Notable exceptions are the GLUT_CURSOR_INFO & GLUT_CURSOR_SPRAY which use 
  the crosshair cursor and the GLUT_CURSOR_CYCLE which uses the 'no' or 
  'destroy' cursor in Win32.
   
  - glutVisibilityFunc:
  Win32 seems to be unable to determine if a window is fully obscured. 
  Therefore, the visibility of a GLUT window is only reflected by its 
  Iconic, Hidden or Shown state.  That is, even if a window is fully 
  obscured, in GLUT for Win32, it is still "visible".
   
  - glutEntryFunc:
  Window Focus is handled differently in Win32 and X. Specifically, the 
  "window manager" in Win32 uses a "click to focus" policy.  That is, in 
  order for a window to receive focus, a mouse button must be clicked in 
  it.  Likewise, in order for a window to loose focus, a mouse button must 
  be clicked outside the window (or in another window). Therefore, the 
  Enter and Leave notification provided by GLUT may behave differently in 
  the Win32 and in X11 versions. There is a viable workaround for this.  A 
  program called "Tweak UI" is provided by Microsoft which can be used to 
  change the focus policy in Win32 to "focus follows mouse". It is 
  available from the Microsoft Web Pages:
 
  http://www.microsoft.com/windows/software/PowerToy.htm
   
  - glutCopyColormap:
  GLUT for Win32 always copies the colormap.  There is never any sharing of 
  colormaps.  This is probably okay, since Win32 merges the logical palette 
  and the physical palette anyway, so even if there are two windows with 
  totally different colors in their colormaps, Win32 will find a 
  (hopefully) good match between them.
   
  - glutIdleFunc + menus: The glut idle function will NOT be called when 
    a menu is active. This causes all animation to stop when a menu is active 
    (in general, this is probably okay). Timer functions will still fire, however. 
    If the timer callback draws into the rendering context, the drawing will not 
    show up until after the menu has finished, though. 
 
Unsupported/Bugs:
  - glutAttachMenu:
  Win32 only likes to work with left and right mouse buttons. Especially so 
  with popup menus.  Therefore, when attaching the menu to the middle mouse 
  button, the LEFT mouse button must be used to select from the menu.
   
  - glutSpaceball*, glutButtonBox*, glutTablet*, glutDials*:
  None of the special input devices are supported at this time.
   
  - 
  When resizing or moving a GLUT for Win32 window, no updating is 
  performed.  This causes the window to leave "tracks" on the screen when 
  getting bigger or when previously obscured parts are being revealed.  I 
  put in a bit of a kludgy workaround for those that absolutely can't have 
  the weird lines.  The reshape callback is called multiple times for 
  reshapes.  Therefore, in the reshape callback, some drawing can be done. 
  It should probably be limited to a color buffer clear.
  
 
  - 
  The video resizing capabilities of GLUT 3.3+ for X11 is currently 
  unimplemented (this is probably ok, since it really isn't part of the 
  spec until 4.0).  I doubt that this will ever be part of GLUT for Win32, 
  since there is no hardware to support it.  A hack could simply change the 
  resolution of the desktop.
  
 
Download
The package is in my ppm repository.
If you are using ActiveState's Perl distribution (Perl5.6 or Perl5.8),
the easiest way to install this module is to use ppm.
Type (or cut & paste) this command in a DOS console:
    
ppm install http://www.bribes.org/perl/ppm/OpenGL.ppd
The documentation, in html format, is at its usual location.
You can download the patched source file here:
 OpenGL-0.54.03.tar.gz
Instructions for compiling the module with MSVC++ are in the README.Win32 file.
You can also use this patch: OpenGL-0.54.patch.
Keep in mind that this module is still in beta stage for Windows.
Report bug (for this version only) to
jl_morel@bribes.org. Thanks. 
Example script
To test the module, I translated in Perl some classic C programs for OpenGL.
Download the package (demos.zip) and run
the scripts to test the module on your machine.
  
  
The last screenshot is the one of the script cube.pl, an 
adaptation in Perl of the Chris Halsall's programme cube.c.
See the 
O'Reilly Network.
Links
Back to Top
BðP © 2004 J-L Morel - Contact : jl_morel@bribes.org