Pi3D Change Log
===============
Tim Skillman, Patrick Gaunt, Tom Ritchford

Date        Amends

v2.11
2016-04-25  Improvements: screenshot() can be used to capture rendered
            image to a numpy array (and not written to file) for use with
            gtk or pyqt display for instance. More control over window features
            when using pygame, thanks to @crashmatt (who did the creative
            work for PointText and TextBlock in v2.8)

v2.10
2016-02-11  Bug fixes: GL_STENCIL_SIZE explicitly set in DisplayOpenGL
            Mouse wheel movement doesn't crash when using pygame input -
            and is available within pi3d.
            Improvements: Various enhancements using different images as
            textures allowing image types: GL_ALPHA, GL_LUMINANCE,
            GL_LUMINANCE_ALPHA, GL_RGB and GL_RGBA the most appropriate
            setting will be chosen from the file type or it can be overridden
            by an argument to the Texture.__init__() Also the mipmap code
            has been moved to the correct location to drastically reduce
            memory requirements with the mipmap=False. Thanks to @swehner for
            all his work on this

v2.9
2016-01-16  Bug fixes: glReadPixels fixed on linux and windows so Screenshot 
            and ClashTest work. glBufferData ctypes pointer fixed explicitly 
            to c_float allows large buffers to work.
            Improvements: Optionally use setuptools, Mouse button more useful.
            Options to free numpy array after image loaded, to use different 
            dispmanx layers and use different texture formats (apart from 
            GL_RGB and GL_RGBA), xbox event structure fix, X11 keyboard 
            release events stored.

v2.8
2015-11-07  some overdue, significant improvements to the way the light 
            vector is mapped to the plane of the tangent and cotangent vectors. 
            (needed for normal map effect). fixes to the Mouse and Keyboard 
            classes to make behaviour more similar across platforms Matt's 
            FastText and TextBlock classes and the uv_pointsprite shader
            mods to the Font class so it can work either with the FastTest 
            or String classes following Peter Farrell's suggestion, a method 
            in Camera that does the reset() rotate() and position() and 
            returns the new location for a Camera moving over an ElevationMap 
            taking into account surface steepness.

v2.7
2015-08-14  Much improved shadow casting using depth mapping to OffScreenTexture.
            Shape.lathe() patched so normal on first leg of path realistic,
            also edges of shapes redefined in elements so line drawing
            generally produces quads rather than triangles. Also texture
            mapping in lathe corrected to use distance along path rather
            than y position. Texture reflection in shaders fixed. Normals
            in String fixed. Option to use pygame rather than X11 display,
            mouse and keyboard to avoid having to run as root on linux.

v2.6
2015-07-02  Moved Shader specific code from Shape.draw() to Buffer.draw()
            to allow different Shaders on parts of same shape. MergeShape
            uses faster numpy RotateVec and copies other parts of Buffer
            as well as arrays.

v2.5
2015-06-07  better loading of alternative shared objects i.e. for ubuntu MATE
            StereoCam added.
v2.4
2015-06-06  some bug fixes w.r.t
            init on ubuntu MATE
v2.3
2015-06-04  ubuntu MATE has different copies of EGL and GLESv2
            also pygame needs closing on some windows systems

v2.2
2015-05-23  Windows dll requirement clarified. Keyboard on windows returns
            same codes as X11 (more or less)

v2.1
2015-05-09  Texture.__init__ now copes with numpy array and a method has
            been added to make only the required opengles function calls
            for each texture change. This will now produce reasonable
            video textues. Some fixes to running on windows for mouse and
            tk argument to display creation.

v2.0
2015-04-28  Runs on windows using pygame and ANGLE dll files. Some speed
            increases, use of numpy arrays in Camera, much better
            reflection shader. 

v1.14
2015-03-19  Fairly major change in the way python array data is passed to
            libGLESv2 functions. Now generally uses ndarray.ctypes.data
            rather than expanding values and creating a new ctypes array.
            Lines class and line drawing added. anti-alias defaults off
            as it breaks pi3d on vmware. Mouse option to use x11 pointer
            as standard Mouse doesn't work on vmware. 

v1.13
2015-02-05  Importable to Android using python-for-android. Mouse buttons
            and thread stopping on program close. EGL anti-aliasing.
            Texture pickling fixed.

v1.12
2014-12-22  Light can be defined as originating from a point. Shaders can
            use #include to reduce duplication of code
            
v1.11
2014-11-24  bug fix PIL.Image.tobytes() does not work with the old python-
            imaging. Texture can be passed an Image object instead of a
            string path to an image file.
            
v1.10
2014-10-21  scenery functionality bug fixes.a utility class has been added
            for background loading scenery as elevation maps and mergegroups.
            Elevationmap.calcheight fixed and provides optional return of
            normal vector. Shaders downgraded to consistant medium precesion
            as this is limited on some platforms.

v1.9
2014-08-02  minor fixes pypi status moved to stable. String.quick_change
            allows change of text without creating new String object

v1.8
2014-04-23  various fixes and enhancements. uv_reflect and mat_reflect
            shaders now map reflected image correctly. Shapes have a list
            of children that inherit transformations (i.e. finger child
            of hand <- forearm <- upper-arm <- body etc) Sphere has argument
            invert that makes normals face in for use as environment. More
            flexible loading of wavefront obj files. Large sprites can be
            made using an array of textures.

v1.7
2014-01-20  Minor fixes.

v1.6
2013-12-05  Simple GUI functionality. Minimal fixes. pi3d.util.Gui added

v1.5
2013-11-25  Bug fixes. InputEvents now works with python3. Buffer uses numpy
            to calculate normals which would be much faster if this were
            ever required for a large array of vertices.

v1.4
2013-10-16  Minor improvements and bug fixes. Camera init uses dimensions
            from Display (as the default instance Camera did) rather than
            guessing! Buffer now copes with intentionally missing normals
            and texture coordinates as would often be the case for drawing
            points or drawing a Model using self colour (and no texture OR
            bump mapping) Pillow has now been correctly fixed but the
            horrible fixes to get round the previous version will be left
            in for a while.
            
v1.3
2013-09-19  Memory leak with Textures reappeared and fixed. Bug in Pillow
            looks like it will not be fixed for 2.2.0 so added a hack to
            Font. LodSprite allows segmentation of a simple plane for
            texture sampling in the vertex shader. Additional Textures can
            be passed to PostProcess __init__ for use by filter shaders.
            Additional filters added to pi3d_demos

v1.2
2013-09-06  PostProcess added to allow effect shaders to be applied to
            a rendered scene. OffScreenTexture system streamlined to take
            out duplicated code and now works on X11 systems.

v1.1
2013-08-25  Split demos into their own repository and make pi3d structure
            more in line with other packages. Put package on pypi to allow
            installation using 'python setup.py install' or, ideally,
            'pip install pi3d'

v1.0
2013-08-16  Support for other linux platforms using xlib and mesa. Runs under
            python3 using six. Memory leaks fixed. Unicode, multiline and justified
            String. DogFight demo using multiplayer networking (urllib to
            MySQL php server) Point rendering option added. Shadow casting
            onto ElevationMap. MergeShape takes array of Shapes so much
            quicker for assemblies of large numbers of objects. Slideshow
            demo loads resources in background thread. Fixed z position
            bug in 2d_flat/Canvas system. Added alpha value as a uniform
            variable to allow shaders to fade objects.

v0.8
2013-05-29  Switch to a non-zero-padded version number

v0.08
2013-02-08  Wholesale conversion to OpenGL ES2.0 mechanisms. As much as possible
            of the existing functionality has been maintained though some classes
            have not yet been implemented: [collisionMap, Missile] some are done
            differently: [Draw, DrawString2D] The structure of the module has been
            broken into a directory structure with smaller files generally containing
            one class. Shaders implemented, Display class does more loop control,
            file loading can be done on sub threads, TTF fonts can be used events
            can handle all types of input such as joystick, gamepad etc, Building
2012-12-08  class and clashtest shader detect bumping into things.

v0.07
2012-12-08  Added splash screen to TK window (also user defineable)
2012-12-07  LoaderEgg draw needed to disableClientState(GL_COLOR_ARRAY) as
            this affected the scene afterwards
2012-12-07  Added pi3d.FPS class that returns a Frames Per Second (FPS) count
2012-12-06  Found a problem with matrix stacking - a push would increase the
            stack but a pop would not reduce it (i.e. constantly increasing)
            Introduced a fixed stack method with a default of 20 deep pushes
            (or user defined, e.g. mtrx=pi3d.matrix(50) for fifty pushes)
            This should also speed things up a little as stack is pre-allocated
            upon intialisation.
2012-12-06  Separated perspective and orthographic code into setPerspective and
            setOrthographic functions so that a scene can interchange between them

v0.06
2012-11-29  Added Pi3D.DrawString2D which now renders text to a 2D orthographic view
2012-11-29  Added Pi3D.CollisionMap for checking collisions against objects.
            Includes a collideLine method to see if a line of fire will hit an object
2012-11-28  Pi3D.LodDraw3 and LodDraw3xyz added to enable Level Of Detail rendering
            for near, far and further models (or none at all) 
2012-11-27  Loading textures checks for duplicates and uses preloaded textures
            rather than loads them again
2012-11-26  Drawing models (LoadModel) can use offset,rotation,scale and centre
            values added to their draw call (skips a matrix calculation)
2012-11-18  Modified loadECfiles to support other image types and an option not to
            render the bottom image
2012-11-17  Added Pi3D.tkwin class for creating and handling TKinter window and events.
            Much improved keyboard and mouse handling
2012-11-17  Modified Pi3D display class to resize the viewport and destroy correctly.
            Includes a seperate method to create_surface
2012-11-17  Adopted Paddy Gaunt's fixes and additions to Pi3D module including
            LoadModel (Obj format) and ClashTest

v0.05
2012-07-20  Add textures class so that textures can be deleted correctly
2012-07-20  Fixed a couple of bugs with latest release of Raspbian Wheezy
2012-07-12  Amended mergeShape to include shape's existing parameters
            (x,y,z,rotations, scale)
2012-07-12  Added Paddy's fog effect
2012-07-12  ForestWalk2.py - I broke it Paddy! - left tiled texture in
2012-07-12  Modified ForestWalk.py to include new FACES type environment cube
2012-07-12  Added loadECfiles def in Pi3D to help load faces textures for
            environment cube (FACES type)
2012-07-12  Made robotWalkabout.py that demostrates avatar viewing with an
            offset camera
2012-07-12  Swapped height and depth parameters in pi3d.createCuboid - was
            confusing with x,y,z ordering
2012-07-12  Updated clouds3d.py with Paddy's improved z-sorted version
2012-07-12  Added more environment cubes (FACES, HALFCROSS, CROSS) and added
            Github Wiki page
