
1.1.0 ( 3rd November 1998 )
--------------------------------------------------

    o GLComponent wrongly enabled GLContext tracing when used as an 
      ImageProducer. This took effect when an EPSWriter or PPMWriter were
      used, for example.

    o Polymorphic method calls added to all GLU classes.

    o Ability to alter [J]GLComponent ``niceness'' to other threads fully
      implemented and discussed in a technical article on our WWW site.

    o com.hermetica.util3d.Texture wrongly generated texture data back-to-front
      and upside-down.

    o Added support for Windows98, MacOS, OS/2, AIX platforms. Support for the
      SuperCede and the Cambridge OpenGroup JVMs was also added. See our WWW
      site for information to check on which platforms are supported.

    o Added set*Stream() and get*Stream() methods to 
      com.hermetica.util3d.Stream allowing you to specify the stream to which
      tracing and profiling information is written to. For example, you might
      wish to redirect this information to a file for later perusal.

    o Added lightweight component hooks in GLComponentFactory to support the
      new JGLComponent class

    o The GLComponentListener class has been renamed to the more sensible
      name of GLEventListener

    o Two additional arguments have been added to the reshape() method of
      any GLEventListener classes, vide:

        public void reshape( GLDrawable component, int width, int height )

      is now:

        public void reshape( GLDrawable component, int x, int y,
                             int width, int height )

      where ( x, y ) is the bottom-left corner of the OpenGL viewport and is
      suitable for passing to glViewport() calls.

    o Evaluation copy lock-outs are now implemented. This allows you 100
      buffer-swap operations before each buffer swap slows down to take
      exactly 2 seconds irrespective of rendering time. The words ``Unlicensed''
      and ``Evaluation'' are also displayed on each GLComponent.

    o Support for direct and indirect contexts has been added. AIX support 
      with IBM OpenGL defaultly uses indirect contexts to circumvent
      thread-safety issues in this OpenGL implementation. To wit, the
      setDirectRender() and getDirectRender() methods within the GLCapabilities
      class.

    o GLComponent now internally traps Exceptions in a way that does not 
      fatally halt program execution.

    o glTexImage*() now takes NULL arrays as valid arguments without causing
      JNI panics under JNI-based JVMs or crashes under RNI-based JVMs.

    o Additional constructor added to the GLUTesselator class allowing
      more exact specification of which tessellator callbacks should be
      registered. This allows you to finely tune tessellator operation, for
      example, to not register the edgeFlag() callback to allow triangle
      strip generation instead of triangles. All callbacks are registered
      by default.

    o GL and GLU constants are now implemented within two separate interfaces
      called GLConstants and GLUConstants allowing you easy and namespace-
      independent access to these values.

1.0 ( 10th June 1998 )
--------------------------------------------------

    o The Programmer's Guide has now been completed and is available with
      the Magician 1.0 release

    o Developer access to extensions and Magician internals via ``Extension
      Developer's Kit'' ( EDK )

    o All classes have been moved from the COM.hermetica.* hierarchy to the
      com.hermetica.* hierarchy.

    o GLComponent and GLComponentFactory usage should be changed to use the
      GLDrawable interface and GLDrawableFactory classes instead.

    o GLDrawable classes now act as a Java ImageProducer. Supplementary
      PPM and EPS writing classes have also been supplied for handling the
      output

    o com.hermetica.util3d.trackball has now been fixed and additional
      useful quaternion-handling methods have been exposed for public use

    o com.hermetica.util3d.MicroTimer has been fixed on Win32 platforms

    o com.hermetica.util3d.shapes has been fixed. All shapes now are generated
      correctly and can be seen in the ``Throwing Shapes!'' demo program

    o Fullscreen handling for GLDrawable has been added with the
      GLFullScreenFrame class

    o ErrorGL and ErrorGLU pipeline classes now function correctly

    o Verbose mode for TraceGL and TraceGLU pipelines now functions correctly

    o Many new demos have been added!

Beta 4 ( 31st March 1998 )
--------------------------------------------------

    o 100% OpenGL and GLU

      100% of the OpenGL 1.1 and GLU 1.1 specifications have been implemented
      in Magician!

    o Solaris port is available!

      Ports for Solaris using both Mesa and Creator 3D enabled machines are
      now available. Both JDK-1.1.[345] and JDK-1.2beta3 are supported for
      this operating system.

    o Display List sharing

      The ability to share display lists and texture objects between OpenGL
      rendering contexts is now available in Magician Beta 4.

    o Font handling

      Magician Beta 4 adds utility classes for using portable fonts within
      your application. These fonts are actually encapsulated within Java
      classes and can be shipped with your applications ensuring that your
      product looks identical across all platforms and no ``fallback'' fonts
      are used.

    o GLU Tesselators

      Support for GLU 1.1 tesselators has been added enabling you to decompose
      complex polygons into primitives that OpenGL can render. The tesselator
      support added in Magician is extremely powerful and simple to use.

    o Support for JDK-1.2 and Internet Explorer 4

      Magician Beta 4 now supports more platforms including JDK-1.2beta3
      and Microsoft Internet Explorer 4.x. Support for Internet Explorer 3
      has been dropped. You can, however, still run Magician applets within
      IE3 by installing the Microsoft Java VM Upgrade.

Beta 3 ( 5th January 1998 )
---------------------------

  Marketing
  ---------

    o Ports for Internet Explorer 3.x have been released

    o A port to SGI Irix has been released

    o Magician now supports Microsoft OpenGL on Windows 95/NT platforms

  Technical
  ---------

    o Shared libraries are now distributed with unique filenames for multiple
      load attempts and fallback load attempts

    o More informative error messages upon library load failures

    o Added some new methods to GLContext and deprecated others. The deprecated
      methods will disappear in either beta 4 or the final release, whichever
      comes first

    o Added source distributed TemplateGL class for developers wishing to
      write customized OpenGL pipeline classes

    o Ports for Microsoft Internet Explorer 3.x and 4.x are now available

    o Silicon Graphics' Irix port is now available

    o Magician built with Microsoft OpenGL is now available on Windows 95/NT
      operating systems

    o Overlay plane handling added to GLCapabilities class

    o Intelligent accumulation bits settings for X Windows added to GLCapabilities.
      You can now set all the accumulation buffer components in one call to
      setAccumBits() instead of separate calls to setAccumRedBits() and so
      on

    o AbstractGL and AbstractGLU interfaces have been renamed to GL and GLU.
      The GL and GLU classes have been renamed to CoreGL and CoreGLU

    o Added glMultMatrix polymorphic convenience function for decoding 
      2-dimensional arrays containing matrix data

    o nVidia Riva 128/3D chipset cards are now supported via the nVidia alpha
      OpenGL ICD for SGI OpenGL

    o GLUT-like interface has been added to GLComponent via a 
      GLComponentListener interface. This allows developers to define
      initialize(), reshape() and repaint() methods that handles the basic
      functions of window handling. Conversion of existing C/C++-based OpenGL
      and GLUT code to Magician has never been easier!

    o Internal classes for critical section handling are now publicly
      available in COM.hermetica.util3d.CriticalSection

    o Microsecond accurate timer class has been added. This came about due
      to the standard millisecond timing available via System.currentTimeMillis()
      being unable to provide accurate profiling information.

Beta 2 ( 11th November 1997 )
----------------------------

  Marketing
  ---------

    o Support for Netscape Communicator 4.x. Navigator 3.x, and earlier 
      releases, will *not* be supported. Communicator 4.04 and the JDK Patch
      Preview Release 3 are *required*

    o Support for Microsoft's Java SDK 1.5.1 and Java SDK 2.0 beta.

      Support for these two Virtual Machines is now present within Magician.
      The performance of Magician under these VMs is slightly higher than
      that through Sun's VM due to use of Microsoft's ``Raw Native Interface''
      plus the overall performance plus of Microsoft's VM implementation.

    o Support for Microsoft's Internet Explorer 3.x and 4.x browsers

      Magician can now run as Applets instead of dedicated applications within
      either of the Microsoft browsers. This enhancement delivers the ability
      of embedding portable high-performance 3-d applications within a 
      WWW page to content developers.

    o Support for JavaSoft's ``HotJava'' 1.0 browser

      Magician will also run within Applets using JavaSoft's ``HotJava'' 
      browser.

    o OpenGL 1.1 and GLU 1.2 APIs are now 100% implemented, except GLU
      Tesselators

    o Many more demos and intelligent texture-map handling

  Technical
  ---------

    o Altered OpenGL ``state machine'' class ( COM.hermetica.magician.GL )
      to being an interface with subsidiary classes. For example, all 
      ``pipeline'' classes now implement COM.hermetica.magician.AbstractGL
      which enforces the OpenGL API. The class COM.hermetica.magician.GL
      has remained the same in both name and function providing the basic
      OpenGL rendering pipeline. However, two additional base classes have
      been provided:

        o COM.hermetica.magician.TraceGL[U]

          This class simply prints the OpenGL method that has been invoked
          to System.err instead of executing the method. This allows developers
          to see *exactly* what methods are being invoked and whether they
          are wasteful.

        o COM.hermetica.magician.ProfileGL[U]

          This class operates in two different modes, summary and verbose
          and serves to provide simple benchmarking of the OpenGL pipeline.
          Each invocation of the native OpenGL methods are timed and if
          summary mode is selected, each time is added into a cumulative total
          for ``groups'' of OpenGL functions, such as ``texture'', ``geometry'',
          ``matrix'' and so on. This should give some indication as to what
          percentage of time your application spends in various parts of the
          rendering pipeline and where you might wish to begin optimization.
          Verbose mode simply displays each method's name plus execution time
          which enables developers to see directly the execution time ratios
          of various methods. This will hopefully provide some basic pointers
          to which calls to avoid in time-critical applications.

    o Internal mutexing within the COM.hermetica.magician.GLContext class.
      To the developer, this now means that you need not manually synchronize
      access to the OpenGL pipeline and that mutexing internal to Magician
      will do it for you.

      The pipeline is locked when the context is made current via the:

            makeCurrent()

      method. The lock will remain in place until the

            swapBuffers()

      method is called. Similarly, two less ``destructive''* methods are
      useful for locking and unlocking contexts.

            lock()
            unlock()

        * By destructive, we simply mean that calling swapBuffers() will
          draw any changes to the window. You may not wish this to occur.

    o Removed COM.hermetica.magician.mtGLComponent. This class is now not
      necessary with the new internal locking in the 
      COM.hermetica.magician.GLContext class.

    o New internal locking has beneficial effects on the thread scheduling in
      animated OpenGL applications. Various rendering threads relinquish the
      CPU far more gracefully and tend not to hog the CPU. This is especially
      noticeable in Win32 builds.

    o OpenGLException and GLContextException now subclass RuntimeException
      instead of Exception. This removes the necessity for developers to
      catch either of these exceptions explicitly, thereby bypassing the
      performance overhead of setting up try/catch blocks or throwing the
      exception object to the invoking method.

    o All methods within the *GL classes are now declared as being `final'.
      Do not subclass these methods. If you wish to override core OpenGL
      functionality, please create your own implementation of the AbstractGL
      class ( see above ).

    o All *GL class methods are now *non-static* and the `synchronized'
      keyword has been removed. This has proved to be beneficial for 
      performance reasons.

    o Cleaned up internal handling of window creation. A fairly horrible
      race condition has been removed.

    o FrameRateComponent and TextureComponent have been renamed to
      FrameRateCanvas and TextureCanvas. Both classes belong to the
      COM.hermetica.util3d package. They now extend java.awt.Canvas and not
      java.awt.Component due to access violations under the more strict
      ( but correct ) Microsoft SDK and compiler.

    o Added extra runtime dispatcher methods for glTexImage() and so on.

    o GLU NURBS support has been implemented.

    o COM.hermetica.util3d.shapes code has now been completely and correctly
      implemented.

    o Additional texture handling methods have been added to the core 
      AbstractGL interface for handling sensible specification ( and decoding )
      of texture data as 3-dimensional array structures for glTexImage2D
      and 2-dimensional arrays for glTexImage1D.

    o Some major overhauls in the COM.hermetica.util3d.Texture class.

    o The COM.hermetica.magician.demos.demoTemplate class defining the 
      interface that all demos must adhere to has been moved into
      COM.hermetica.magician.util3d. People now only need download the
      Magician core classes to be able to run demos over the Internet via a
      browser, as opposed to having had to download the demos first (duh!)

    o Tons more documentation. Each and every method now has a description
      of the arguments to the method. There's now hardcopy of the core Magician
      classes in PDF format plus a compendium of all the released demos in 
      PDF format too.

    o Some more demonstration programs.

    o Numerous bug fixes in the demo harness.

    o A few demo bug-fixes.

Beta 1 ( 9th September 1997 )
-----------------------------

    o Initial Release. Everything had changed!
