Changes in version 1.4.2 (x.x.2008)

 - Unified the handling of zwrite enable with transparent materials on all hw accelerated drivers. This means that all transparent materials will now disable ZWrite, ignoring the material flag.
   There is a scene manager attribute, though, which will revert this behavior to the usual SMaterial driven way. Simply call
   SceneManager->getParameters()->setAttribute(scene::ALLOW_ZWRITE_ON_TRANSPARENT, true) and set the SMaterial flag as desired.

 - Some changes for texture matrices in q3 shaders.

 - Added BlindSide's irrAllocator patch for proper TextureMatrix release under Win32 with any CRT library.

 - Added VC9 project files.

 - Added getEmitter for particle system scene nodes.

 - Fixed rounding problem in getScreenCoordinatesFrom3DPosition

 - Fixed Software renderer color flicker, was a shift bug I believe.

 - irrMap fix to make root node always black, by rogerborg.

 - Possible core dump fixed in particle system node, by CuteAlien.

 - Mem leak fixed in b3d loader.

 - Avoid double rendering of child nodes of joints.

 - Support for d3d draw2dimage clipping by CuteAlien.

 - Fixed an animation transition bug, pointed out by wuallen.

 - Fixed the major problem with OpenGL drivers, that claim to be 2.x compatible, but don't offer NPOT support (well, they do, but only in sw rendering...). Now we check for the extension string only.

 - Fixed .obj loader bug which inserted vertices in wrong buffers.

 - Fixed minor mem leak in Linux device.

-------------------------------------------
Changes in version 1.4.1 (04 Jun 2008)

 - MD3 meshes are movable again.

 - New JPG image writer version by Vitek.

 - Texture matrix fixes, all methods should now work as expected.

 - Some container methods now return the this pointer after member functions have been called on them, in order to allow call chains.

 - Some new methods for SColorf access, for uniform API of all colors.

 - bug fix for SMaterialLayer equality check. Did only check the TextureMatrix pointers, instead of the matrices.

 - New getMesh method for the SceneManager, which takes an IReadFile instead of a filename.

 - Support for flags _WIN32 and _WIN64 in addition to WIN32 and WIN64 added, this simplifies usage of Irrlicht headers under MSVC.

 - Fixed a crash in GUIMeshViewer

 - new string method findLastChar by Halifax

 - GUIEditBox got the 1 pixel shift after click fixed.

 - Some debug visualization has been fixed for skinned meshes

 - Undef PI symbol before declaring core::PI to avoid compilation problems

 - SAnimatedMesh now properly returns properties of Meshes[0] if those exist, such that it should be usable in place of an SMesh again.

 - Fixed 2d initialisation in opengl and d3d9 driver. This should fix problems with render states mixing up and distrubing, e.g. skin effects.

 - Avoid a crash when passing setSkin the current skin

 - Fixed current frame calculation for non-looped animations. Bug reported by greenya.

 - Fixed bug in CBillboardSceneNode::setColor, reported by rogerborg

 - Fixed clipping of menu, toolbar and combo box GUI elements, reported by greenya
   - setNotClipped now applies all the way up to the root of the GUI environment, rather than just to the next parent 

 - Made new scene managers use the original manager's GUIEnvironment, reported by MasterGod

 - Fixed IGUICheckBox::setEnabled, reported by Dorth

 - Fixed the FollowSpline animator to avoid crashes when only one waypoint is given.

 - OpenGL VolumeShadow now uses glPolygonOffset to avoid zbuffer artifacts.

 - Fixed meshbuffer corruption in append methods.

 - Fixed mem leaks in irrArray.

 - Fixed minor bugs in ISceneNode and ISceneManager.

 - Fixed the MeshCache handling of GeometryCreator meshes.

 - Terrain LOD bugfix.

 - Some Collada 1.3 loader enhancements and bug fixes.

 - Fixed a bug in CGUISpriteBank which caused a crash when a non-looping animated sprite reached the end of its animation.

 - Enhanced the .obj loader with the patch from ryanclark. This allows for recalculation of smoothed normals of the mesh, also should decrease the tri count on some meshes.

 - Avoid the global Logger to be destroyed too early.

 - Function setbit was renamed to setbit_cond to avoid name clashes.

 - Fixed .x animations with multiple references to the same joint from different meshes. Fixed texture path problems.

 - Support for Milkshape 1.8 files, also with multiple weights per joint.

 - The config file now also supports _IRR_OSX_PLATFORM_ and _IRR_USE_OSX_DEVICE_. This allows to use the Linux device (X11 support) on OSX.

 - Avoid terrain scene node crash when heightmap cannot be loaded.

 - Speed improvements for WaterSceneNode.

 - FlyCircle animator now also works for upvectors (Direction parameter) which are not (0,1,0). Is also faster now, since most calculations are done on init. Thanks to Dorth for working on this.

 - The 3ds loader correctly creates a texture matrix when texture tiling properties are found in the file.

 - Fix for S3DVertex comparison operators. Used some wrong logic.

 - Bugfix getCurrentRenderTargetSize in D3D drivers. Due to signature differences a wrong virtual method was chosen. Thanks to Jiang for finding it.

-------------------------------------------
Changes in version 1.4 (30 Nov 2007)

 - Major API change: All material properties which are available per texture layer (curently texture, texture matrix, texture filters, and texture wrap mode) are separated into a new struct SMaterialLayer. You can access them via the array TextureLayer[] in SMaterial. The texture matrix methods in SMaterial are still alive, and also textures can be accessed via methods in SMaterial now. But still, many places in user code need some update (usually changing material.Textures[i] to material.TextureLayer[i].Texture etc.)

 - Major API rewriting for proper const usage. Now, most getter methods are const and so are the larger parameters and return values. Moreover, many methods taking only unsigned numbers now use u32 instead of s32 in order to recognize this limitation from the method's signature.

 - the base class for nearly all Irrlicht classes has been renamed from IUnknown to IReferenceCounted

 - Fixed Skybox texture orientations. They are now displayed non-flipped. Existing skyboxes have to be changed, though: Exchange left and right texture. Textures from Terragen and other tools can be used directly, now. Quake maps will also need the right/left exchange.

 - Added ITexture::isRenderTarget()

 - Added STL mesh file format reader and writer.

 - Added IMeshManipulator::createMeshWelded which creates a copy of the mesh with similar vertices welded together.

 - Irrlicht now has its own file format for static meshes. It is based on xml and has the 
   extension .irrmesh. Irrlicht is able to write every IMesh to this file format, and of course to
   read it back again.
   
 - Irrlicht is now able to write Meshes out into files. Use ISceneManager::createMeshWriter()
   to obtain an interface with which you can write out meshes. Currently, an own .irrmesh
   file format is supported as well as the COLLADA file format.
   
 - fixed the keyboard autorepeat difference betwenn Linux and Windows. Thanks to denton we now have only KeyPressed events on both systems in case of autorepeat.

 - Added several new particle emitters and affectors from IrrSpintz. Also some new getter and setter methods were added.

 - D3D transparent materials do not disable zbuffer writing automatically anymore. This has to be done by the user to keep those settings configurable.

 - OpenGL texture now also require a regenerateMipmapLevels() after unlocking. This is the same as for d3d devices now.

 - Point sprite support in the driver. Point sprites use just one 3d vertex and a size to create a textured billboard on the GPU. This can provide fast particle systems, especially in combination with shaders. The proper particle extension will follow later on as it needs some more refactoring.

 - OpenGL 2D drawing accuracy fix by tuXXX

 - Added OnResize and getCurrentRenderTargetSize to the software video drivers.

 - Added Spot light type for dynamic lights. Note that both position and direction for all dynamic lights are now determined by the LightSceneNode, the SLight attributes are only used for internal purposes.
   API change! One can easily work around this change by setting the LightSceneNode's Position and Rotation instead of the SLight's. This change won't provoke a compile error, though, and can hence go unrecognized besides the visual problems.
   The lights use a default direction (0,0,-1) which is rotated by the usual scene node transformations and can hence be modified by scene node animators.
   A change in the Radius usage can lead to strange artifacts. Just increase the Radius in this case. further handling of Radius is to be discussed.

 - Added per pixel fog support for OpenGL.

 - Added driver support for user defined clip planes, based on mandrav's patch.
   The OpenGL version is more picky about ModelView matrices, so it's best to set the projection plane at the time it is used.

 - .obj files now load relative indices correctly. Collada files load textures.

 - A new MeshBuffer implementation is publicly available. It supports a shared vertex list for all MeshBuffers, used for MS3D meshes.

 - MeshBuffers can recalculate their BoundingBoxes on their own now, no need for MeshManipulators. New append methods help to merge MeshBuffers. take care that the types match!

 - The new texture generation mode is working. With ETCF_NO_ALPHA_CHANNEL textures are generated without ALPHA bits reserved.

 - D3D9 hardware mipmap updates are re-enabled, problems should be reported.

 - In some cases fullscreeen modes under win32 should have a better frame rate now.

 - Fixed the hillplane mesh to work with non-quadratic dimensions as well. Changed the interface also, so use a u32 dimension to specify the tilecount now.

 - Hires timers are disabled on windows systems with more than one CPU, due to bugs
   in the BIOS of many multi-core motherboards. To enable hires timers in your project, 
   use SetProcessAffinityMask to set to use only one CPU before creating the device.

 - OpenGL render targets now the same way up as the other drivers. If you have
   written opengl shaders that use render targets then you'll need to change your 
   texture coordinates accordingly.

 - Fixed some OpenGL renderstate stuff. setBasicRenderstate returns with
   active texture layer 0. The material renderer must return from OnUnset
   with the same active texture layer. The alpha test is disabled and the
   texture mode should be GL_MODULATE.

 - Fixed CSoftwareTexture2::getOriginalSize, reported by CaptainPants. Added a
   new method CSoftwareTexture2::getMaxSize to return the size of the largest
   mipmap, which is used by texelarea instead of getOriginalSize.

 - Changed parameter order of addArrowMesh and added default parameters such
   that it's enough to set the color (or even just the name).

 - Fixed bugs in MY3D and OBJ loader.

 - Added IMeshCache::clearUnusedMeshes(). This allows the user to remove 
   meshes that are sitting in the mesh cache but aren't used by any scene nodes. 
   This is useful for example when changing levels.

 - Added IUnknown::getReferenceCount()

 - createDevice now reports errors if the driverType is unknown, previously it 
   created a window but populated it with a null driver without any warning.

 - Fixed a bug in CBillboardTextSceneNode::setText where the old text was not 
   cleared.

 - Changed irrArray::linear_search to use the == operator rather than <
   This may be slower in some cases, but it no longer returns false positives
   when searching arrays of classes that override the < operator but 
   !(x<y) && !(y<x) does not necessarily mean x==y (vectors, positions etc).

 - Fixed getSize/getOriginalSize method inversion in OpenGL textures.

 - Added per texture-layer filter settings, i.e. one can choose to filter
   only chosen texture layers. If all layers are set to the same value the
   convenience function material.setFlag(EMF_BILINEAR_FILTER, boolean) can be
   used, TRILINEAR_FILTER and ANISOTROPIC_FILTER do work, too. In all other
   cases material.BilinearFilter[i] (resp. TrilinerFilter[i] or
   AnisotropicFilter[i]) shall are to be used.

 - Added adjustable Attenuation for dynamic lights. This allows to change the
   intensity of a light based on its distance. The default attenuation changed
   from (0,1/radius,0) to (1,0,0) which means no effect by distance. Good
   values for distance effects simply add small values to the second and third
   element.

 - Fixed a typo to do with 2nd light vectors in opengl parallax and normal map
   renderers.

GUI:

 - Fixes to menu and listbox (de)serialization, and custom listbox colors by CuteAlien.

 - Added EGET_ELEMENT_CLOSED GUI event type. Absorb this event to cancel closing a window.

 - Added _IRR_COMPILE_WITH_GUI_ to allow compiling without the GUI. 
   This is useful if you use another GUI system (ie CEGUI) or are using Irrlicht 
   inside another window. You will have to supply an external IGUIFont if you wish
   to use font scene nodes as there will be no GUI environment available to load fonts.

 - Added 7 more symbols to the built-in font and skin.
   EGDI_MORE_LEFT, EGDI_MORE_RIGHT, EGDI_MORE_UP, EGDI_MORE_DOWN: "<<" symbols
   indicating there is more content in that direction.
   EGDI_WINDOW_RESIZE: Window symbol for resizing by clicking the bottom right
   corner of a window.
   EGDI_EXPAND, EGDI_COLLAPSE: Plus and minus buttons for trees.

 - Added IGUISkin::draw2dRectangle, so skins can override the default highlight.

 - EGET_ELEMENT_FOCUS_LOST and EGET_ELEMENT_FOCUSED events can now be absorbed 
   by returning true in OnEvent. Absorbing these events will cancel the focus 
   change.

 - IGUIEnvironment::setFocus and removeFocus now return bools.

 - New SEvent.GUIEvent.Element. Points to a second element that is being 
   used in the event. During a EGET_ELEMENT_FOCUS_LOST event it points
   to the element which would like the focus.

 - Fixed the default font icons so they have a black border and are not 
   invisible in default listboxes. Old font tool textures now keep their color
   so colorful fonts are possible by editing the font's texture. The colors of 
   completely transparent areas are no longer kept when generating the texture
   from an image. Added builtInFont.bmp for ease of editing.

 - IGUIElement changes:

     Most elements can now be accessed using the keyboard. Use space and return
     to select or deselect, escape to cancel selection (ie while pressing a 
     button with space or return), and the cursor keys where appropriate.

     Added navigation through the GUI using tab and the shift and control keys.
     Use these new methods to control tab navigation:
       setTabStop - set this to true if the focus will vist the element.
       isTabStop - returns true if the focus will visit the element.
       setTabOrder - Sets the order of focus within this tab group,
         Only one element in each group should have the same TabOrder number.
         Set to -1 to add to the end of the group.
       setTabGroup - set this to true if the element is a group that contains 
         other elements, and can be navigated with ctrl+tab/ctrl+shift+tab.
       isTabGroup - returns true if the element is a tab group.
       getTabGroup - returns the tab group that the element belongs to.
       getNextElement - searches for the next element which would be focused 
         within the element's children, only useful if you are doing your own 
         custom navigation.

     Added isMychild, to check if an element is descended from this one.

     Added isPointInside, which is called by getElementFromPoint. Override this
     when making non-rectangular elements.

     OnEvent no longer absorbs events by default.

     Serialize/deserialize now call getter and setter functions, in case people
     override these and don't use the internal protected variables.

     added getAbsoluteClippingRect, returns the visible area of an element.

 - Added IGUISpinBox, by Michael Zeilfelder (CuteAlien).

 - IGUIEditBox new methods:
   setWordWrap/isWordWrapEnabled, to split words on to the next line.
   setMultiLine and isMultiLineEnabled, inserts a newline instead of sending
   EGET_EDITBOX_ENTER events.
   setPasswordBox/isPasswordBox to use the edit box for password input.
   setTextAlignment, to align the text to left, right, top, bottom and centers
   setAutoScroll, to enable and disable automatic scrolling with the cursor

 - IGUIStaticText new methods setDrawBorder and setTextAlignment.

 - IGUIListBox changes:
   Added setAutoScrollEnabled and isAutoScrollEnabled, for automatic scrolling 
   when selecting or adding an item. 
   Scrollbars are now only visible when the list doesn't fit in the visible area.
   You can now type an item's text to select it.

 - IGUIScrollBar new methods set/getLargeStep

-------------------------------------------
Changes in version 1.3.1 (20 Jun 2007)

 - Fixed a bug with negative exponents in fast_atof, posted by RVL

 - renamed IAnimatedMeshSceneNode::getAbsoluteTransformation to
   getMD3TagTransformation to avoid conflicts with
   ISceneNode::getAbsoluteTransformation

 - Added rect::constrainTo for locking a rectangle inside another without
   resizing it

 - Moved the OpenGL API functions from COpenGL driver into new extension
   handler. Thereby, some renaming took place - the ARB and EXT suffix was
   removed. Simply rename the functions in case you use them.

 - matrix4 is now a template internally such that also int and double matrices
   are possible now.

 - CMeshBuffer is a new template replacing all previous SMeshBuffer* classes.
   New mesh buffers can be easily implemented based on this code.

 - Ogre 1.40 files now also load.

 - New filename based methods in the MeshCache.

 - CSphereSceneNode is now texture wrapped with sphere mapping by exactly one
   texture. Only a small error on the top remained.
   
 - The Sky box scene node now clamps its textures by default (meaning no
   more ugly artifacts at the borders).

 - Frustum culling fixed by using the fixed classifyPointRelation function.

 - Some fixes in the 3d basic structures: plane3d.classifyPointRelation now
   correctly returns the relation, it returned the opposite before. Also
   renamed existsInterSection to existsIntersection for consistency.
   triangle3d.isOnSameSide is now private - it's just a helper class not
   intended for further use.

 - Added IFileSystem::getFileDir, to get the directory when given a file 
   name. Submitted by Jeff Myers

 - Updated to latest PNG library (1.2.18), fixing a vulnerability.
   Also changed some data structures which should make the library 64bit
   compatible.

 - Changed the external window pointer from s32 to void*. This makes the
   mechanism 64bit safe, but also breaks the API. You have to cast to
   void* now.

 - Moved image scaling algorithms to CImage class and made them public. This
   replaces lots of code from the hardware textures. It should also fix the
   missing MipMaps in OpenGL if the driver does not support mipmap generation.

 - Added support for texture creation flags in OpenGL. This changes some
   textures to other color formats than in previous versions.

 - MD2 normals fixed.

 - Some defines for the platform choice have changed their names and semantics.
   E.g. IRR_LINUX is now _IRR_LINUX_PLATFORM_ for os specific things and
   _IRR_USE_LINUX_DEVICE_ to choose the original X11 IrrLinux device.

 - Added an SDL device for cross-platform window support. Especially useful
   for embedded systems and others without hardware acceleration. This device
   is mutually exclusive with the other devices and requires linking against
   the SDL library.

 - Q3 shader crash fix.

 - Fixed the too small D3D texture bug.

 - The OpenGL texture is internally stored as a CImage now.

 - Fixed some Borland compiler problems.

 - ShadowVolume init bug fixed.

 - MS3D rotation bug fixed.

 - setFrameLoop bug fixed.

 - Fixed OpenGL's draw2DImage texture inits to avoid texture confusion.

 - Fixed getHeight from terrain scene node.

 - The FPS counter now works as in previous releases, the accumulating counter
   can be enabled by a parameter.

 - getType() is now const correct (API Changes)

 - Added scissor test to opengl draw2DImage method that ignored clip.

 - Fixed a bug in rect::isValid, it was almost always true.
 
 - Fixed wrong particle emission.
 
 - Added LinuxDevice setResizeAble implementation.
 
 - Enumeration values of the ESCENE_NODE_TYPE enum are no longer ints but four
   character codes. If you were using them as index previously, this is no longer possible.
 
 - There is now a way to set which scene manager should recieve user input, when working
   with multiple scene managers: IrrlichtDevice::setInputReceivingSceneManager().
 
 - ICursorControl now supports setting a reference rectangle.
   If this rect is set, the cursor position is not being calculated relative to
   the rendering window but to this rect. You can set the rect pointer to 0 to disable
   this feature again. This feature is useful when rendering into parts of foreign windows
   for example in an editor. See ICursorControl::setReferenceRect() for details.
   (Windows only implementation currently)

 - It is now possible to clone single scene nodes (ISceneNode::clone()) and to create copies
   of a whole scene graph (ISceneManager::createNewSceneManager(cloneContent=true);

 - IAttributes now supports a user pointer (void*)

 - Added query methods to scene manager: Find Scene nodes by type
    getSceneNodesFromType

 - Added min and max functions with 3 values: core::min_ and core::max_

 - Fixed a crash when using Octtrees caused by unnecessary dropping of meshes when 
   deserializing the scene node.

 - Removed an array::erase from Octtrees and Octtree triangle selector.
 
 - Removed a bug which caused irrlicht to crash when using animated .x files as static meshes.

GUI:

  - Added EGUI_DEFAULT_FONT for skins, default fonts can now be set for windows, menus, buttons and tooltips.
    use IGUISkin::setFont and getFont to use them. Fonts are not serialized with saveGUI yet

  - Added EGDC_TOOLTIP_BACKGROUND for setting background color of tooltips.

  - Tooltips now appear relative to mouse position, also they do not appear for 500ms.

  - Fixed a memory leak when dropping the GUIEnvironment when a tooltip was present.

  - Added IGUIStaticText::setDrawBackground and IGUIStaticText::setBackgroundColor.

  - Fixed a messagebox focus bug when no 'okay' button was present.

  - Added setColor and setScaleImage to GUIImage.

  - GUIListBox highlighted area now clips properly.

  - added getOSOperator to GUIEnvironment (for clipboard access in elements) and updated CGUIEditBox.

  - Can now load/save gui environment from/to an element.

  - Most element set functions now have a corresponding get or is function. 
   (API change) IGUIButton::getUseAlphaChannel is now isAlphaChannelUsed, to fit with other is* functions.

  - Fixed a bug with resizing the gui environment when the device is resized

  - Modal screens now resize to fit their parent.

  - XML bitmap fonts now load textures from the XML file directory rather than the current one.

  - Fixed a small bug with click areas in combo boxes.

  - Fixed a bug in clear() when an element was hovered or had focus

  - Fixed a bug when loading fonts with uppercase letters in the name in case-sensitive filesystems

GUI Editor:

  - Added cut/copy/paste using clipboard and xml (via memory file). Will have problems in Linux due 
    to no clipboard support

  - Added texture attribute element

  - Added CGUIPanel, a container with optional scrollbars. Originally submitted by Asger Feldthaus


-------------------------------------------
Changes in version 1.3 (15 Mar 2007)

- SMaterial structure changed:
   - Enable Irrlicht to change TextureAddress Mode (Clamping), for each layer separately
   - Added Texture matrices to SMaterial for all texture layers
   - Removed the anonymous union/struct access to textures and material flags.
	  Now, Texture1..4 is removed - use Textures[i] instead
	  The Flags[x] is replaced by setFlags(x, bool) resp. getFlags(x)

- The methods OnPreRender and OnPostRender of ISceneNode have been changed to
  OnRegisterSceneNode() and OnAnimate(). Also, they are now called at different
  times: OnAnimate is called every frame before anything else, removing the
  one-frame-lag Irrlicht suffered until now. To make most of your own scene
  nodes work again, it should be enough to rename OnPreRender()
  to OnRegisterSceneNode() and OnPostRender() to OnAnimate() in most cases.

- ISceneNode::getMaterialCount and getMaterial now use u32 instead of s32. You will also need 
  to update this in your custom scene nodes.

- matrix4 speed enhancement, testing for identity before multiply. faster check for identity
  for the positive case using an additional boolean flag.
  The internal array M is now private, changing the API. Use mat[x] instead of mat.M[x].
  The pointer to M is acquired by mat.pointer(), some methods take a matrix4 reference 
  instead of a f32*.

- Some more suppport for tangent meshes

- Several alpha blend fixes in several drivers and methods

Font improvements:

  - Changed built-in IGUIFont to IGUIFontBitmap and added options for more fonts.
    CGUIFont now supports UCS-2 and may span many textures, loads from XML (Unicode support planned)

  - Started a font tool for creating the new XML fonts, including generating vector fonts
    (currently not backward compatible with old fonts, only works for Win2K+, some bugs still)
   
  - Font interface now supports kerning- kerning pairs, per letter and global kerning widths, 
    although he internal font only supports global and per-letter.

  - added _IRR_COMPILE_WITH_SOFTWARE_ and _IRR_COMPILE_WITH_BURNINGSVIDEO_ to compile config


- GUI enhancements:

  - GUI Serialization with loadGUI and saveGUI, and serializable custom GUI elements via factories

  - Started a GUI Editor as a GUI element factory example (work in progress)

  - New IGUIElement functions: isSubElement & setSubElement for child elements created by their parents 
    (eg. a scrollbar on a list box). Set it if you don't want an element to be serialized

  - New GUI event, EGET_ELEMENT_FOCUSED

  - GUI environment ELEMENT_FOCUS_LOST event now sets the element as the caller, focus_lost events 
    are now usually passed to parent elements, so elements now check if they are the caller before 
    updating (so users can catch focus lost events without them being eaten by the elements)

  - Buttons, checkboxes and tab controls now only activate when the mouse is released over them.

  - Windows mouse-up events are now caught outside the window, so mouse coords may now be negative.
    could cause problems with draggable user windows, as they may now be dragged off screen.

  - Elements can now automatically resize to fit their parents, or align themselves to an edge:
    setAlignment(left, right, top, bottom) - sets how each edge aligns to its parent, 
    through EGUI_ALIGNMENT enum
    EGUIA_UPPERLEFT - default behaviour, aligns to top or left edge
    EGUIA_LOWERRIGHT - aligns to the lower or right edge
    EGUIA_CENTER - moves relative to the center of its parent
    EGUIA_SCALE - uses relative scale

  - setMaxSize, setMinSize - sets the maximum and minimum sizes for automatic resizing, 
    use 0 for no maximum size.

  - setRelativePosition now takes a rect<f32> for relative positioning within their parents

  - getFileSystem added to the GUI environment

  - New IGUISpriteBank, used to hold 2d image data like fonts and GUI icons. 
    Icons provided by the built-in font are now accessed through the skin's sprite bank.
    Users can override the icons by setting a different sprite bank and setting new sprites.

  - Skins are now serializable and are loaded/saved with the GUI.

  - IGUIStaticText getter/setter functions patch by rogerborg.

- added 3d TextSceneNode2. to view a Text in real 3D Space
   in fact it is a combination of Billboard & TextSceneNode

- Burning Video (the second but only complete software renderer)
  - New Compile Config BURNINGVIDEO_RENDERER_ULTRA_FAST
  - New Compile Config BURNINGVIDEO_RENDERER_FAST
	touching the 20fps border in the demo ( P4 mobile 2Ghz ). 15fps average.
	( Compile config Release Fast-FPU )
		
  - VertexCache for Tansformed & Light Vertices
    boost small drawPrimitive Calls ( 2DRectangle, Billboard ) and Real Index Triangles
		
  - Bilinear Dither
  - clipping test ( compare instead of generic plane normal )
  - support for NOT using vertexcolor
	#define SOFTWARE_DRIVER_2_USE_VERTEX_COLOR

- added vertex to color to billboard.
	shade top & shade down.
	to support some static lighting effect on billboards
 
- Implemented line rendering for SoftwareDriver

- XMLWriter fix for 32bit wchar_t (esp. for big endian)

- updated to latest PNG library

- implemented CImagerWriterJpeg::writeImage

- The ISceneManager::addCameraSceneNodeFPS() has a new parameter named 'jumpSpeed'
  and a Key Map Entry.

- added param to IIImageWriteFile::writeImage
	control Parameter for the backend ( e.g. jpeg compression level )

- addContextMenu: CGUIEnvironment::addContextMenu set the focus on the submenu.

- Added IFileSystem::createMemoryReadFile for accessing memory like a file.

- Added core::map class submitted by Nastase Catalin (Kat'Oun)

- Fix vertex colors for .x and .ms3d, alpha bug in .obj

- Fixed 16bit depth screens under Windows.

- Implemented getMeshBuffer(SMaterial) for all AnimatedMeshes. 
  It was returning 0 for all implementations previously. User defined IMesh derivates
  will also have to implement it now due to the removed empty implementation.

- Added yield() method to IrrlichtDevice which allows to pause the Irrlicht process for
  a very short time. This allows other processes to execute without a major
  penalty for the Irrlicht application.

- Added sleep() methd to IrrlichtDevice, for pausing the Irrlicht process for a longer 
  amount of time.

- Auto-split mesh to 16bit buffers in 3ds loader

- 8bit RGB332 image format support

- isActive() under Linux now behaves like the Windows variant: True iff window has focus

- Fixed(?) the glXGetProcAddress problems with different drivers

- B3D changes by Luke: 
  Texture scaling bugfix, support for alpha blending, new option to normalise weights, 
  animation code optimization, fixed memory leak

- ROUNDING_ERROR is now ROUNDING_ERROR_32 or ROUNDING_ERROR_64

- Material ZBuffer flag changed to a u32 value 
  Reason: change ( off or on ) to , off, lequal, equal
  Necessary for multi-pass if previous stage has had transparency

- DebugDataVisible is now an enum of flags
  show normals is supported ( uses the new build in arrowmesh )

- New Function: GeometryCreator
  addArrowMesh. build a closed cylinder and a cone
  used to show normals as debug feature

- New Function:
  CMeshManipulator::transformMesh(scene::IMesh* mesh, const core::matrix4& m) const
  transforms VertexPosition and VertexNormal

- BUGFIX: CGUIButton notified Pressed when Mouse was clicked Inside ( correct )
  but also left up outside rectangle ( incorrect)

- BUGFIX: Octree:getPolys(const scene::SViewFrustum& frustum, SIndexData* idxdata)
  was recursive calling invisible children

- CFileList: Changed FileListEntry sorting to
  a) Directory comes first
  b) sorting ignores case
  so it feel's more like common browers

- added a Texture transform to IVideoDriver::setTransform
	
- quaternion::getmatrix
  in fact the getmatrix version is returning the transposed.
  i'm quite sure that this is the wrong implementation.
  so this should be verified to remove the getmatrix_transposed version...

- Quake3 Map Loader:
  new loading method
  - Bezier Patches with LOD more than 3
  - Multiple Meshes, stay compatible with the previous version
  - Indexed Triangle List
  - initial support for quake3 Shaders and Entities
  - Shaders are parsed. When it's possible to resolve a 2 Texture Scheme it's taken
 	Shaders exist in namespace scene::quake3
  - The Example Quake3Map shows how to continue applying the Q3Shaders with SceneNodes
     ( for example animmap converts to TextureAnimator.)
     TODO: use the Irrlicht Variable Syntax to remove redundant code..
	   
- added getVertexPitch() to IMeshBuffer interface

- added generic isupper, isspace.. functions to coreutil.h to remove dependencies for ctype.h
   ( future: it's possibly to use binary comparison test..)
  removed 1000's include of string.h and moved one to irrstring.h
  in preparing of complete removing the MSVC.

- moved fast_atof.h to the public include
  added strtol10 to remove dependencies for stdlib.h
  anyway math.h is needed for powf
	
- core::vector3d
  added getInterpolated_quadratic.
  vector3d<T> getInterpolated_quadratic(const vector3d<T>& v2, const vector3d<T>& v3, const T d) const
  // this*(1-d)*(1-d) + 2 * v2 * (1-d) + v3 * d * d;
	
- irrstring: added param start to findLast(T c,  s32 start = -1 )
  reason: to continue searching reverse on a specific position
  (parameter is checked against boundaries )

- added operation reciprocal_squareroot to irrmath.
  core::reciprocal_squareroot = 1.f / sqrtf ( x )
  changed the core::vector3df normalize vector.
  specialized templates are not allowed in irrlicht currently, so it's only for f32 for now.
  a C function and a NVidia Version are in irrmath.h
	
- add Primitives to CFPSCounter 
  and changed interpolation to 1500ms instead of 2000ms
  and rounding to ceiling..

- added Interface setAmbientLight to ISceneManager
  it was a Bug, because SceneManager always calls Driver therefore AmbientLight has to be set in SceneManager.

- changed GUIFont & FontTool to support kerning ( on a global basis )
   very basic mode.. apply an offset for position
   useful for example if you want to apply an outline stroke in your favorite
   and therefore let the texture grow.
   and to correct the border back on drawing, specify the parameter in IGUIFont.
   this is quite useful if you want to use more artistic fonts.
   default = 0
   better kerning would need a seperate coordinate set for each symbol.
	
- changed MD2_FRAME_SHIFT to lower framerate
	-> lower IPol
	problems can occur if somebody uses hardcoded frame-numbers instead
	of Animation name...

- changed spelling "frustrum" to "frustum"
	-> changed also SViewFrustrum.h to SViewFrustum.h
	
- changed Parameter AutomaticCulling from bool to enum E_CULLING_TYPE
	to support more than two culling modes.
	
	added Frustum culling ( it's a copy & paste from the octree )
	added initial bounding sphere
		used for culling point lights..
	 
- Added getSystemMemory and getProcessorSpeedMHz for Windows and Linux to the OSOperator, submitted by Vitek.

-------------------------------------------
Changes in version 1.2 (29 Nov 2006)

- Added Solaris/Sparc port (basically some compiler define statements). Irrlicht and the examples should compile out-of-the-box on Suns with the usual Makefiles and gnumake.

- Added texture matrix support for hardware accelerated drivers. This allows for efficient texture coord manipulations for complete meshes at once.

- Multisampling with OpenGL under Linux added

- Non-power-of-two textures are left unscaled if the driver supports such textures.

- new draw2DImage method that speeds up drawing many quads from the same texture. Font drawing is improved by this under OpenGL.

- TGA files are now always correctly flipped and loaded if compressed. All PNG color formats are now supported, including correct alpha handling.

- 3ds mesh loader fix in texture loading, now loads some textures that were not loaded before, but might introduce problems with very recent files. OGRE mesh loader bugfixes and lightmap support. Several B3d mesh loader updates. Obj and mtl loader enhancements.

- A new compile flag (IRR_OPENGL_USE_EXTPOINTER) allows Irrlicht to either use OpenGL extension function pointers or direct OpenGL calls.

- OpenGL now uses frame buffer objects for render targets larger than the screen, supplied by Mandrav

- Split ESNRP_LIGHT_AND_CAMERA passes into ESNRP_LIGHT and ESNRP_CAMERA to fix a problem with lights being rendered before cameras in OpenGL (thanks again to Vitek for finding this). ESNRP_LIGHT_AND_CAMERA is now deprecated.

- Fixed many OpenGL render state problems which were related to wrong texture states. The textures are now enabled and disabled by the material renderers in OnSetMaterial. Also enabled the texture state cache which helps preventing texture changes just as the one for D3Dx. Thanks to hey_i_am_real for some good hints on where the problem was located. 

- Added compile flag _IRR_COMPILE_WITH_X11_ which is by default enabled. Disabling the flag removes all X11 dependencies from Irrlicht and allows for a headless Linux Irrlicht server - added by request :-)

- Win32 OpenGL driver tries to use the requested bpp size.

- Default texture format is now A8R8G8B8 if not explicitly specified. This fixes some color artifacts with lightmaps. Bugfix submitted by hey_i_am_real.

- In OnPostRender all transformations were taken as relative and multiplied with the root transformation matrix every time due to a wrong check for the real root node. This shoudl increase render performance for scenes with lots of (invisible) nodes.

- Added correct list copy constructor.

- Color selection dialog added.

- New GUI skin "Burning Skin".
	it's a black & white skin. look elegant on true-color.
	and looks ok on 1-Bit ( e.g. no vertex color in burnings video )

- GUIStatic text is correctly grayed out if disabled.

- Added getHeight method for terrain node submitted by Spintz. It calculates the height from the base mesh instead of requiring ray casts and collision detection and is much faster.

- New methods core::lerp to linearly interpolate two floats and SColor.getLuminance to calculate luminance of RGB color.

- MAJOR API CHANGE:
  Fixed matrix access methods mat(x,y). These were previously said to be (row,column) but actually were (column, row). This lead to some confusion and made their use quite tricky. Irrlicht code is updated for the new method, but applications will silently fail now (i.e. compile without errors, but not working as expected).

- Update to zlib-1.2.3

- Fixed vertex alpha handling in DirectX drivers.

- Image writers fixed and working (at least for little endian systems).

- VSync under Linux fixed and correctly working.

- New os::Byteswap::byteswap methods which can be used for byteswapping (endianess correction) in mesh loaders and image loaders.

- New video driver feature to check for multitexture feature.

- Direct3D drivers update the devicelost variable if reseeting failed with this return code.

- VideoModeList under Linux is correctly filled now. No glX calls are made if GLX extension is not found - only software drivers are available then. RandR extension can be enabled with a new compile flag in IrrCompileConfig.h, either instead of XF86VidMode or in addition.

- Big Endian support for MS3D loader.

- Apfelbaum software renderer: basic mipmap support (per triangle), switch for using w-buffer instad z-buffer ( default on )

- Better FPU support: Changed various fpu-call's in whole project (main reason to use faster float to int conversion on x86. ( fistp ))

- changed Visual Studio 7.1 vcproj project config "Release Fast FPU" to __fastcall in /QIfist

- CGUIFont added True Alpha Font Support. (currently it's a little hack, but it'a good starting point. Fonts are back compatible. To use the new feature make first pixel half transparent in the font file.)

- Scolor: replaced s16 color with u16 color, replaced s32 color with u32 color to get rid of unnecessary arithmetic shift

- Colorconverter: X8R8G8B8toA1R5G5B5, set Alpha High, minor: A1R5G5B5toA8R8G8B8 	changed if (a) to conditional set

- CImage: added boxfilter (weigthed average), (generic, slow)

- The scene manager now sets an ambient light color when calling ISceneManager::drawAll().
  You can influence this by calling ISceneManager::setAmbientLight(). That light color
  is also stored when saving .irr files via ISceneManager::saveScene().

- Loaded COLLADA files which contained only one single mesh now behave like all the 
  other loaded meshes, and the #meshname workaround has been removed.

- File lists are now sorted.

- Dynamically checking the OpenGL version now instead of at compile time to call the supported methods of the executing machine, not that one of the compile host. This should fix the extension check and the automatic mipmap update.

- Fixed vertex alpha handling of 2D images with OpenGL.

- Default depth buffer under Windows now 24bit to avoid zbuffer fighting.

- Fixed light count in OpenGL.

- Particle emitters can now be enabled/disabled via a new method.

- Sky dome is rotatable just like the sky box.

- Rotation animator can be applied to several nodes now, before it only rotated the first one it was applied to.

- Support for drawing other vertex primitive lists such as triangle strips.

- Default specular color is white again, thus simply enabling shininess is enough to get speculars.

- Some .x loader and animator improvements. Vertex color support.

- isActive now also work under Linux.

-------------------------------------------

Changes in version 1.1 (06 Aug 2006)

- New example to show some features of the .irr format

- Added support for making screenshots in all video drivers and a general
  possibility to save any IImage to several file formats.
  Some image writers are not yet implemented. As a testcase screenshots
  are now available in the demo by pressing F9.
  This code was contributed by Travis Vitek.

- Changed EAMTS_OCT to EAMT_OCT.

- Improved .3ds and .obj file importers.

- Added support for .b3d (Blitz Basic) submitted by Luke Hoschke and
  .pak (Quake archive) files submitted by skreamz.

- Added sky dome implementation contributed by Anders la Cour-Harbo (alc).

- In addition to the Cube scene node (formerly test scene node) there is now also a sphere scene node available,
  with an adjustable amount of polygons. Use ISceneManager::addSphereSceneNode to create it.
  Thx to Alfaz93 for making available his code on which this node is based on.
  Note that both nodes now use default material settings, e.g. lighting is enabled by default.

- Fixed Linux keyhandling for many keys.

- The aspect ratio has been inverted in the matrix, which means when setting a new aspect ratio
  for cameras, set it to screen.width/screen.height now instead of screen.height/screen.width
  as previously.

- added support for reading/importing binary .x files.

- .ms3d and .x normals are now correctly transformed in animations, bounding
  boxes are slightly better transformed, but not yet correct.

- Added possibility to load and save Irrlicht scenes to and from xml files via
  ISceneManager::saveScene and ISceneManager::loadScene. Note that not all
  scene nodes are supported yet, but most features should already work.

- Bounding box of the Skybox corrected (set to null)

- The SMaterial structure now supports 4 textures. (Currently ignored by the renderers and their materials.)

- Test scene node renamed to CubeSceneNode.

- Added scene node animator factories. This is the same as scene node
  factories, but for scene node animators.

- Added scene node factories. This is an interface making it possible to dynamicly
  create scene nodes. To be able to add custom scene nodes to Irrlicht and
  to make it possible for the scene manager to save and load those external scene nodes, simply
  implement this interface and register it in you scene manager via ISceneManager::
  registerSceneNodeFactory

- Introduced IMeshSceneNode interface with the possibility to set readonly materials to make
  it possible to use the mesh materials directly instead of overriding them. In this way
  it is possible to change the materials of a mesh causing all mesh scene nodes
  referencing this mesh to change, too.

- Added possibility to load OGRE .mesh files directly, thanks to Christian Stehno who contributed
  a loader for this.

- Merged with Irrlicht 1.0 for MacOS

- Added a method getType() to ISceneNodeAnimator.

- There is now a system to serialize and deserialize attributes of scene nodes. In this way
  it should be quite simple to to expose the attributes of your scene node for scripting
  languages, editors, debuggers or xml serialization purposes.

- Irrlicht containers and strings now have allocators, making it possible to
  use them across .dll boundaries.

- Changed the name of scene nodes from wide character to to char* for speed and memory reasons.

- Renamed IStringParameter class to IAttributes and enhanced it to be able to
  serialize its content into and from xml.

- Textures now have a method getName().

- Added the methods getTextureCount() and getTextureByIndex() to IVideoDriver.

- Most classes now derive virtually from IUnknown.

-------------------------------------------
Changes in version 1.0 (19 Apr 2006)

- Irrlicht now will load d3d 9 dlls (like d3dx9_27.dll) manually if needed. If you compile irrlicht
  with an SDK which needs one of these dlls, irrlicht will now also start up on a pc without
  these Dlls installed. Note that now these dlls will also only be loaded if your application
  uses shaders. If the dlls are missing, shader support will be disabled.

- The Apfelbaum Software Software Renderer now works in 32 bit and is capable of rendering dynamic
  lighting as well as doing alpha channel blending.

- Added support for the Code::Blocks IDE (http://www.codeblocks.org)

- It is now possible to draw temporarily to foreign windows, by specifying a window handle when
  calling IVideoDriver::endScene(). Note: This does not work in fullscreen mode and is not
  implemented for all devices (only for	D3D8, D3D9, Software1 and Software2, and only for Windows).
  In addition, you can also specify the source rectangle to present.

- Picking is now more accurate and also works with view ports and better with orthogonal cameras.

- Scene Nodes now have an additional flag, IsDebugObject. This denotes if a
  scene node is a debug object. Debug objects have some special properties,
  for example they can be easily excluded
  from collision detection, picking or from serialization, etc.

- Scene Nodes now have the possibility to return their type using
	virtual ESCENE_NODE_TYPE getType().

- Improved support for orthogonal rendering: Skyboxes and billboards can be
  used with orthogonal cameras now, too.

- Fixed a bug in collision

- Fixed some marshalling bugs in Irrlicht.NET

- Some fixes to make gcc 4 happy.

- Fixed a bug which caused the engine to crash when trying to use the
  apfelbaum software rasterizer with linux

- Several improvements to Irrlicht.NET, for example string output for vectors, viewfrustrum access
  for cameras, drawing of bounding boxes, support for orthogonal cameras.

- Updated DMF importer to support new DeleD functionalities, solid materials will now be
  shown correctly again in Irrlicht.  Thanks to Salvatore "Il Buzzo".

- Added a method to change the return value of ICameraSceneNode::isOrthogonal

- Improved md2 animation playback

- Fixed the REFLECTION_2_LAYER materials. Now also works for OpenGL. Had to change the parameters
  of this material (for all drivers), the reflection is now at texture 2 and the diffuse map at
  texture 1. This was the other way round before.

- Added examples for csharp, visualbasic, delphi.net and boo.

- Several other small bug fixes.

-------------------------------------------------------------------------------------
Changes in version 0.14.0 (30 November 2005)

- Irrlicht now includes another video driver type. Together with D3D8, D3D9, OpenGL, the NULL
  driver and the Software Renderer, an Irrlicht user now has the decision between 6 renderers:
  The new included renderer is The Apfelbaum Software Renderer, an alternative software renderer
  for Irrlicht. Basically it can be described as the Irrlicht Software renderer on steroids.
  It rasterizes 3D geometry perfectly: It is able to perform correct 3d clipping, perspective
  correct texture mapping, perspective correct color mapping, and renders sub pixel correct,
  sub texel correct primitives. In addition, it does bilinear texel filtering and supports more
  materials than the EDT_SOFTWARE driver. In short: It looks a lot like the already available hardware
  accelerated drivers, but without hardware. :) This renderer has been written entirely by
  Thomas Alten, thanks a lot for this huge contribution.

- Irrlicht now supports anisotropic filtering. Use the SMaterial::AnisotropicFilter member or
  EMF_ANISOTROPIC_FILTER flag to enable it. I implemented this for all 3 hardware accelerated
  drivers: D3D8, D3D9 and OpenGL.

- Irrlicht now supports the recently released new microsoft compiler. Irrlicht versions compiled
  with older verions of this compiler can now also be used with the new one, which wasn't possible
  previously because of a name mangeling issue.

- All 2D drawing functions can now be used to draw into textures (render targets). This also
  means for example that the whole GUI environment can be rendered into textures.

- Irrlicht.NET now supports shaders.

- Irrlicht now loads all textures in 32 bit mode by default. (Previously this
  was 16bit). To change this behaviour back again, use
  device->getVideoDriver()->setTextureCreationFlag(ETCF_ALWAYS_16_BIT, true);

- Irrlicht.NET now supports Particlesystems and Shaders. Thanks to a code
  contribution by Delight.

- Fixed a bug in the mipmap generation. Now mipmaps are not that blurry
  anymore and the rendering quality has been improved a lot.

- It is now possible to assign a userData int to callback functions of shaders. In this way it
  it easily possible to use the same callback method for multiple materials and distinguish
  between them during the call.

- Directional lights are now supported in the OpenGL and D3D drivers. To switch on directional
  lighting, set the light type to ELT_DIRECTIONAL in the SLight structure.

- Fixed several bugs in the GLSL implementation. Thanks to Michael Zoech for
  sending in his improvements.

- For the windows version of Irrlicht, the engine now displays an icon in the
  program window, if there is one available in the start path with the name "irr.ico".

- It is now possible to use images with alpha channels on buttons. Use the new
  IGUIButton::setUseAlphaChannel() method to enable this feature.

- The scene manager has a new method getSceneNodeFromName() which finds a scene node by its name.

- It is now also possible to attach scene nodes to joints/bones of sceletal animated .x files.
  (Using IAnimatedMesh->getXJointNode() ). This was previously only possible with milkshape models.

- Billboards now draw their bounding box when debugdata is set to visible for them.

- Lights now draw their bounding box and radius when debugdata is set to visible for them.

- Upgraded to irrXML 1.2. Thanks to some hints by Patrik Müller, irrXML, the XML parser used
  by the Irrlicht Engine now has CDATA support and some other useful new features.

- Support for VisualC++ (Express) 2005. Added a project file and a IrrlichtPropsVC2005.vsprops
  file which sets the no deprecate define and adds needed libraries.

- Fixed size of the bounding box of billboards.

- Billboards are now also culled by default, increasing rendering speed a bit.

- Fixed a bug which caused the .ms3d loader to crash when loading .ms3d files
  without materials. Thanks to sdi2000 for posting this.

- Fixed a bug causing the possibility to crash when destructing the scene
  graph or a scene node with children.

- Fixed some bugs which caused invalid RTT operations, when for example the
  render target texture was smaller than the screen.

- Fixed a heavy bug in Irrlicht.NET causing lots of memory leaks when drawing text.

- Fixed a bug in the attachement of scene nodes to animated X files.

- Fixed a bug in the .NET Vector3D addition operator.

- Updated to Salvatore Russo's DMF loader version 1.3. Notes by him:
   This version just adds some new functionalities. First of all Alpha Blended Textures are now
   supported by DeleD as well as loader. Because of some trouble with Irrlicht 0.12.0 TGA loading,
   TGA textures are always flipped so I've added a parameter so that you can choose to
   flip or not all TGA textures coords, this way:
   SceneManager->getParameters()->setParameter(scene::DMF_FLIP_ALPHA_TEXTURES, true);
   you can also set material transparent reference value by setting:
   SceneManager->getParameters()->setParameter(scene::DMF_ALPHA_CHANNEL_REF, 0.01);
   you can use every value beetween 0 and 1, but to respect DeleD rapresentation
   0.01 is OK, just a note, if you set 0, it's just like you set 0.5, this means
   that each pixel found corresponding to a position in alpha map that has a value<127
   won't be drawn.

- Fixed a small bug in the line breaking algorithm.

- Fixed a bug which caused the engine to display strange artifact pixels when drawing 2D images
  like text in screens which odd resolutions.

- Slightly changed the interface of createDevice and createDeviceEx(): the version parameter
  now is a char* instead of wchar_t*. Also, IrrlichtDevice::getVersion() now returns char*
  instead of wchar_t*.

- Fixed some parts in the source to make Irrlicht compile in Linux 64.

- Renamed the EDT_DIRECTX8, EDT_DIRECTX9, _IRR_COMPILE_WITH_DIRECTX_8_ and
  _IRR_COMPILE_WITH_DIRECTX_8_ enumeration literals to EDT_DIRECT3D8, EDT_DIRECT3D9,
  _IRR_COMPILE_WITH_DIRECT3D_8_ and _IRR_COMPILE_WITH_DIRECT3D_9_. You might need to
  update your code and compilation settings with these new names.

- Added the remaining '..' directory in the linux version of the file list

- Updated to a faster version of the TerrainSceneNode by Spintz. Much thanks again!

- Fixed a bug causing billboards to be displayed upside down.

- The D3D drivers now won't crash anymore when they get feeded with nullpointers as shader constants.

- Irrlicht now identifies the Linux platform it runs on and returns a more detailed string
  when calling getOperationSystemVersion().

- Fixed some bugs in several collision test methods thanks to Spintz.

- Updated font tool

- Made the list::iterator constructor which took a sklistnode as parameter private,
  to make Irrlicht compatible with the Errlicht interface.

-------------------------------------------------------------------------------------
Changes in version 0.12.0 (24 August 2005)

- It is now possible to have multiple scene managers. Use ISceneManager::createNewSceneManager()
  to create a new one. This can be used to easily draw and/or store two independent scenes at
  the same time.

- Irrlicht now supports GLSL, the OpenGL Shading Language, which means Irrlicht now
  supports 14 shading modes/languages: ARB Vertex Programs, ARB Pixel Programs, HLSL,
  GLSL 100, GLSL 110VS1.1, VS2.0, VS3.0, PS1.1, PS1.2, PS1.3, PS1.4, PS2.0, PS3.0.
  Lots of thanks go to William Finlayson for implementing this and making available his code
  to be used in Irrlicht.

- Added support for pixel shader 3.0 and vertex shader 3.0.

- Irrlicht now supports detail maps, use EMT_DETAIL_MAP for this. The new terrain scene node
  tutorial shows how to use detail maps.

- Again some changes have been made in Irrlicht.NET. For example it is now a little bit more memory
  friendly, I removed several bugs and made the terrain scene node, realtime shadows and key codes
  available.
  In addition, I extended the .net example application a lot, just try it out.

- I've worked around a heavy bug in the microsoft compiler which caused lots of bugs in Irrlicht.NET.
  They are all fixed now. See http://support.microsoft.com/default.aspx?kbid=823071 for details.

- The timer of the engine has been enhanced a lot, which maybe needs a little change in your
  project if you are upgrading from an older version of Irrlicht. It is now possible
  to set the speed of the timer, a new time value, and to start and stop it. Also, all
  calls to getTime() will now return the same value within the same drawing frame.
  The timer will only advance when ITimer::tick() is called. IrrlichtDevice::run() will
  call this method automaticly, but if you aren't using this method, and you are wondering
  why your scene is not animating anymore, just call Device->getTimer()->tick() before
  drawing your scene. If you need the system time, not the new virtual time,
  use ITimer::getRealTime().

- The material EMT_TRANSPARENT_ALPHA_CHANNEL now is using a configurable alpha ref value.
  The default value is 127, which means people who are using this material for drawing
  things like grass, trees etc will get nice results automaticly when changing to 0.12.0.
  To change to a different alpha ref value, just change SMaterial::MaterialTypeParam value.
  See EMT_TRANSPARENT_ALPHA_CHANNEL for details.
  Also, this fixes two bugs:
   - A bug causing the D3D versions not looking like the OpenGL version.
   - A second bug which caused the texture to look like disappearing when looking at from far away.

- Upgraded to a new dmf loader version by Salvatore Russo which is able to use a texture path
  and material directories. Set DMF_USE_MATERIALS_DIRS and DMF_TEXTURE_PATH using the
  ISceneManager::getParameters() method.

- It is now possible to set a separate scale for the second texture coordinate set in the
  terrain scene node when calling ITerrainSceneNode::scaleTexture(). This is useful when using
  detail maps on the terrain.

- Added a new material flag named EMF_NORMALIZE_NORMALS. You can enable this if you need
  to scale a dynamic lighted model. Usually, its normals will get scaled too then and it
  will get darker. If you enable the EMF_NORMALIZE_NORMALS flag, the normals will be
  normalized again.

- When loading Milkshape .ms3d files, Irrlicht also loads materials and tries to apply the textures.
  Thanks to atomice for this patch.

- The ISceneManager::addCameraSceneNodeFPS() has a new parameter named 'noVerticalMovement' with which
  it is possible to disable vertical movement of the FPS camera and make the camera behave just like
  in most ego shooters today.

- Made Irrlicht 64 bit compatible, removing some 32 bit only constructs. However, I wasn't able to
  test it out extensively. If you are compiling Irrlicht for a 64 bit windows environment and get
  a linker problem, try playerdark's solution:
  "The linker settings are so that no machine is specified in the drop down field, instead,
  the command line option /MACHINE:x86 is set manually which interferes with the 64 bit linker
  of course. Removing that from the 64 bit version (and replacing it with the drop down selection
  in the 32 bit version for that matter) fixed the linker problem."

- There is now a IrrlichtDevice::postEventFromUser() method available, to make it possible to
  post key or mouse input events to the engine if you are using an own input library for
  example for doing joystick input.

- The GUI Environment now has an own basic RTTI system, and all IGUIElement derived classes
  have a method named getType(). This is needed for the .NET wrapper but will be used
  later for serializing and deserializing.
  If you wrote your own GUIElements, you need to set the type for your element as first parameter
  in the constructor of IGUIElement. For own (=unknown) elements, simply use EGUIET_ELEMENT.

- Thanks to William Finlayson, Irrlicht now also supports RTT (render to texture) when
  rendering using OpenGL.

- Thanks to William Finlayson, the EMT_REFLECTION_2_LAYER is now implemented in the
  OpenGL version of Irrlicht, too.

- There is now a mesh cache interface available. With this, is is possible to get access to
  all loaded meshes, and to remove them to free memory. You can get access to the cache
  using ISceneManager::getMeshCache(). Please note that the addMesh() method of ISceneManager
  now is now longer available, you can find it now in the IMeshCache interface.

- The VideoDriver now has a method for clearing the zbuffer at any time: IVideoDriver::clearZBuffer().
  With this, it is for example easily possible to overlay two scenes.

- Fixed a bug which caused Irrlicht to crash when loading grayscale jpeg files.

- Somebody sent me an .x file (tank_human1_crashes_irrlicht.zip) which caused Irrlicht to crash.
  It seems I've lost that mail, but maybe you are reading this: It's fixed now. :)

- Fixed a bug which caused the diffuse maps of lightmaps to disappear under certain circumstances
  in OpenGL.

- Its now possible to make IGUIStaticText draw its background.

- Removed the first two default parameters from
  IGPUProgrammingServices::addShaderMaterialFromFiles() to prevent SWIG
  to create non compilable wrapper code.

- Fixed a small bug which caused the terrain scene node to be culled incorrectly.

- Changed the names the driver return (now "OpenGL 1.5", "Direct3D 9.0" and "Direct3D 8.1")

- Added a new macro _IRR_DEBUG_BREAK_IF which is now used instead of the _asm int 3 break points in
  debug mode.

- Fixed a bug were the software renderer didn't clip 2d rectangles. This effect was visible for
  example when using list boxes, selecting an entry at the end an scrolling up so that it wasn't
  visible anymore.

- There is now a new gui event available (named EGET_COMBO_BOX_CHANGED) which will be
  sent when the selected item in a combo box has been changed. Finally.

- Fixed a Problem which caused an empty window to be created when a rendering device
  could not be initialized under special circumstances. Thanks to Sascha Plumhoff for
  the bug report.

- Fixed a bug with the FileList in Linux, reported by DrAnonymous and fixed by William Finlayson.

- Fixed some bad documentation bugs.

- The XWindow handle is now exposed too, via IVideoDriver::getExposedVideoData().

-------------------------------------------------------------------------------------
Changes in version 0.11.0 (08 July 2005)

- Antialiasing is now supported by Irrlicht in the D3D8 and D3D9 renderer. To switch
  it on, use createDeviceEx() and set SIrrlichtCreationParameters::AntiAlias to true.

- Irrlicht.NET can now run inside a pre created Windows.Form window.

- I'm no longer providing a Visual Studio 7.0 project/solution file for the Irrlicht
  Engine sourcecode, only 7.1 and 6.0 are supported. If you are using Visual Studio 7.0,
  just open the .dsp file for Visual Studio 6.0, it will be converted automaticly.

- Irrlicht.NET includes now all basic GUI Elements and can capture GUI events. There are
  still some features missing, but it is already enough to do simple things like showing
  message boxes, displaying images, getting input strings, etc.

- Improved the .NET documentation a bit.

- There is a full implemented ISceneCollisionManager now available in Irrlicht.NET.

- The Linux OpenGL renderer now supports mip mapping.

- It is now possible to compile Irrlicht as shared lib in Linux. To do this, go into the source
  folder and run 'make sharedlib'. This should create a libIrrlicht.so.0.11.0 file in
  lib/Linux. To install it in /usr/local/lib, you can run 'make install'.

- The drawing of the GUI system has been refactored and a lot of redundant code has
  been removed.

- The new method IVideoDriver::draw2DRectangle() is able to draw rectangles not only
  filled with a single color, but with a gradient from four colors. This is implemented
  in all drivers except the Software driver which still uses one color for this method.

- It is now possible to customize the GUI system's skin a lot more: Simply implement your
  own IGUISkin interface and implement the draw..() methods.

- There are now two build-in skins available: Windows Classic and Windows Metallic. The
  default skin is now Windows Metallic, if you want to change back to the old skin, use the
  following code:
  gui::IGUISkin* newskin = environment->createSkin(gui::EGST_WINDOWS_CLASSIC);
  environment->setSkin(newskin);
  newskin->drop();

- Added improved keyboard input handling for the Linux version of Irrlicht, thanks to
  Fabien Coutant for the fix.

- Fixed a bug in the Linux OpenGLDriver which caused to load a wrong OpenGL extension
  and made multitexturing look quite strange. Thanks to hybrid for spotting out that
  bug.

- COLLADA file loading now works the same like the loading of other meshes: Just
  call ISceneManager::getMesh("yourfile") and display it using for example
  ISceneManager::addAnimatedMesh(yourLoadedMesh);
  To make it possible to create instances from meshes, lights and cameras in COLLADA
  files again as in irrlicht 0.10, just enable the collada instance creating mode:
  SceneManager->getParameters()->setParameter(COLLADA_CREATE_SCENE_INSTANCES, true);

- Added lots of useful methods to the IStringParameters class. It is now possible to
  set not only strings but also boolean, integer and float values as parameters.
- Fixed a bug with the TRANSPARENT_ALPHA_CHANNEL materials in all renderers to make them
  work more as expected: They didn't write to the zbuffer. If you are using this
  material and you don't want the new setting, just set the ZWriteEnable flag in the
  SMaterial structure of your transparent material to false. Thanks to Fabien to
  point this out.

- There are now some new defines making it possible to use system installed libs instead of
  the ones which come with Irrlicht: _IRR_USE_NON_SYSTEM_JPEG_LIB_,
  _IRR_USE_NON_SYSTEM_LIB_PNG_ and _IRR_USE_NON_SYSTEM_ZLIB_, which are defined by default
  in the file IrrCompileConfig.h

- Renamed ISceneManager::getStringParameters() to ISceneManager::getParameters()
- Changed the define _IRR_D3D_SHADER_DEBUGGING to _IRR_D3D_NO_SHADER_DEBUGGING to be
  able to make it defined by default and to let it be included in the doxygen documentation.

- The SceneManager now does not do any culling tests for cameras, lights and skyboxes.

- Added a transformBoxEx() method to matrix4 which transforms a bounding box more accurate.

- Small edit box copy & paste bug fixed thanks to Fish HF

- Fixed a bug which caused the engine to read windows messages when embedded in
  a custom win32 control when called IrrlichtDevice::setResizeAble(). Thanks for
  Duncan Mac Leod to find that bug.

- Fixed a bug in the HLSL renderer which caused Irrlicht to crash, if no vertex shader
  was specified. Thanks to mightypanda for reporting this.

- Fixed a bug in the normal map generation thanks to jox. Parallax mapping and
  normalmapping now even look a lot better because of this. ;)

- Updated to irrXML 1.1:
  - The XML parser is now also able to parse embedded text correctly when it is shorter than
  2 characters.
  - The XML parser now treats whitespace quite smart and doesn't report it when it is
  obviously used for formatting the xml file. (Text won't be reported when it only contains
  whitespace and is shorter than 3 characters)
  - The XML parser won't crash anymore when the xml file is malformed and an attribute has
  an opening but no closing attribute.
  - Removed a documentation which claimed that the xml parser doesn't work as the xml standard
  when replacing special characters, which wasn't true.

-------------------------------------------------------------------------------------
Changes in version 0.10.0 (26 May 2005)

- The engine is now able to use parallax mapping. It's implemented for D3D9, D3D8 and OpenGL.
  The perPixelLighing tutorial shows how to use it. Thanks go to Terry Welsh who wrote
  the 'Parallax Mapping with Offset Limiting'-paper on which the Irrlicht implementation
  is based and who allowed me to use his texture for use in the example.

- Added render to texture support. Currently, only the D3D9, D3D8 and the software renderer
  are able to use this feature. There is a new example, showing how to render scenes into
  a texture.

- Irrlicht now can load .png textures. There is also a new compile configuration
  define to exclude the png loading option: _IRR_COMPILE_WITH_LIBPNG_. Thanks to
  rt who originally wrote the png loader and who allowed me to use and modify his code
  and place it under the Irrlicht Engine license.

- Added support for COLLADA files. COLLADA is an open Digital Asset Exchange Schema for the
  interactive 3D industry. There are exporters and importers for this format available
  for most of the big 3d packages at http://collada.org. Irrlicht can import COLLADA files
  by using the ISceneManager::getMesh() method. As COLLADA need not contain only one single mesh
  but multiple meshes and a whole scene setup with lights, cameras and mesh instances,
  this loader sets up a scene as described by the COLLADA file instead of loading
  and returning one mesh. The returned mesh is just a dummy object. However, if the
  COLLADA file does not include any <instance> tags, only meshes will be loaded by the
  engine and no scene nodes should be created. Meshes included in
  the scene will be added into the scene manager with the following naming scheme:
  path/to/file/file.dea#meshname. The loading of such meshes is logged.
  Currently, this loader is able to create meshes (made of only polygons), lights,
  and cameras. Materials and animations are currently not supported but this will
  change with future releases.

- Added Delgine DeleD .dmf mesh loading support. I simply added Salvatore Russo's .dmf loader to
  Irrlicht, and changed some parts of it. Thanks to Salvatore for his work and for allowing
  me to use his code in Irrlicht and put it under Irrlicht's license.

- Specular highlights are now finally usable the engine. To activate, simply set the shininess
  of a scene node to a value other than 0: sceneNode->getMaterial(0).Shininess = 20.0f;
  You can also change the color of the highlights using
  sceneNode->getMaterial(0).SpecularColor.set(255,255,255,255);. The specular color of the
  dynamic lights will influence the highlight color, too, but they are set to a useful
  value by default when creating the light. This feature is currently only available in
  the D3D drivers.

- Added a new material type: EMT_TRANSPARENT_ALPHA_CHANNEL_REF. This draws a pixel of the
  material only when the alpha channel has a value greater than 128. It is ideal for drawing
  for example leafes of plants and does not use alpha blending, so it is a lot faster than
  EMT_TRANSPARENT_ALPHA_CHANNEL.

- There is now a createDeviceEx() method with which it is possible to create an Irrlicht Engine
  device into an already existing window. This currently only works in Windows.
  This method will be extended in the future with other options.

- Irrlicht.NET has been extended with ports of the SceneNodeAnimators, TriangleSelectors
  the FileSystem and Font drawing. Also the documentation of it has been improved a lot.

- There are two new tutorials/examples available. One demonstrates how to use render to texture
  feature, the other one shows how to run Irrlicht inside a precreated Win32 window/widget.
  This means there are now 17 examples available in the SDK.

- The software renderer now renders 3d geometry transparent when its material is
  somewhat transparent.

- The XML Parser has been enhanced. Several small bugs have been fixed and there are some
  new features: The parser can now read ASCII, UTF-8, UTF-16 and UTF-32 (both little and
  big endian) files, and return the parsed string data in one selectable format from the
  same list. In addition, it is now completely independent from Irrlicht. If you wish to
  use the parser without the engine, take a look at the newly created project at
  http://irrxml.sourceforge.net.

- Upgraded to DirectX Exporter Mod 1.3.1

- Upgraded dev-cpp project file to Dev-C++ 4.9.9.2. Removed dependency to zlib and
  jpeglib for devcpp, the necessary .c files are now simply included in the project.

- Renamed the VisualStudio and DevCpp sub directories in the SDK to Win32-gcc,
  Win32-VisualStudio.

- Fixed a bug in irrXML causing it to replace xml characters wrongly sometimes.

- The C++ decorations at createDevice() have been added again, because lots of people
  started to mix the gcc and the microsoft .DLL and got confused why the thing crashed
  at random positions.

- Moved heapsink and heapsort into the core namespace.

- Updated to My3D version 3.15

- Fixed the wrongly drawn alpha channel material in OpenGL driver and a problem with the
  VertexAlpha material in the same driver.

- Implemented multipass rendering in the OCTTree scene node now too. This means that octtrees can
  now contain transparent materials as well.

- Improved string comparison speed, especially when comparing with pointer to char or w_char,
  no more temporary strings are being constructed now. In addition, there are some new
  string comparison methods in this class.

- Added string::replace() method.

- Added string::trim() method.

- Addes string::erase() method.

- Fixed a bug in array which caused data corruption if an element which already inside the
  the array was pushed_back. Thanks to vox for reporting this and to provide a solutin

- Added ISceneManager::addMesh() method.

- Added IMeshManipulator::recalculateNormals(IMeshBuffer*) method.

- The file array.h has been renamed to irrArray.h

- Due to a bug, Irrlicht 0.9 didn't cull the scene nodes anymore which resulted in a huge
  performance loss. This is fixed now.

- After lots releases ignoring the 'make the fps camera smoother request', it is now
  finally integrated.

- Removed audiere dependency and the mp3 file, reeducing SDK download size.

- A bug was fixed causing the binding of the wrong fragment program sometimes in OpenGL.

- Lots of internal filenames have been renamed. All CVideo* files have been renamed to
  fit the other name conventions, CD3D9Driver.h into CD3D9Driver.h for example.

- The IMaterialRenderer interface now has the new method getRenderCapability() which
  returns if the material is able to be rendererd with all settings on current hardware.

- Added IMeshManipulator::setVertexColors();

- Added float color reading support in the 3DS loader.

- video::EVDF_BILINEAR_FILER renamed to EVDF_BILINEAR_FILTER

- core::equals function added.

- fixed a small bug in fast_atof thanks to jox

- Added a method ICamera::isOrthogonal() which is being used by
  ISceneCollisionManager::getRayFromScreenCoordinates(), thanks to a bug report and fix by
  jox in this thread: http://irrlicht.sourceforge.net/phpBB2/viewtopic.php?t=6243

- Added some fixes to the GUI environment to make the parent and child pointers be more
  consistent as suggested by jox in this thread: http://irrlicht.sourceforge.net/phpBB2/viewtopic.php?t=6220

- Fixed a bug which caused the ambient light not to be reset after a window resize in D3D8 and 9.
  Thanks to jox for this bug report and fix.

- vector3df equals method added.

- added SColorf::getInterpolated() method

- Moved ITextSceneNode interface to include folder.

- Fixed a small bug in the My3DLoader which failed sometimes finding the right textures.

- Fixed bounding box problem with meshes without joints in .X file loader, thanks to
  jox. (http://irrlicht.sourceforge.net/phpBB2/viewtopic.php?t=6669)

- Fixed IFileSystem::getWorkingDirectory in Linux version.
  (http://irrlicht.sourceforge.net/phpBB2/viewtopic.php?t=6678)

-------------------------------------------------------------------------------------
Changes in version 0.9 (28 Mar 2005)

- There is now a 100% working terrain renderer available. The old buggy and unfinished terrain
  scene node has been replaced by a new TerrainSceneNode which is based on Spintz's
  GeoMipMapSceneNode and Soconnes terrain renderer. Lots of thanks for their work on
  this and that they allowed it to be modified and integrated into Irrlicht.

- It is now possible for a scene node to draw itself in multiple passes. This means it can
  register itself for multiple render passes (E_SCENE_NODE_RENDER_PASS) and during rendering
  it can query the current render pass using ISceneManager::getSceneNodeRenderPass(). With
  this, SceneNodes can contain solid and transparent materials at the same time and will be
  rendered in the correct order from now on.
  The IAnimatedMeshSceneNode and the IMeshSceneNode implement this feature, so it is now
  possible to create for example cars with transparent windows without the need of a separate
  scene node. Because of this change, all render time enumeration values have been renamed.

- Irrlicht is now able to load OCT files directly. OCT files
  can be created with Paul Nette's Radiosity Processor from http://www.fluidstudios.com
  or exported from Blender with Murphy McCauley's exporter. This exporter can be found
  in the directory \exporters\OCTTools of the Irrlicht SDK or from his homepage
  http://www.constantthought.com/project/OCTTools. A lot of thanks go to Murphy McCauley
  for this work on this and his permission to include his OCTTools into Irrlicht.

- Irrlicht is now able to load Cartography shop 4 (.csm) files directly. A lot of
  thanks go to Saurav Mohapatra for this work on this and his permission to adapt and
  include his IrrCSM library into Irrlicht. If you are using .csm files, please note that
  you'll have to set the path of the textures before loading meshes. You can do this using
  SceneManager->getStringParameters()->setParameter(scene::CSM_TEXTURE_PATH,
   "path/to/your/textures");. The original loader can be obtained from
  http://www.geocities.com/standard_template/index.html

- Irrlicht is now able to load Pulsar LMTools (.lmts) files directly because it now
  integrates a modified version of Jonas Petersen's lmts loader in version 1.5 (from
  http://development.mindfloaters.de/). Lots of thanks go to him for creating this
  loader and giving his permission to add it to Irrlicht. If you are using this loader,
  please note that you can set the path of the textures before loading .lmts files.
  You can do this using SceneManager->getStringParameters()->setParameter(
  scene::LMTS_TEXTURE_PATH, "path/to/your/textures");

- Irrlicht is now able to load my3D files directly. The My3DTools 3.12 loader by
  Zhuck Dimitry was (a bit modified and) integrated into the engine. Lots of thanks
  go to him for his work and for giving his permission to do that. Newer versions
  of this loader can be found at http://my3dproject.nm.ru. The exporters for this
  file format have also been added into the \exporters directory of the SDK.

- To be able to replace built-in meshloaders with newer external versions without the
  need of recompiling the engine, now mesh loaders which are added to the engine using
  ISceneManager::addExternalMeshLoader() are prefered over built-in mesh loaders.
  Thanks to for his suggestion of this.

- D3D8 and D3D9 support for dev-cpp has been improved. If you are using Dev-Cpp and
  a DirectX-Devpack for recompiling the engine, just add
  -DIRR_COMPILE_WITH_DX9_DEV_PACK to your compiler
  settings and something like -ld3dx9 -ld3dx8 to the linker settings and
  press 'compile'.

- The SceneManager now contains an interface for storing and exchanging parameters.
  ISceneManager::getStringParameters() returns IStringParameters, which can be used for
  example by extensions like external mesh loaders to set and read independent parameters.
  This is also currently used by the newly built in CMS, LMTS and MY3D loader: It is possible to
  set a value 'CSM_TexturePath', 'LMTS_TexturePath' or 'MY3D_TexturePath' to let them know
  the path of the textures.

- IAnimatedMeshSceneNode now has two new methods for being able to have more influcence
  on the animation playback: It is now possible to set the playback mode to looped or
  non looped with IAnimatedMeshSceneNode::setLoopMode() and it is possible to set
  a callback interface which will be called when animation playback has finished
  using IAnimatedMeshSceneNode::setAnimationEndCallback(). Thanks to Electron for his
  suggestion for this addition.

- The software renderer has a new triangle renderer specialized on disabled zread and write.
  This means that skyboxes are now rendered in the correct order when using the software
  renderer.

- Multitexturing and other extensions in Linux are now turned on by default. There is a new
  #define in the file IrrCompileConfig.h for disabling this again: LINUX_OPENGL_USE_EXTENSIONS

- There is now a EET_USER_EVENT user event type for making it possible to send custom
  events through the system.

- The setTarget()-method of the FPSCameraSceneNode now is finally correctly implemented.

- Changing parents of scene nodes is now much safer. The parent member of a scene node now is
  set to 0 in all cases and should never point to invalid data when rearranging the scene node
  tree. In addition, there is now a getParent() method in the ISceneNode class.

- Debug breakpoints using "_asm int 3" are now only being used when in debug mode and
  using Micosoft's compiler. Now more exotic compilers like BorlandC++ will like
  Irrlicht better because of this.

- Updated zlib version to 1.2.2

- An implementation of 3D triangle clipping in the software renderer has been started. It
  is not 100% ready, but it is a beginning. This means now for version 0.9, that there are
  not that much artifact triangles drawn anymore. But this means also that drawing is
  a lot faster and that triangles clipped at the border of the screen will disappear
  too fast. If anyone wants to finish the drawClippedIndexedTriangleListT() method
  in the CSoftwareDriver class, he is welcome :)

- There is a new parameter in the IVideoDriver::createImageFromData() which causes the
  image to be able to own foreign memory.

- A renderstate setting has been fixed which caused to disable mip maps on wrong geometry
  when there was other geometry which had no mip maps. At least this bug doesn't appear
  on my hardware any more, I hope this means the problem it is now fixed.

- A bug in the D3D version of the stencil shadows has been fixed thanks to Murphy. Sometimes
  you could see a small shadow similar to the the real shadow in the scene. This should now
  be fixed.

- Irrlicht can now draw non filled concyclic reqular 2d polyons like triangles, tetragons,
  pentagons, hexagons, heptagons, octagons, enneagons, decagons, hendecagons, dodecagon and
  triskaidecagons. And circles. Yes, I was a little bit bored. Christian Lins made a
  suggestion to add 2D circle drawing support to Irrlicht, and I did this, but also added
  support for drawing these figures using the same method. Check out
  IVideoDriver::draw2DPolygon().

- Removed a memory leak when creating hlsl pixel shaders.

- I've made varoius updates to the documentation and moved to doxygen 1.4

- Fixed a bug in the xml reader which caused it to crash when reading empty xml files.

- Removed the buggy bsp tree scene node from the engine.

- Tweaked some settings with some GUI elements.

- ISceneNode::getAbsolutePosition now should be way faster.

- Applied a fix by William Finlayson to the opengl stencil shadow drawing code which
  fixes several bugs.

- There is now a min_ and max_ template function available in the core namespace.

- Added some bugfixes to MayaCameraSceneNode by jox. An even more improved version can
  be found at http://development.mindfloaters.de/Downloads.12.0.html.

- core::array now has a push_front method.

- core::array now has an insert method. (Thanks to jox)

- IrrlichtDevice now has a getEventReceiver() method.

- Fixed a mouse wheel - mouse coordinates bug thanks to a bug report and fix by jox.

- Changed the first parameter in IGUIContextMenu::addItem(wchar_t* text, ...) to const.
  Thanks to jox.. again. :)

- Fixed ignore path bug in zip file reader thanks to Pr3t3nd3r. It is now possible
  to use zip files with the complete path to the files from the archive.

- Fixed matrix4::rotateVect method after a suggestion by several users. (I think Electron,
  Pr3t3nd3r, Jox) Thanks all :)

- Fixed a bug in CGUIEditbox that enables you to write more characters than the max set
  limit, thanks to Rush for the bug report and fix.

- Added getAngleTrig() method to vector2d as suggested by Pr3t3nd3r, thanks!

- After a suggestion by schick, plane3d<T> now stores the normal vector first, and then
  the distance to the origin.

- A bug was fixed which caused 2D elements to be drawn with a second texture set in OpenGL
  mode when 3D geometry with >1 textures has been rendered before. This effect has often
  been reported as darkened 2D gui in the forum.

- A bug in IrrCompileConfig prevented users to be able to recompile irrlicht with D3D9
  with gcc. This is now fixed, thanks to Jedive.

- The project setup for Dev-C++ is now nicer. Added lots of folders and cleaned up the
  whole setup a little bit with this.

- Fixed a small bug in CGUIScrollbar reported by Klaus Niederkrueger.

- The Checkbox rect is now clipped correctly, thanks to jox for that bug report.

- The debug names of all scene nodes and GUI elements are now set correctly.

- Applied a patch making it possible to compile Irrlicht without OpenGL in Linux.

- core::rect::clipAgainst was fixed thanks to a bug report and correction by Jox.

-------------------------------------------------------------------------------------
Changes in version 0.8 (19 Feb 2005)

- Irrlicht now supports HLSL. This is possible using the new
  IGPUProgrammingServices::addHighLevelShaderMaterial() methods. Also, methods for setting high
  level shader constants have been added.

- Irrlicht.NET now supports events and cursor control. This means now you can read mouse
  and keyboard input from .NET projects like C# and VB.net too.

- There are three new built in materials for doing normal/bump mapping available:
  EMT_NORMAL_MAP_SOLID, EMT_NORMAL_MAP_TRANSPARENT_ADD_COLOR and
  EMT_NORMAL_MAP_TRANSPARENT_VERTEX_ALPHA. If the hardware does not
  support these, the materials will fall back to their base materials. To be able to
  use these materials, there is the new vertex type 'S3DVertexTangents', the material
  does not work with any other vertex types. There are some new methods to create meshes
  with this vertex type (IMeshManipulator::createMeshWithTangents()).

- A new example/tutorial (11.PerPixelLighting) shows how to use per pixel lighting
  in your applications.

- The software renderer now works in Linux, too.

- Irrlicht now has a built-in normal map generator. It creates on the fly 32 and 16 bit
  normal maps from height maps (IVideoDriver::makeNormalMapTexture). As most other things
  in Irrlicht, the generator does not depend on D3D, D3DX or OpenGL.

- Added shader debugging capabilities to Irrlicht. If _IRR_D3D_SHADER_DEBUGGING is
  defined in IrrCompileConfig.h (commented out by default), it is now possible to
  debug all D3D9 shaders in VisualStudio. All shaders (which have been generated in memory
  or read from archives for example) will be emitted into a temporary file for this purpose.
  To debug your shaders, choose  Debug->Direct3D->StartWithDirect3DDebugging in Visual Studio,
  and for every shader a file named 'irr_dbg_shader_%%.vsh' or 'irr_dbg_shader_%%.psh'
  will be created. Drag'n'drop the file you want to debug into visual studio. That's it.
  You can now set breakpoints and watch registers etc. This works both with ASM, HLSL,
  pixel and vertex shaders.
  Note that the engine will run in D3D REF for this, which is a lot slower than HAL.

- Support for compressed .tga texture loading added. (Support from 0.4.1 was buggy)
  Thanks to neojzs for posting his improvement.

- Support for 32 bit .bmp texture loading added.

- Global particles are now possible. Use IParticleSystem::setParticlesAreGlobal()
  to switch between global and local particles. A demonstration of this can be seen in the
  new tutorial (11.SpecialFX2).

- It is now possible to let IGUIImages draw themselves using the alpha channel of the texture
  they show. Use IGUIImage::setUseAlphaChannel() for this.

- ITexture now has a method for rebuilding the mip map levels: regenerateMipMapLevels().
  This is useful for example after locking and modifying the texture.

- Gravity acceleration speed in CollisionResponseAnimator was changed thanks to a suggestion
  by Morrog. The accelerationPerSecond value has been removed beacause of this, you
  can now control everything just with the gravity vector. Note that the gravity value
  must now be a little bit smaller to achieve the same effect as before.

- Fixed a problem with several material renderers which weren't able to update their states
  at the right time sometimes. A new method OnRender() will be called every time the
  material is actually used.

- Adjusted all tutorials to fit some interface changes.

- Changed the opengl shader of tutorial 10 to fit the d3d shaders. The now look the same.

- The MeshManipulator has a new method createMeshWithTangents() which creates a mesh
  with normals, tangents and binormals from any mesh.

- Wrong 2D alpha channel renderstates have been set when using D3D9 and 8. This has been fixed now.

- When loading 32 bit images with an alpha channel and storing them internally as 16 bit, the
  alpha channel got lost. This is now fixed, the remaining one bit alpha channel is now
  stored correctly.

- There is a new overloaded IGUIEnvironment::addImage method, which creates an image directly with
  a texture as parameter, adjusting its size to the original size of the texture.

- A small bug in rect<T>::isValid() has been fixed, thanks to jox.

- Fixed a bug in D3D8, D3D9 and OpenGL, which caused Materials be set and unset with an unequal
  amount when mixing 3d with 2d grafics or stencil buffer shadows.

- If you are recompiling the whole engine with Visual Studio 6 (which means
  Irrlicht.dll, NOT the application which is using Irrlicht), DirectX9 support is disabled
  now by default, because Microsoft stopped support for DX9 on VS6 in December
  2004. You can reenable this by uncommenting the new define at the bottom of
  IrrCompileConfig.h, if you have an old SDK for example.

- The mixed fvf and vertex shader system in D3D8 caused a slight issue in Irrlicht ending up
  in really messed up render states sometimes. This is now fixed.

- A major bug with the OpenGL renderer which occured on some OpenGL implementations
  has been removed thanks to a bugfix by Murphy and a great report and some investigations
  by ElectroDruid.

- Sorting transparent scene nodes was broken in all previous versions of Irrlicht. This
  didn't attract a lot attention because most users used the ADD_COLOR transparencies for which
  the sorting is not relevant. Thanks to Morrog and mmm76, sorting now is right.
- After the application window is resized, getViewport() no longer returns viewport as the
  first time the window has been created.

- The draw primitive functions are no longer wrongly checking the maximum primitive count with
  the vertex amount value. Thanks to Spintz for the bug report.

- Template materials in X files just like exported in the panda exporter are now
  supported, thanks to JoeWright.

- Changed the stringc typedef slightly to make it work with people not using
  namespace irr. Thanks to schick.

- Refactored the MeshManipulator code, which in some cases now uses template methods for performing
  calculations on different vertex types.

- Fixed an interface problem with newer versions of libJPEG.
  Thanks to Fabien Coutant and Simon Barner for some help and clues into the right direction.
  Was not able to add system specific zlib/jpeglib support due to issues on
  some strange systems/users and a lack of time, sorry.

- Typo in plane3d and triangle3d: method isFrontFacting renamed to isFrontFacing.

-------------------------------------------------------------------------------------
Changes in version 0.7.1: (26 Sep 2004)

- Fixed some bugs which prevented the engine to compile with gcc 3.4.1.

- Fixed a problem with the OpenGL driver, which caused the renderstates not to be reset correctly
  when drawing scene nodes with reflective materials.

- Fixed error in Irrlicht's software mip map generation, which caused that some mipmap levels
  looked strange. This fix was found by jox, the hardcore bug fixer,
  so many thanks go to him. Again. :)

- Disabled hardware mip map generation in D3D9 again, because it seems to cause problems on
  some hardware. I don't have any hardware where this problem occurs, but I hope this helps.

- Fixed a small bug in fast_atof submitted in the forum by da_dude.

- Fixed string operator + after a bug report by osre and a fix suggestion by jox.

- IEventReceiver now has a virtual destructor for the people who needed it.

- 3DS-Loader patched due to some suggestions of Daniel Azkona Coya.

-------------------------------------------------------------------------------------
Changes in version 0.7: (11 Sep 2004)

- The first version of Irrlicht.NET is included in this release. It is a managed C++
  wrapper .DLL which makes the most important features of the engine available for all
  .NET languages. The wrapper is incomplete, but it can already be used.
  You can find the documentation for this .DLL in the compiled help file doc\IrrlichtNET.chm.
  There are also two very basic examples available, which show how to use Irrlicht.NET
  from C# and VisualBasic.

- Low level vertex and pixel shader programming is now possible. There are
  now some methods with wich you can write GPU programs in vertex/pixel shader assembler
  using Direct3D 8 and 9 and in ARB vertex and fragment program assembler for OpenGL.
  You can use the IGPUProgrammingServices interface which can be reached by
  IVideoDriver->getGPUProgrammingServices() for this. The new material types you can create
  with this can be combined with all other already existing material types.
  For example, it is possible to create a new material which uses a vertex shader to
  calculate texture coordinates and diffuse colors, and let this be rendered by the built in
  material video::EMT_TRANSPARENT_ADD_COLOR.
  Support for high level programming languages like GLSL or HLSL is planned for the
  following releases. Also note that you won't be able to use all techniques shaders offer with
  Irrlicht, due to its current high level abstraction of the 3D APIs. For example, the engine
  does not expose vertex streams or vertex buffers currently.

- There is a new tutorial showing how to use shaders with the engine. In addition, all
  old tutorials have been rewritten and adapted. For example, the hello world
  tutorial now also shows how to set up visual studio .NET to use it with
  the engine.

- Hardware mip map level generation of textures is now supported when using D3D9.

- Internal pointers and data of the video drivers can now be exposed for experienced users with
  VideoDriver::getExposedVideoData(). For example, you can get a pointer to the IDirect3DDevice9
  interface and the HWND window handle, if the engine is running with D3D9.

- The createDevice() function has a new additional parameter: bool vsync. With this, it is now
  possible to enable or disable the waiting for the vertical retrace period. This is implemented
  in D3D9, D3D8, and the Windows OpenGL driver only, the software driver will ignore this flag.

- The engine now behaves like in the documentation: irr::createDevice() returns 0, if
  the desired driver could not be initialized.

- There is a new SceneNode available: The ITextSceneNode is able to display 2D text at a
  position in 3D space. Use ISceneManager::addTextSceneNode() to create one.

- Finally now all VideoDrivers have a draw2DLine() implementation, thanks to some additions sent in
  by Vash TheStampede.

- Applied some changes to the compilation configuration, so that it should now
  be easier to use the engine with XBOX projects. Thanks to MattyBoy for sending
  in some clues for this.

- Some improvements for the linux version of the engine: The NULL device is finally fully operational with Linux
  too, and also all examples and even the techdemo compile and run with this OS.

- The default field of view in the cameras of the irrlicht engine was a little bit
  extreme, so I changed it now from core::PI / 3.5f to core::PI / 2.5f.

- Added a new draw2DImage method for partially draw a 2d Texture, as sent in by zola with
  implementations for OpenGL, D3D8 and D3D9. Software implementation is missing.

- The string class is now able to convert integer values into a string or append it as string
  to itself.

- Added a getDriverType() method to the IVideoDriver interface.

- Added a getTransform() method to the IVideoDriver interface.

- The EMT_TRANSPARENT_ALPHA_CHANNEL material in OpenGL is now implemented.

- The integrated XML Parser now works better with different text file formats. (ASCII, UFT-16,..)

- IGUIEdit Box now feels more like a windows editbox, thanks to some changes by Jox

- Added a new method to IVideoDriver: createImageFromData as suggested by Oliver Klems.

- Fixed a the EMT_TRANSPARENT_ALPHA_CHANNEL problem in D3D8 and D3D9 due to a suggestion by Jox.

- Added 3 methods created by zola to the quaternion class: fromAngleAxis(), toEuler() and
  operator*(vector3df&).

- A bug in a matrix multiplication operator was fixed.

- Changed visual studio project files to version 7.1, but provided 7.0 project files
  for people with that version.

- Added SceneNodeAnimatorRotation rotation fix as posted by warui

- Added normalization fix to vector2d and 3d. Warui suggested a fix like that in the forum.
  The one I made has the same result, but is a little bit faster.

- Fixed some problems with the drawStencilShadow() method in the OpenGL implementation of the
  IVideoDriver interface after some suggestions by Nicholas Bray.

- Added IGUIButton::setPressed() and isPressed().

- Fixed checkPrimitiveCount() bug in NullDevice.

- Applied jox's matrix4::getRotationDegrees() fix, many thanks for posting this!

- Changed aabbox3d::getExtend() to getExtent().

- Changed IXMLReader::isEmtpyElement() to isEmptyElement()

- Fixed a bug in CSceneManager::getSceneNodeFromId() which caused the engine to crash sometimes.

- Fixed a bug in CGUISkin::setSize reported by REAPER. This method never worked before.

- Improved texture mapping and normals of the TestSceneNode, thanks go again to Jox.

- ScrollBar is now posting mousewheel events, thanks go to REAPER to post this bug and a fix for it.

- Added - operator to vector2d and vector3d, thanks to calimero

- Fixed a bug in vector2d::getAngle() and vector2d::rotateBy() thanks to Jox.

- Fixed a bug in quaternion::set(f32 x, f32 y, f32 z) thanks again to Jox.

- Fixed a bug in list::insert_before and list::insert_after, reported by Haddock.

- Fixed a bug in XML Parser which caused a seqfault on linux. Thanks for G.o.D reporting this problem.

- EDriverType enumeration renamed to E_DRIVER_TYPE

- SceneNodeRenderTime enumeration renamed to E_SCENE_NODE_RENDER_PASS

-------------------------------------------------------------------------------------
Changes in version 0.6: (09 Mar 2004)

- Irrlicht now includes its own XML parser. It provides forward-only, read-only
  access to a stream of non validated XML data. It can read everywhere Irrlicht can,
  also in compressed .zip-Files for example. Use IFileSystem::createXMLReader() to
  use it.

- Like the new XMLReader, there is also a IXMLWriter available for making it easier
  to write xml files.

- There is a new tutorial available in the SDK. It is for more advanced users, and
  shows how to create a 3d model viewer with the engine easily. It shows how to
  use menus, tabcontrols, edit-, message- and sky boxes.
  The resulting program  can also be used as tool, to check if the engine
  loads exported 3d models correctly.

- Again, there are some new GUI widgets available: A ComboBox, a ToolBar, a PushButton
  and an ImageButton. The last two are simply the old IGUIButton, but it is now able
  to display additional images and behave like a PushButton.

- It is now possible to make the drawing window resizeable, if it is in windowed mode.
  Use IVideoDriver::setResizeAble(true) to do this.

- The .x file reader and animation player now should work with 99% of all text .x files.
  This is achieved by most of the following bug fixes.

- Fixed a huge bug in the .x file reader, which caused that negative coordinates were
  interpreted as positive ones sometimes. This caused that sometimes .x animations
  were played wrong.

- Slerp interpolation of the quaternion class fixed. This means that also some bugs
  in the animation of .x files are removed now.

- Added virtual joints to not weighted vertices to improve .x file animations.

- The FileSystem is now 100% implemented. Finally it is now possible to write files
  too. There is a new Class IWriteFile and the corresponding
  IFileSystem::createAndWriteFile()

- Added lots of text and sample code to the documentation. In most parts
  documentation should be clearer now.

- The ISceneManager has a clear() method, which clears the whole scene, all scene nodes
  are removed.

- All ISceneNodes now own a new method called removeAll(), which deletes all children
  of the node.

- Fixed a bug which prevented the possibility to compile directx8 without
  having installed directx9.

- Fixed a bug in 3d line dawing in D3D 8 and 9.

- All video drivers now print out the gfx adapter type, vendor and driver version
  into the log strings.

- The D3D9 device is now as fast as the D3D8 device.

- The string class has an additional new constructor for creating a string from
  character data with a specific length.

- Bug fixed in string class assignment operator which might cause a crash in very
  special circumstances.

- Added a findNext() method to the string class.

- The ISceneNode class now has a isDebugDataVisible() method.

- Some lines were changed to make the source of the engine compatible to VS.NET 2003.

- Some functionality of the IFileList and IFileSystem was missing in the Linux version
  of the engine. This caused the FileOpen-Dialog not to work. I fixed this problem.

- The Middle and Right mouse button were swapped in the Linux version. This is now
  fixed.

- Multitexturing should now work with most linux systems too, thanks to a bug
  report by Martin Piskernig.

- The logger now has an additional log() method which accepts another combination
  of strings.

- Fixed a bug which caused fonts to be displayed very transparent in OpenGL.

- Removed one of the redundant overloaded IGUIEnvironment::updateAbsolutePosition()
  methods.

- Fixed lots of clipping problems in all GUI Widgets.

- core::rect has the new methods getCenter() and isValid().

- Scrollbar buttons are now disabled if it is not possible to scroll.

-------------------------------------------------------------------------------------
Changes in version 0.5: (17 Feb 2004)

-------------------------------------
/ Highlights in short:
/ * DirectX 9 support
/ * .x file support in all render devices including opengl and software
/ * new materials like lightmaps with dynamic lighting
/ * fog
/ * stencil buffer shadows now also work in OpenGL device
/ * more gui widgets: tab controls, edit boxes, menus
/ * spline animation support
/ * mouse wheel support
/ * triangle fan drawing
/ * quaternions
/ * improved keyboard input control
/ * lots of bugfixes including improved quake 3 map support
-------------------------------------

- DirectX 9 is now supported by Irrlicht. This does not mean that it replaces
  DirectX 8. The engine now supports both. You can now select between OpenGL,
  DirectX8, DirectX9, Software and the Null device.

- The engine now is able to read and display .x files. Using
  Microsoft's excellent .x file exporter for Maya or MAX which comes
  with the DX8 and DX9 SDK, it is now possible to create content for
  the engine easily. Using .X files with Irrlicht is independent of D3D,
  they can be used with OpenGL and with Linux for example too.
  Currently only text file .x files are supported, and some animated .x
  files may be displayed not 100% correctly, because the animation player
  may still have some small bugs. It works perfectly with most .x files which
  come with the DX9-SDK. Some skinned mesh .x files which use
  quaternions for animating joints have some problems, there might be a
  bug somewhere. I commented the lines with a possible bug in CXAnimationPlayer.cpp.

- The GUI Environment now supports edit boxes. They should support unicode input
  from every keyboard around the world, scrolling, copying and pasting (exchanging
  data with the clipboard directly), maximum character amount, marking and all
  shortcuts like ctrl+X, ctrl+V, ctrg+C, shift+Left, shift+Right, Home, End,
  and so on. Wow, I never programmed an edit box, its much more work than it
  seems to be.

- Tabcontrols are now available in the GUI environment. It is also
  possible to create tabs without tabcontrols, to be able to create
  invisible gui elements for grouping other elements together.

- Another new supported GUI Element are context menus. They support
  ordinary text menu items, separators and sub menus. In Addition,
  a standard menu as seen at the top of most windows can be
  created easily with them.

- Rewrote all tutorials to fit the new API.

- Spline animations are now supported thanks to a spline scene node animator
  written by Matthias Gall.

- Taskswitching now works with Direct3D 8 and 9 devices in fullscreen mode.

- Added Material types EMT_LIGHTMAP_LIGHTING, EMT_LIGHTMAP_LIGHTING_M2,
  EMT_LIGHTMAP_LIGHTING_M4 and EMT_LIGHTMAP_ADD.

- The engine now supports drawing of trianglefans. To do this, use
  IVideoDriver::drawIndexedTriangleFan(). Mario Gruber sent in code for this,
  so lots of thanks go to him!

- It is now possible to draw 3d objects with fog. Simply switch on the fog flag
  in the objects material. To change to way fog is drawn (per pixel/vertex, color,
  linear/expontential) use IVideoDriver::setFog();

- With IrrlichtDevice::getOSOperator() a pointer to an interface is returned, with
  wich it is possible to do some operation system specific operations. Currently
  there are only 3 methods supported, but more will be added in the future.

- Mouse wheel input is now supported.

- The Key Event structure of SEvent now contains a Char entry, describing the
  corresponding character of the pressed key. Also two bools were added,
  specifying if shift or ctrl was pressed too.

- The version of the Operating System is now printed out into the log at
  startup.

- There is now a non-const getBoundingBox() method in IMeshBuffer and
  IMesh available.

- IGUIElement now has a method getElementFromId(), which searches children
  (and its children if wanted) for an element with a specific id. If you
  want to search all items, just do
  IGUIEnvironment::getRootGUIElement::getElementFromId().

- ISceneNode::updateAbsolutePosition() is now public

- Small bug fixed in CMeshManipulator::scaleMesh().

- The engine now supports Quaternions.

- A bug was fixed causing the windows caption not to be displayed in
  Windows 95/98/ME.

- IGUIEnvironment::getBuildInFont() was renamed to getBuiltInFont().

- IGUIElement::bringToFront() is able to brint a child to the front.
  Windows for example are now using this new feature.

- Changed the texture mapping of the test scene node a little bit based on
  code sent in by Dr Andros C Bragianos.

- Added code to fix some bug in some ATI drivers. Thanks to ariaci for posting
  this code.

- Stencil buffer shadows now also work with the OpenGL device, they worked only
  in D3D in earlier versions. Lots of thanks go to Philipp Dortmann, who
  sent in a modification to the opengl driver!

- IGUIStaticText::setWordWarp() renamed to setWordWrap(),
  IGUIStaticText::enableOverrrideColor() renamed to enableOverrideColor()
  [thanks to saigumi]

- A bug was fixed, causing that the window was not able to be closed with Alt+F4
  in Win95/98.

- Optimized the Octree-Scene node a little bit for getting more rendering speed.
  Culling is now done with the real frustum, not the bounding box around it.
  Speed increase is about 5%, it's not much but ok.

- Bug fixed in the Quake 3 .bsp file loader, which caused holes to appear in
  some maps.

- Combination of 3D displaying and drawing GUI elements was improved, and the
  priority of input receiving of 3d cameras and gui elements swapped.

- A bug in the static text was fixed, which caused it to draw itself outside
  of its clipping rectangle.

- KeyFocus and MouseFocus methods in GUIEnvironment are now merged into one method.

- The Clamptexturecoordinates flag in the material was removed.

- IVideoDriver::draw3DLine in all devices was improved.

- The devcpp-version of the binary DLL which comes with the SDK is now faster.
  I'll compile this version from now on always with optimization switched on.

- Other, Minor New/Changed methods in public interfaces:
	* buildShadowMatrix in matrix4
	* getRotationDegrees in matrix4 (sent in by Chev)
	* rotateVect in matrix4
	* linear_search in array
	* recalculateBoundingBox in MeshManipulator
	* ISceneManager::addStaticText() now has a parameter for word wrapping
	* getCharacterFromPos() in IGUIFont
	* drawMeshBuffer() in IVideoDriver;
	* interpolate() in matrix4
	* getLast in array

-------------------------------------------------------------------------------------
Changes in version 0.4.2: (13 Dec 2003)

- The engine does no more use only 16 bit textures internaly. Now all
  other texture formats are supported too. This means higher precision
  and better quality images. In this context, the ISurface interface has
  been replaced by IImage, and the ISurfaceLoader by IImageLoader.

- By changing the texture creation mode of the IVideoDriver, it is now
  possible to influence how textures are created: You can choose between
  'optimized for speed', 'optimized for quality' or simply set constant
  bit depth like 'always 32 bit'. Also, you can now enable and disable
  Mip map generation with these flags. Take a look at
  IVideoDriver::setTextureCreationFlag() for details.

- There is now some support for outdoor or terrain rendering available.
  You can create a static mesh from a heightmap and a texture using
  ISceneManager::addTerrainMesh(). You can specify a huge texture if you
  like, even bigger as your hardware allows to render, because the texture
  will be splitted up if necessary.
  Another possibility for doing terrain rendering is the new Terrain Scene
  node. But it is only in a very early alpha stage, I disabled for example
  the use of different level of details.

- It is now possible to load software images into memory from files on
  disk, without creating a hardware texture. You can do this by calling
  IVideoDriver::createImageFromFile(). This is very useful for example
  for loading heighmaps for terrain renderers.

- The Quake 3 Map Loader now supports curved surfaces, thanks to by Dean P. Macri
  who sent in his code. (He also sent in lots of other cool stuff, which I will merge
  with the code of next releases, lots of thanks to him!)

- It is now possible to control what text is printed out to the console and
  the debug window of Visual Studio. By getting a pointer to the ILogger
  interface, is is possible to adjust if Warning, Error or Informational
  texts should be printed out. In addition, now every text can be catched
  by the event receiver.

- The engine is now capable of loading .PCX files. Only a few PCX formats
  are supported currently, but at least the common used formats
  of most textures of the quake 2 models. Thanks go to Dean P. Macri who
  sent in the code for the new PCXLoader!

- A new Scene node is available, which simply does nothing. It is useful for doing
  advanced transformations or for structuring the scene graph.

- The ISceneManager::addOctTreeSceneNode() now takes AnimatedMeshes as parameter.
  If this new method is called, the first frame in the animated mesh is taken as
  mesh to construct the octree. This means that you won't have to write
  addOctTreeSceneNode(yourMesh->getMesh(0)) anymore, but can use
  addOctTreeSceneNode(yourMesh), which is a little bit more intuitive.

- The Driver type enumeration have been adapted to the Irrlicht
  naming conventions. For example instead of writing DT_OPENGL, now write
  EDT_OPENGL.

- The ITexture interface has two new methods for getting the size of the
  texture: ITexture::getSize() and ITexture::getOriginalSize(). This replaces
  the old getDimension()-method and allows to disable bugs which are generated
  by the automatic scaling to optimal sizes of textures.

- There are some new keycodes available: KEY_COMMA, KEY_PLUS, KEY_MINUS, KEY_PERIOD.

- There are now 3 lightmap Material types: EMT_LIGHTMAP, EMT_LIGHTMAP_M2 and
  EMT_LIGHTMAP_M4, which are making the lightmaps 2 or 4 times brighter. If you used
  the Material EMT_LIGHTMAP in your code, you should replace it now with
  EMT_LIGHTMAP_M4.

- The transformation enumeration names have been adapted to the irrlicht
  naming conventions. For example instead of writing TS_VIEW, now write
  ETS_VIEW.

- Video driver feature enumeration names have been changed from
  EK3DVDF_... to EVDF_...

- The GUIEnvironment now has a new method: getRootGUIElement(). With this it
  is possible now to add external created custom GUI Elements to the gui environment,
  without an existing internal GUI element as parent.

- The setViewPort()-Method of the OpenGL-device now works, too. Nothing stands now
  in the way of creating splitscreen applications using the OpenGL device.
  Oliver Klems sent code for this, I slightly modified it. Thank you!

- Corrected a bug, which made the EMT_REFLECTION_2_LAYER Material disappear on some
  hardware.

- Sirshane sent in a bug fix: It is now possible to make the mouse cursor
  invisible in the Linux version of the engine. Thanx sirshane!

- getFrameNr() of IAnimatedMeshSceneNode is now public.

- Again a small bug in the 3ds file loader was fixed.

- A small bug causing light positions being transformed in the OpenGL
  driver differently compared to D3D. Thanx to Matthias Gall for reporting
  this!

- Typing error fixed: ISceneCollisionMananger::getRayFromScreenCoordiantes renamed to
  getRayFromScreenCoordinates.

- Linux support with multitexturing and mipmap generation has been improved.

- A bug was fixed wich caused the Engine not to run when compiled
  as dynamic library under linux. Thanks to Shane Parker who pointed out
  the problem.

- A bug was fixed in position2d.h in the operator +=, and the list iterator now
  has per and postfix operators. Thanks to Isometric God for spotting this out.

- A bug was fixed in the Metatriangleselector, causing it to detect only collisions
  with the last TriangleSelector in it.

-------------------------------------------------------------------------------------
Changes in version 0.4.1: (18 Sep 2003)

- Input events are now processed faster than repaint and window events. This
  means that input commands now effect things directly, in earlier versions
  there could be a delay when there were low frames per second. Some people
  noticed this when moving with the fps camera in large levels: The camera
  sometimes stopped seconds after the button was released. This is now fixed.

- A Message Box is now available in the GUI Environment. It looks like the
  windows message boxes and supports OK, Cancel, Yes and No buttons, which
  can be combined freely. Also, it shows multiline text and adjusts its size
  based on the amount of text it shows, so it should be very useful for displaying
  (debug) messages during runtime.

- It is now possible to make all windows (message boxes, file open dialogs,
  simple windows) modal.

- IGUIStaticText now supports multiline text via automatic word warp and manual
  line breaking with '\n'. You only need to switch it on with
  yourText->setWordWrap(true);

- Non default MD2 animations are now supported. Which means simply that you can
  enumerate the names of all md2 animations and the AnimatedMeshSceneNode now supports
  a setMD2Animation() with a character string as parameter instead of a constant.

- You do not need an event receiver anymore for sending user events to the active
  camera, this is now done autmaticly. In addition, it is now possible to
  set a new event receiver during runtime of the engine using IrrlichtDevice::
  setEventReceiver().

- It is now possible to disable and enable the input receiver of a camera. This
  is useful for example for removing the users control of the camera. To do this,
  call camera->setInputReceiverEnabled(false);

- The first person shooter camera now supports a keymap: You can define your own
  key mapping to control the camera when you create it with ISceneManager::
  addCameraSceneNodeFPS().

- Thanks to Jon Pry, the engine now also loads compressed TGA texture files. Now only
  8 bit palette using TGAs are missing. :)

- There are methods for converting 3d coordinates in 2d coordinates and the other
  way round. You can find them as two new methods of the ISceneCollisionManager:
  getRayFromScreenCoordiantes() and getScreenCoordinatesFrom3DPosition().

- There are now access methods in IGUIWindow for getting pointers to the
  maximize, minimize and close buttons, to be able to remove them for
  example.

- Before starting up the engine, a version check now is performed and a warning is
  written, if Irrlicht.DLL version and header version of your application do
  not match.

- A bug with the skybox has been fixed: In OpenGL, it was possible to see the
  borders of the skybox. In addition, when a skybox was visible, there were
  errors in the texture coordinates of other meshes. This is all fixed now.

- A bug has been fixed causing the engine to crash when removing gui childs
  which where created inside the .dll but are removed from outside.

- A bug was fixed causing the engine to crash when drawing debug data of
  octtree scene nodes with geometry data with vertices with one texture
  coordiante.

- Multitexturing now works with linux, too. Thanx to Jon Pry again, for showing
  me where the problem was.

- The bug (reported by saigumi) preventing scene nodes attached to a camera
  from moving correctly is now fixed.

- The "Climb-Walls" bug (reported first by Matthias Gall) is fixed. Gravity
  acceleration is now quadratic instead of linear.

- A warning is now printed out, if more vertices are rendererd with one call
  than the hardware supports.

- Other, Minor New/Changed methods in public interfaces:
   * get and setText() in IGUISkin
   * += operators are now available in the string class.
   * setRelativePosition() in IGUIElement
   * enumeration EKEY_CODES renamed to EKEY_CODE
   * getMaximalPrimitiveCount() in IVideoDriver
   * getAnimationCount() in IAnimatedMeshMD2
   * getAnimationName() in IAnimatedMeshMD2

-------------------------------------------------------------------------------------
Changes in version 0.4: (04 Sep 2003)

- Collision detection and reponse based on ellipsoids in now implemented.
  There is a new method available in the ISceneCollisionMananger, which returns
  a collision response point. In addition, a new SceneNodeAnimator is available,
  which causes a scene node, to which it is attached to, not to move through
  walls, to climb stairs and to be affected by gravity. This scene node animator
  can be attached to any scene node. For example adding it to the FPSCamera, it makes
  the user possible to walk through the 3d world as in first person shooters.

- There is now a full featured Particle System included in the engine for
  creating fire, explosions, snow, smoke and so on.
  It is customizeable and extensible. There is a ParticleSystemScene node
  available in the SceneManager and some standard particle emitters and
  affectors are already implemented.

- Realistic water: The engine now features an IWaterSurfaceScene node, which
  animates a static mesh with water waves. In combination with the new
  EMT_REFLECTION or EMT_TRANSPARENT_REFLECTION material type, you can easily
  create realistic animated water surfaces.

- Triangle base picking is now possible using the ISceneCollisionMananager.
  If a collision happened, the intersection point and the triangle causing
  the intersection is returned.

- Stencil shadows are now drawn using the ZFail method by default, but it is
  possible to choose ZPass, if wished. This means that the camera may now move
  inside the shadow volumes and no errors will occur. In addition a stencil
  shadow bug is now fixed: In 0.3 there where no shadows visible in the TechDemo.

- The interface of ISceneNode has changed: There is no more a RelativeTransformation
  and AnimatedRelativeTransformation matrix. They have been replaced by 3 vectors:
  RelativeTranslation, RelativeRotation and RelativeScale, which can be accessed by
  the corresponing get() and set() methods. This simplifies the interface
  a lot. Also, the set/getRelativePosition was renamed to set/getPosition.

- The new IAnimatedMeshMD2 interface now returns start, begin time and
  fps of every MD2 animation type. In this context, IAnimatedMeshSceneNode
  got a new method called setMD2Animation(), which accepts a single constant
  like EMAT_ATTACK, which starts and plays the fitting animation (attack
  animation in this case), simplifying the interface a lot.

- Some scene nodes can now draw debug data like their bounding boxes.
  This feature is switched on for a single node by calling
  ISceneNode::setDebugDataVisible(true). Looks really interesting for
  animated scene nodes like particle systems or animated meshes.

- There is now a IGUIInOutFader avaiable, which is able to fade in or
  out the whole screen or parts of it.

- The new IVideoModeList is a list with all available video modes. It can
  be retrieved with IrrlichtDevice::getVideoModeList(). If you are confused
  now, because you think you have to create an Irrlicht Device with a video
  mode before being able to get the video mode list, let me tell you that
  there is no need to start up an Irrlicht Device with DT_DIRECTX8, DT_OPENGL or
  DT_SOFTWARE: For this (and for lots of other reasons) the null device,
  DT_NULL exists.

- With the new IMeshManipulator interface accessible with
  ISceneManager::getMeshManipulator() it is possible to perform some basic
  operations on meshes: Flipping all surfaces, recalculating all normals,
  scaling the mesh, creating a new texture mapping and so on.

- A new material for creating water surfaces or glass with reflections on it
  is available: EMT_REFLECTION_2_LAYER and EMT_TRANSPARENT_REFLECTION_2_LAYER.
  It has uses a reflection map, and an additional optional texture.
  The transparency of this material is set by the alpha color value in the vertices.

- Another new material is EMT_SOLID_2_LAYER. It is a material with 2 textures,
  blended together with the alpha value of the vertex color. This material is
  currently only available in DirectX.

- Trilinear Filtering is now supported by the engine.
  There is a new option in SMaterial: TrilinearFilter and EMF_TRILINEAR_FILTER.

- The addChild() method of the IAnimatedMeshSceneNode for adding SceneNodes to
  joints of skeletal animated meshes was removed.
  Instead there is now a new method: getMS3DJointNode(). This returns a pointer
  to a child node, wich has the same transformation as the corrsesponding joint.
  In this way it is possible to do more advanced operations with joints and
  attaching scene nodes to joints. Also, the IAnimatedMeshMS3D interface now gives
  access to all joints. In this way, you can easily enumerate all names of all
  joints in the mesh.

- Font and color of every IGUIStaticText can now be set separately, without
  modifying the IGUISkin.

- There is now a ELEMENT_LEFT gui event, which all hovered elements receive when they
  are left.

- All features of the FileOpenDialog are now working.

- Debug informations are now printed out to the console window
  also on the win32 platform.

- FPSCamera now supports setTarget(). Its not precise but working.

- Textures of 3ds files are now loaded from the same directory in which the
  3ds file is. If the texture is not found there, the texture is tried to be
  loaded from the current working directory.

- A small bug in the 3ds file loader has been fixed. There were 3ds files exported
  by anim8or, where the reading of the 3ds file never stopped.

- It is now possible to configure the minimal amount of polygons contained
  in every node in an OctTree via addOctTreeSceneNode().

- There is a new template class in the core namespace: triangle3d. With this,
  it is easy to find intersections between lines and triangles, find out if
  a point is within a triangle and so on.

- A small bug in ISceneManager::addHillPlaneMesh() was fixed: Now the right tile
  amount is created.

- There is a new SceneNode available: IDummyTransformationSceneNode. It exists
  for making it possible to insert matrix transformations anywhere into the
  scene graph.

- Added a new SceneNode animator for deleting Scene nodes automaticly after some
  time. Create it with ISceneManager::createDeleteAnimator().

- The techdemo now is interactive. After a short non-interactive flight over
  the quake 3 level, you are placed as player inside the level, may move around,
  shoot fire balls and take a look at some animated characters which are placed
  on the map.

- I fixed a bug which caused the screen get black when choosing shadows and fullscreen
  on some special 3d adapters.

- I fixed some bugs in the linux port: The timer returned an incorrect time, causing
  wrong animations everywhere and the releasing of keys and mouse buttons was not
  sent as event. In addition, I placed a copy of the zlib.a and jpeglib.a into the
  /lib/Linux directory and changed the Makefiles of the examples and the source
  of the engine for doing this automaticly in the future, so I hope there will be no
  problems with other versions of zlib and jpeglib anymore.

- There are 2 new tutorials: One showing how to do collision detection and
  for special effects.

- Other, Minor New/Changed methods in public interfaces:
  * getVersion() in IrrlichtDevice
  * getLengthSQ() in vector3d
  * getInterpolated() in vector3d
  * getInterpolated() in SColor
  * getAngle() in vector2d
  * getAngleWith() in vector2d
  * getPrimitiveCountDrawed() in IVideoDriver renamed to getPrimitiveCountDrawn()
  * getSceneNodeFromSceenCoordinates() renamed to getSceneNodeFromScreenCoordinates()
  * getMeshType() in IAnimatedMesh
  * getInterpolated() in aabbox
  * setMD2Animation() in IAnimatedMeshSceneNode
  * getFullFileName() in IFileList
  * addShadowVolumeSceneNode() in IAnimatedMeshSceneNode extended with zfail parameter
  * drawStencilShadowVolume() in IVideoDriver extended with zfail parameter
  * getDistanceFromSQ() in vector3d
  * subString() in string
  * findFirst() in string
  * findLast() in string
  * getTriangleSelector() in ISceneNode
  * setTriangleSelector() in ISceneNode
  * draw3DTriangle() in IVideoDriver
  * setShadowColor() in ISceneManager
  * getShadowColor() in ISceneManager
  * addToDeletionQueue() in ISceneManager
  * getSceneNodeFromId() in ISceneManager

-------------------------------------------------------------------------------------
Changes in version 0.3: (18 Jul 2003)

- Linux port: The Irrlicht Engine now compiles and runs on Linux. Currently only
  the OpenGL driver is available. The Software driver would be there too, if
  somebody could tell me a fast way to blit a A1R5G5B5 surface to the screen
  using X.
  All examples do compile and run, but there are some things missing:
   * It is not yet possible to make the mouse cursor invisibe.
   * The timer seems not to return the currect time.
   * Multitexturing does not work correctly on all gfx adapters.

- Ms3D Animations: The engine is now able to play skeletal animations directy
  from Milkshape 3D (.ms3d) files. It is also possible to attach objects to
  parts of the animated mesh. For example a weapon to the left hand of
  the animated model.

- Because the swprintf function in Windows32 does not match the ISO C standard,
  and it does in linux and all other platforms, there is now a define in Irrlicht.h,
  to make the code be the same on all platforms:
  #define swprintf _snwprintf
  This simply means that you need to add a parameter to your swprintf calls if
  you used this function in your win32 irrlicht engine projects. For example instead
  of writing
      wchar_t tmp[255];
      swprint(tmp, "FPS: %d", fps);
  you now write
      wchar_t tmp[255];
      swprint(tmp, 255, "FPS: %d", fps);

- Automatic culling has changed a little bit: It is now done by the SceneManager.
  Scene nodes now only need to return a valid, non transformed bounding box to be
  culled automaticly. It is explaned in the CustomSceneNode Tutorial how this works.

- It is now possible to use the engine easily for 2D graphics: There are now to new
  methods in the IVideoDriver, which create an 1bit alpha channel for textures
  using an color key. The methods are both named makeColorKeyTexture. There is a
  tutorial '2d graphics' which explains how this works.

- The rect template class was removed and replaced by the rectEx class. There
  is now only one rectangle template available, called 'rect' for simplifying
  the interface.

- The texture coordinate bug in Milkshape 3d models with lots of shared vertices
  was fixed.

- Bugfix with GUI environment hovering invisible elements.

- There are two new tutorials: One for 2d graphics, and one for user interface.

- Tutorial changes:
   * All backslashes replaced by slashes in file names in
     all tutorials for linux compatibility.
   * RectEx replaces with rect in 1.HelloWorld
   * Added second parameter to swprintf in 2.Quake3Map
   * Added bounding box creation to 3.CustomSceneNode
   * Added second parameter to swprintf in 4.Movement

- New/Changed methods in public interfaces:
   * getClosestPoint in line3d
   * getMatrixOfMeshPart in IAnimatedMesh
   * removeChild in ISceneNode now returns true or false
   * addChild in IAnimatedMeshSceneNode
   * setParent in ISceneNode

-------------------------------------------------------------------------------------
Changes in version 0.2.5: (22 Jun 2003)

- A new material type is available: EMT_TRANSPARENT_VERTEX_ALPHA, which
  realizes transparency based on the vertex alpha color. It currently is
  only implemented in the DirectX device.

- There is now an ISceneCollisionManager available. Get it with
  getSceneCollisionManager() from the ISceneManager. It currently only implements
  picking, but more is coming soon.

- Automatic Culling based on Bounding Boxes is implemented now. It can be switched on
  or off for every SceneNode seperately using ISceneNode::setAutomaticCulling().
  It is on by default.

- It is now possible to remove loaded textures for freeing memory or reloading them.
  Use IVideoDriver::removeTexture() or removeAllTextures().

- New drawing methods in the IVideoDriver interface:
   * Draw3dLine(), drawing a 3d line.
   * Draw3dBox(), which draws an axis aligned bounding box.
   * Draw2dLine(), currently only supported by the Software device.

- MD2 bugfixes:
   * There was a small bug with texture coordinates.
   * Frames are now correctly interpolated when playing animations.

- Bugfix in the 3ds file format loader: Single objects in the 3ds file with multiple
  materials attached are now loaded correctly.

- list.h renamed to irrlist.h due to compatibility issues.

- Now works with Dev-C++ 5 Beta 8. (4.9.8.0)

- New/Changed methods in public interfaces:
   * 'getInverse' in matrix4.
   * 'transformBox' in matrix4.
   * 'repair' in aabbox.
   * 'intersectsWithLine' in aabbox.
   * 'getVector' in line3d.
   * 'getMiddle' in line3d.
   * 'normalize' method in vector3d and vector2d now returns reference to vector.
   * 'getTransformedBoundingBox' in ISceneNode.
   * 'getChildren' in ISceneNode
   * 'setRotation' in ISceneNode
   * 'addHillPlaneMesh' in ISceneManager now accepts a texture repeat count parameter.


-------------------------------------------------------------------------------------
Changes in version 0.2: (19 May 2003)

- The engine is now able to load .3ds files, with their materials and textures.

- There are some new SceneNodeAnimators: A fly straight animator and a texture animator.

- Texture coordinates can now be set to clamp or wrap mode with
  a flag in the SMaterial struct.

- Skyboxes are implemented.

- Billboards now work 100% correctly.

- The IAnimatedMeshSceneNode is now able to draw shadows of itself. To enable this, just call
  addShadowVolumeSceneNode(). Please note that shadows are currently just experimental,
  there are some bugs, and they only only in Direct3D mode.

- A small bug in the view frustum and the octree fixed.

- The default aspect ratio in all camera scene nodes was changed.

- Some changes and extenstions to the core::matrix4, SViewFrustum, plane3d and
  aabbox were made. The plane3dex was removed, there is now only one plane implementation
  available. Implemented some ideas and suggestions by Mark Jeacocke. Thanx a lot!

- The interface for adding dynamic lights has been enhanced. There are some new methods
  for handling dynamic light in the IVideoDriver interface. For example, it is now possible
  to change the ambient light.

- There is a new parameter in the createDevice() function, which specifies if the
  stencil buffer should be activated. Also, now all parameters have default parameters.

- There is now a timer object to get the current timer. It can be received using
  the getTimer() method from the IrrlichtDevice.

- The first person shooter camera is now able to be moved by external using
  setRelativePosition() and the sceneNodeAnimators. In addition, it now supports
  multiple FPS cameras.

- Mesh format loading extenstions are now possible. To extend the engine with a
  mesh format it currently does not support (e.g. .cob), just implement a
  IMeshLoader interface and add it to the engine calling
  ISceneManager::addExternalMeshLoader().

- It is now possible to extend the Irrlicht Engine easily with new texture file format
  loaders. If there is an image file format the engine does not support (for example
  .gif files) the IImageLoader interface can be implemented to load .gif files
  and added to the engine via IVideoDriver::addExternalSurfaceLoader().

-------------------------------------------------------------------------------------
Changes in version 0.1.5: (03 Apr 2003)

- The zlib and libjpeg are now included in the SDK.

- It is now possible to let the scene manager generate a hilly plane on the fly.

- The Interface for handling dynamic lights was simplified.

- The OpenGL 2D and 3D device is now full implemented.

- There is now a way to access to root scene node from the scene manager, and so it
  is possible to add external created custom scene nodes to the scene.

- There is a new Camera control scene node available in the engine: First Person Shooter
  Camera Control. Look with mouse movement, move and strafe with the cursor keys.

- The engine now compiles with g++ and the Microsoft compilers, which enables it to
  develop applications for the engine with VisualC++6.0, VisualC++.NET and Dev-C++.

- There is now a ICursorControl available in the engine, which is able to modify the
  mouse cursor: Get/Set the position of the cursor, make it invisible or visible.

- video::Color was renamed to video::SColor to fit the Irrlicht Engine naming conventions
  and for g++ compatibility issues in the Vertices.

-------------------------------------------------------------------------------------
Release notes of version 0.1: (14 Mar 2003)

  This is an alpha version of the SDK. So please note that there are
  features missing in the engine and maybe also some bugs. The following
  list is a complete list of parts of this alpha SDK which do not work
  100% correct. All other parts which can be found in the documentation
  and accessed with the Irrlicht header files work and can already be
  used.

- OpenGL Device
  The OpenGL Device is currently only able to load textures and draw basic
  3D primitives. No 2D functions, complex materials and dynamic light are
  implemented. Please use the DirectX8 or the Software Device instead.
  In the next release (0.2) the OpenGL device will be complete.

- Software Device
  Dynamic lighting, multitexturing, 3d clipping and bilinear filtering are
  not implemented because the Software Device was intented to to only 2d
  functions, the primitive 3d functions are only an addition. Until the
  first non beta release (1.0) of the Engine, some more 3d functionality
  will be added.

- BspTree
  The binary space partition scene node does not work correctly and has
  some bugs in it, which might lead to crashes. Please use the OctTree
  scene node instead. There is nearly no difference between the interface
  of them.

- MeshViewerGUIElement
  The camera control of this element is currently disabled.

- FileOpenDialog
  Not all functions are implemented.

- Render to Texture support
  Is not implemented yet.

- MS3D Skeletal Animation
  A loaded mesh is currently not animated and only drawn static.

- Quake 3 maps
  No support for curved surfaces yet.

- Linux Support
  The engine currently only runs with Windows platforms. A linux version
  will be available somewhere between the versions 0.2 and 0.5, it depends
  on the need of the users.

-------------------------------------------------------------------------------------
