ReadMe.txt

To build and install GLUT Framework:
------------------------------------
 
Launch terminal
 
# change to glut project directory
cd (GLUT project directory)
 
# build the framework into /tmp
# Note: glut should be built with gcc3 or greater
xcodebuild install 
 
# copy the framework and replace the existing one (note, sudo requires the admin password)
sudo ditto /tmp/GLUT_External.dst/System/Library/Frameworks/GLUT.framework /System/Library/Frameworks/GLUT.framework
 
NOTE: Due to archiving and unarchiving for posting of this sample code, the
libForeground.a library may have inconsistant dates (Xcode will note 
this error if it exists).  The can be fixed by running "ranlib" on this 
library as follows:
 
# change to glut project directory
cd (GLUT project directory)
 
# update Foreground.o library
ranlib libForeground.a
 
NOTE: Installing a software update, which contains GLUT, over top of this 
build will replace the framework built by this sample code.  Developers should 
rebuild/reinstall this development build after a software update.
 
GLUT for Mac OS X (GLUT-3.4.0) Read Me (4/10/2007)
===========================
Additions:
----------
 
*)  Support for Garbage Collection
 
*)  Support for HiDPI
 
 
GLUT for Mac OS X (GLUT-3.3.9) Read Me (10/10/2005)
===========================
Additions:
----------
 
*)  Added no_recovery support for pixel format selection.  Logic added to both
mode enums and string handling.
 
 
GLUT for Mac OS X (GLUT-3.3.8) Read Me (9/22/2005)
===========================
 
Bug Fixes:
----------
 
*)  Fixed full screen stereo handling.
 
*)  Fixed inverted print/save/copy images.
 
 
GLUT for Mac OS X (GLUT-3.3.7) Read Me (8/30/2005)
===========================
 
Additions:
----------
 
*)  Added support for windowed stereo.  You can still get full screen stereo by using the fullscreen APIs in GLUT.
 
Bug Fixes:
----------
 
*)  Fixed state handling in print and save along with better alpha handling.
 
 
GLUT for Mac OS X (GLUT-3.3.6) Read Me (4/7/2005)
===========================
 
Additions:
----------
 
*)  Improvement in glutGetProcAddress dyld handling.
 
Bug Fixes:
----------
 
*)  Fixed bundle detection code to allow resources for packaged GLUT apps and console apps to run seamlessly.
 
*)  Fixed a number of minor warnings.
 
*)  Fix: (3526681) slow launch due to HID devices.
 
*)  Fix: (3935188) Issue with lack of autorelease pool at shutdown.
 
*)  Fix: (3961182) GLUT project fails to build with gcc-4.0
 
*)  Fixed a number of minor warnings.
 
*)  Fix: (3495231) GLUT 3 button mouse: if 2/3 buttons depressed, not all releases registered
 
*)  Fix: (3481381) OpenGL Glut Framework prepareForMiniaturization
 
*)  Fix: (3526681) glutSetCursor not behaving as expected
 
*)  Fix: (3852364) GLUT keyboard input stuck keys
 
*)  Fix: (3928640) GLUT Prefs "Set Defaults" button does not work
 
*)  Fix: (3928650) GLUT Prefs can save zero height default window size
 
*)  Fix: (3935190) glutTimerFunc doesn't work
 
*)  Fix: (3450425) glutLeaveGameMode doesn't leave fullscreen
 
*)  Fix: (3494200) glut resize bug
 
*)  Fix: (3495227) GLUT callbacks to joysticks/gamepads: rarely work correctly
 
*)  Fix: (3569992) Convert GLUT to native Xcode
 
*)  Fix: (3655228) glut window visibility events are not properly generated (glutFullScreen related)
 
*)  Fix: (3935184) glutEnterGameMode() spews "glutEnterGameMode entered"
 
*)  Fix: (3935591) glutSetCursor(GLUT_CURSOR_NONE) doesn't work
 
 
GLUT for Mac OS X (GLUT-3.2.8) Read Me
===========================
 
Additions:
----------
 
*)  Spaceball support for devices with 6+ axis, fully configurable.
 
*)  Added ability to use -useExtendedDesktop to allow glut to consider the
    full multi-monitor desktop when doing full screen windows and for window
    location.  Note the upper left of the desktop will be consider by glut to 
    be (0, 0) no matter where the menu bar is.  Current driver issues prevent
    good spanning full screen performance at this time, but a fix is in work.
    
*)  The visibility of MacOS X specific GLUT API extensions is now controlled
    by the GLUT_MACOSX_IMPLEMENTATION pre-processor macro. By default, all
    extensions are enabled. You may however turn them off by setting
    GLUT_MACOSX_IMPLEMENTATION to 0 before including the glut.h header. That
    way its easy to check whether your GLUT application is calling MacOS X
    specific APIs or not.
 
*)  Packaged GLUT applications now get automatically an About dialog. The dialog
    displays the application's version information and some optional text.
    The version number is taken from the CFBundleShortVersionString from the
    Info.plist. The optional text should be stored in a file called 'Credits.rtf'
    in the application's Resource folder.
    
*)  Added glutCheckLoop() and glutWMCloseFunc() APIs based on the same functions
    developed by Mr. Rob Fletcher for the Win32 GLUT version.
    
*)  Imported glutGetProcAddress() function from the Mesa3D project.
 
*)  Imported GLUT_FPS environment variable from the Mesa3D project.
 
*)  New preferences dialog. Allows global configuration of:
    - initialization variables (will affect next window creation or app launch
      depending on scope of configuration item)
    - Mouse emulation (normally turned on if a mouse with < 3 buttons is 
      found but can be enabled manually and emulation keys are configurable)
    - Joystick setup (any device with at least two axis can be configured, one
      device only will control all joystick inputs but specific inputs can be
      rearranged)
    - Spaceball setup (same notes as joystick)
    Prefs affect all glut applications and are saved globally.  Defaults can be
    set to go back to initial conditions.  Note, joystick and spaceball
    configuration modification take place immediately while others only
    take affect after pressing OK.
 
Bug Fixes:
----------
 
1)  Switching a window to fullscreen mode and back again (glutFullscreen()) now
    works more reliably. I.e. sub-windows with installed glutMotionFunc callbacks
    should no longer stop calling the callback after executing glutFullscreen().
    
2)  GLUT no longer calls a window's mouse callback with GLUT_UP, if the user
    dismissed a context menu by clicking outside the on-screen menu.
 
3)  Fixes for initial sub-window focus.
 
4)  Fix for better menu handling
 
5)  Fix full screen to allow it to be entered more than once
 
6)  Fix button callbacks to allow destruction of a window
 
7)  Fix full screen sub-window handling
 
8)  Fix poor work event and timer interaction
 
 
GLUT for Mac OS X (GLUT-3.1) Read Me
===========================
 
Additions:
----------
 
*)  Added glutSurfaceTexture  (GLenum target, GLenum internalformat, int surfacewin)
    target: Specifies an allowable 2D OpenGL texture target such as GL_TEXTURE_2D 
        or GL_TEXTURE_RECTANGLE_EXT.
    internalformat: Specifies the internal texture layout, which must be a supported 
        format listed on table 3.15, 3.16, 3.17 or 3.18 of the OpenGL 1.3 Specification.
    surfacewin: Specifies the GLUT window from which to get the texture.
 
    glutSurfaceTexture allows direct texturing from a window by using the window
    contents as the source data for the texture, behaving much the same way as
    glTexImage2D. The texture target, internal format must be supported the
    renderer of the target context. Additionally, the source window geometry
    must be compatible with the texture target. Thus, if the texture target is
    GL_TEXTURE_2D, the window must conform to power of two dimensions.
 
    This routine is designed for performance so the graphics driver will attempt
    to provide an optimum data path, keeping the data in VRAM if possible. Also,
    there is no window tracking, thus both target and source windows must be on
    the same virtual screen (renderer) or failure (likely lack of texturing)
    will result.
    
*)  GLUT now supports the UTF8 character encoding. This means that all functions
    which take strings, interpret them in the UTF8 encoding.
    
Bug Fixes:
----------
 
1)  glutInit() now correctly validates the time interval values given
    to -menuIdleInterval and -fadeInterval.
    
2)  Improved GLUT shutdown. GLUT now guarantees that any atexit() handlers
    installed by the application are called before GLUT starts its own
    cleanup process. The only precondition for this to work is that the
    application installs its atexit() handlers AFTER it has called glutInit().
 
3)  Made showing of hidden sub-windows, which contain themselves sub-windows,
    more reliable.
    
4)  All keyboard input is now passed to GLUT apps in the UTF8 character encoding.
    One important consequence of this change is that GLUT apps should now better
    work with non-US keyboards (i.e. Alt-5 should now correctly produce a '['
    character with German keyboards).
 
 
GLUT for Mac OS X (GLUT-3.0) Read Me
===========================
 
Additions:
----------
 
*)  Added -useMacOSCoords command line argument to allow negative coords to be 
    correctly mapped to the Mac OS X desktop space.  If this is not enabled, GLUT
    functions per the spec and maps all negative coords to defaults.  If this option
    is provided all coords supplied after this option will be used as is and will
    be directly mapped the desktop (including moving the window completely off
    screen if the coords are not visible).
    
*)  Added -menuIdleInterval command line argument to set the interval for
    idle events when the menus are shown, default is 0.016 seconds.
    
*)  Added -fadeInterval command line argument to set the length of screen fades into
    and out of gamemode, default is 1.0 second.
    
*)  Added stereo support.  This requires full screen and glutGameMode.  So set 
    the pixel format to stereo and enter gamemode to get stereo contexts. Apps
    will need to draw required sync lines for whatever 3D glasses they are using,
    see developer.apple.com/samplecode for examples. Here is an initialization 
    example:
    
      glutInit(&argc, (char **)argv);
      
      // stereo display mode for glut
      glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH | GLUT_STEREO);
      
      // must now use full screen game mode
      glutGameModeString("1024x768:32@120");
       
      // enter gamemode to get stereo context 
      //  (may get invalid drawable warnings in console, 
      //   this is normal and will be fixed in the future)
      glutEnterGameMode(); 
 
*)  Added complete joystick support including a configuration dialog and multi-device
    support.  To avoid strange axis and button mappings GLUT looks for devices which
    report themselves as joystick or gamepad.
 
*)  Added better multi-button mouse support.  Should now use 3 native buttons with mice
    which have 3 buttons or more and emulate (cntl-click = right click, opt-click = 
    middle click) with mice which have 1 or 2 buttons.  The three buttons glut looks for
    are left, right and other in Cocoa or button 1,2 and 3 in HID terms, if a 
    custom mouse driver re-maps these then glut will not see the correct button
    press.
 
*)  Add -captureSingleDisplay launch parameter to allow the capturing of only one display
    when entering game mode.
    
*) Implemented GLUT_CURSOR_DESTROY selector for glutSetCursor()
 
*) Implemented GLUT_CURSOR_CYCLE selector for glutSetCursor()
 
*) Implemented GLUT_CURSOR_SPRAY selector for glutSetCursor()
 
*) Implemented all sizing cursor selectors for glutSetCursor()
 
*) Improved GLUT_CURSOR_CROSSHAIR
 
 
Bug Fixes:
----------
 
1)  glutCreateWindow() now correctly sets the window title to the given
    window title string, if any.
   
2)  GLUT now correctly calls any passive motion and/or entry callback for
    sub-windows if the glutPassiveMotionFunc(), glutEntryFunc() are called
    before the sub-window has become visible. Previously, the callback were
    only called after the user resized the top-level window which contained
    the sub-windows at least once.
    
3)  Normally, glut changes the working directory to the resources directory of
    the applications package.  This allows textures and other app resources 
    to be packaged with the application.  GLUT will detect the lack of this 
    directory, such as with a non-packaged command line application and not
    change the working directory.  Additionally, added the ability to specify 
    a working directory option -useWorkingDir as a command line argument which
    will also prevent GLUT from changing the initial working directory.
    
4)  Fixed window miniturization code to not detach surfaces.
 
5)  Updated event handling to be more responsive and use less CPU, results in modest
    performance gains in some cases.
    
6)  Handle lazy surface creation much better.
 
7)  Fixed GLUT initialization code to allow command line apps to run in the foreground
    and accept keyboard and menu input.
    
8)  Fixed sub-window visibiloty issues.
 
9)  Fixed game mode refresh rate handling to use doubles to get values from dictionary
    otherwise many refresh rates will fail to be returned and thus the display mode
    will not be recognized.
 
10) Numerous other fixes.
 
 
 
GLUT for Mac OS X Read Me
===========================
 
Additions:
----------
 
*) Implemented GLUT_CURSOR_CROSSHAIR selector for glutSetCursor()
*) Implemented GLUT_CURSOR_FULL_CROSSHAIR selector for glutSetCursor()
*) Implemented GLUT_CURSOR_HELP selector for glutSetCursor()
*) Implemented GLUT_CURSOR_LEFT_RIGHT selector for glutSetCursor()
*) Implemented GLUT_CURSOR_RIGHT_ARROW selector for glutSetCursor()
*) Implemented GLUT_CURSOR_UP_DOWN selector for glutSetCursor()
*) Implemented GLUT_CURSOR_WAIT selector for glutSetCursor()
 
 
Bug Fixes:
----------
 
1) A timer function set via glutTimerFunc() would be called up to a second too
   early. I.e. requested timeout 500ms -> timer fired instantly.
   
2) Top-level windows destroyed before a call to glutMainLoop() would not be
   immediately freed, rather they would stay around until the main loop was
   entered.
   
3) Clicking in a sub-window now makes it actually the first responder so that it
   is able to receive key down/up events.
   
4) Menus now work like with any other GLUT implementation, which means that they
   are now ALWAYS contextual menus. While this change means that GLUT apps now
   no longer really work like other Aqua apps, it does however mean that this
   GLUT release operates now MUCH more like GLUT implementations on other
   platforms. Thus, the menu status function is now called with the real mouse
   position, the correct window is now made current and the selected menu is now
   also made current prior to calling any menu related callbacks.
   Further, we now also support the ability to assign a menu multiple times to
   different menu items as a submenu.
   Also, we now correctly support menus for sub-windows (the old implementation
   would only allow the creation AND usage of up to three menus and simply ignore
   any additional menus created after that point, so i.e. menus of a sub-window
   were never accessible by the user).
   Accessing menus with a one-button mouse:
      Control + Shift:       GLUT_LEFT_BUTTON menu
      Control + Alternate:   GLUT_MIDDLE_BUTTON menu
      Control:               GLUT_RIGHT_BUTTON  menu
   
5) The menu status function and menu item callback are now called in the correct
   order: menuStatusFunc(GLUT_MENU_NOT_IN_USE) followed by menuItemFunc(item).
   
6) Determination of window & sub-window visibility is now _dramatically_ faster
   than it used to be, especially with many windows (> 20).
   
7) glutWarpPointer() now works as expected.
 
8) glutInitDisplayString() should now work as documented in its man page. It simply
   ignored any matching criteria in earlier releases. Consequently, if i.e. you
   asked for a stencil buffer with at least 3 bits depth, you couldn't actually be
   sure that you really got 3 bits worth of stencil. You may have ended up with a
   valid OpenGL context with no stencil buffer at all.
   
9) glutInitDisplayMode() is now much stricter in its operation. I.e. it now
   correctly rejects an attempt to create an indexed OpenGL context as MacOS X
   doesn't support indexed pixel formats.
   
10) glutFullScreen() now makes the current window really cover the whole screen.
 
11) glutGet(GLUT_WINDOW_PARENT) now also works correctly for hidden sub-windows.
 
12) glutGet(GLUT_DISPLAY_MODE_POSSIBLE) now works as advertised. Previously it
    would return 1 for pixel formats which were actually not supported.
    
13) De-miniaturizing a top-level window with sub-windows would result in a window
    were none of the sub-windows would be visible. Sub-windows now work correctly
    after window de-miniturization.
    
14) The mini-window of a de-miniturized now correctly shows a snapshot of all
    sub-windows of the de- miniturized window. The same is true for window snapshots
    taken by Edit/Copy and for services.
 
15) Fixed handling of GL commands immediately after window creation but before the
    main loop.  The window is now shown immediately but the events are deferred
    until run main loop is called.
 
16) fixed pixel format handling to not pass un-needed parameteres to GL.  Should
    result in more reliability in get pixel formats.
 
17) Cleaned up multi-sample handling.
 
18) Fixed event handled to use a CFTimer for GLUT events that is separate from the 
    NSEvent queue.
 
 
GLUT for Mac OS X Read Me
===========================
 
Bug Fixes:
----------
 
1) Creating a menu and destroying it before entering the main event loop via
   glutMainLoop() would crash the application.
   
2) Turning a menu item with an associated submenu into a regular menu item
   would result in a menu item which never invoked its associated callback.
   
3) Top-level windows would be positioned incorrectly.
 
4) glutGet(GLUT_WINDOW_Y) would always return the wrong position for a top-
   level window.
   
5) No visibility changed events would be generated for visibility changes
   caused by top-level windows.
 
6) Window visibility calculation code was wrong most of the time which
   resulted in calls to a window's status callback with the wrong visibility
   code or no call at all (especially for sub-windows).
 
7) Hiding/Unhiding a GLUT application would not update the window status
   of GLUT windows which had the effect that apps continued to consume
   CPU cycles while hidden.
   
7) We now generate 'real' visibility events just like X Windows does which
   means that we have now the same semantics on Mac OS X as under X Windows.
   
8) Complete rewrite of the work event mechansim (deferred updates). The new
   implementation is semantically 99.9% the same as the X Windows implementation
   and much more efficient. I.e. we always only generate at most one Work
   event per AppKit event. Previously, every single glutPostWindowRedisplay()
   would generate two Work events per AppKit event. Now at most one single
   Work event is generated independent of the number of glutPostWindowRedisplay()
   calls per AppKit event.
   
9) The organization of the project sources is now much closer to the original
   distribution which should make it easier to identifier areas where we
   unindentionally differ from the original implementation.
   
10) The mouse coordinates passed to the various mouse related callbacks are now
    correctly rounded to integral pixel locations.
    
11) Key events with more than a single UTF-16 codepoint would only pass on
    the first codepoint to the GLUT application and drop the others on the
    floor.
 
12) No key events would be accepted by a window after it was deminiaturized.
 
13) Showing/hiding subwindows wouldn't work correctly. They do now and a hidden
    subwindow will correctly retain its relative position among its siblings
    while hidden even as new siblings are added and others are removed. We do
    this by maintaining a doubly-linked list of subwindows parallel to the
    -subviews array which the AppKit manages. The important difference between
    our list and -subviews is that the former contains all subwindows _including_
    hidden subwindows while the latter _only_ contains shown subwindows.
    
14) Calling glutPostWindowRedisplay() on any subwindow would result in
    superfluous redisplay operations. I.e. invalidating a leave window in
    the window hierarchy would redisplay all ancestors up to the controlling
    top-level window.
    
15) Significantly reduced the overhead of a redisplay operation.
 
16) glutMouseFunc now supports GLUT_MIDDLE_BUTTON. glutMotionFunc() is now
    correctly called for any mouse button (not only left & right buttons as
    it used to be).
   
17) Displaying the Show Clipboard window would not deactivate the current main
    window. It does so now.
    
18) Determination of a window's or subwindow's damaged status is now much more
    reliable.
    
19) Invoking glutVisibilityFunc() and glutWindowStatusFunc() on the same window
    is now handle the same as it is for the X Windows implementation.
    
20) Newly created windows now have a default reshape & display callback as
    required.
    
21) glutPassiveMotionFunc() is now handled correctly for multiple subwindows.
    Previously if i.e. two subwindows installed a passive motion function, as
    soon as one of them would call glutPassiveMotionFunc(NULL) no further
    passive motion calls would be generated for _any_ subwindow.
    
22) Calling glutWindowStatusFunc(NULL) now correctly resets the current window's
    visibility state to unknown.
    
23) No more superfluous calls to a window's reshape callback are done.
 
   
GLUT for Mac OS X Read Me
===========================
 
This is an improved version of the GLUT that Apple ships with MacOS X v10.1.3.
The following table lists all changes relative to Apple's version:
 
*) Cleaned up project
*) Fully implemented GLUT game mode and related APIs
*) Implemented glutSetKeyRepeat() function
*) Implemented GLUT_DEVICE_KEY_REPEAT selector for glutDeviceGet()
*) Implemented GLUT_DISPLAY_MODE_POSSIBLE selector for glutGet()
*) Implemented GLUT_WINDOW_NUM_SAMPLES selector for glutGet()
*) Implemented GLUT_CURSOR_INHERIT selector for glutSetCursor()
*) Implemented GLUT_CURSOR_INFO selector for glutSetCursor()
*) Added support for GLUT_MULTISAMPLE display mode flag and "samples" display
   string keyword
*) Cleaned up menus
*) Hide and Quit menu items now automatically show the GLUT application name
*) User may now copy the contents of the current front window to the clipboard
   via Edit/Copy
*) User may now invoke a service on the contents of the current front window
*) User may now inspect the contents of the clipboard via Edit/Show Clipboard
*) User may now print the contents of the current front window
*) GLUT application menus are now added to the menu bar according to the Aqua
   Guidelines
*) Got rid of a few memory leaks
*) Miniaturized windows now show a snapshot of the window content area
   (OpenGL graphics)
 
If you don't want to support services, copying and saving the contents of the current
front window in your GLUT application then you may turn this behavior off by supplying
the "-nograb" option on the command line (or at least the command string you actually
pass to the glutInit() function).
 
If you don't want to support printing in your GLUT application then you may turn it off
by supplying the "-noprint" option on the CLI.