{mosimage}Yes, the time has finally come – a brand new stable version for Ogre gets launched today! Ogre 1.4, or 'Eihort' as we all tend to refer to it, represents the culmination of almost a year's work on new features and enhancements to the Ogre platform. It's been in testing with our early adopters for some time and we now believe it's ready for wider testing, through our usual release candidate process. We encourage all users who have not already tried Eihort via CVS to download the new release and try it out – information on how to port your applications from the previous stable version (Dagon) is available from the Eihort Porting Notes.

As always with our major releases, there are a significant number of new and enhanced features in Eihort, and there is a list attached to the full version of this announcement. We think you'll be pleasantly surprised with what's in there, especially if you haven't been following Eihort's development. Welcome to the future!


Below are listed the most significant changes in the Eihort release
over the previous stable version. This isn't quite everything, please
look at the Eihort Notes for more details, and also for advice on how to upgrade your applications from Dagon to Eihort.

Note: Updated XCode and Code::Blocks projects were not quite ready for the deadline for this release candidate, so if you get issues in these environments, please get advice from the forum or wait until RC2 when they should be complete.

Enhancements since the Dagon branch:

  • SSE/SSE2/SIMD improves performance in several areas
    • Software animation
    • Batch concatenation of affine matrices
    • Shadow volume routines
    • Aligned memory allocator & CPUID detection
  • Shader enhancements
    • Parameter system rewritten and enhanced, particularly improves
      support for GLSL arrays but also allows more optimal parameter binding
      and more efficient memory usage
    • preprocessor_definitions
      option supported in HLSL/GLSL to create variant shaders based on same
      source (Cg already supported this through compile_arguments param)
    • column_major_matrices option in HLSL to alolow you to pack parameters differently
    • 'unified' program definitions allow you to use one program as an alias for others for simpler cross-platform support
    • GLSL 1.2 (GL 2.1) supported allowing non-square matrices
    • GLSL now binds tangent, binormal, blendWeights and blendIndices to extended attributes (see the manual)
    • Added many new auto-bindings including:
      • spotlight_params
      • 'array' versions of light auto-bindings (light_position_object_space_array, light_diffuse_colour_array, etc)
      • Fixed-function surface reflectance passthoughs (surface_ambient_colour, surface_diffuse_colour, etc)
      • texture_size, inverse_texture_size and packed_texture_size
  • Lighting and shadowing
    • You can now integrate texture shadows directly into your primary
      material pipeline, rather than them being rendered as separate shadow receiver passes
    • 'content_type shadow' added to texture unit to auto-bind
      shadow textures into your materials and use them in
      integrated rendering
    • New light iteration parameters to give extra flexibility when
      doing integrated lighting / shadowing – iteration per_n_lights and
      start_light
    • More texture shadow projection options through ShadowCameraSetup subclasses allow improved fidelity on texture shadows:
      • Plane optimal
      • Uniform focused
      • LiSPSM
    • Depth-shadowmapping example, with percentage-closest filtering for antialiased, self-shadowing effects using texture shadows
    • Bounding boxes of objects visible from each camera in the
      last frame are now recorded, which can be used to adjust custom shadow
      camera setups. See SceneManager::getVisibilityABBForCam and
      SceneManager::getShadowCastersAABForLight
    • Customisable Light Finding
      • Now you can more directly influence how OGRE picks lights to use against your renderable objects
      • Default is still 'n nearest' but you can alter that to prioritise certain lights or any other custom reordering
  • Mesh enhancements
    • Triangles in the edge list now grouped by vertex set – use
      MeshUpgrader to take advantage of performance enhancement, old files
      will still load but suffer a load-time reorganisation cost
    • Default placement for tangents is now the tangent semantic
      rather than a texture coord. The latter was used in the past to support
      SM1 shaders, and is still an option, but the default is now the SM2
      friendly version
    • Submeshes can now have optional 'extremity points' stored with them to
      allow submeshes to be sorted with respect to each other in the case of
      transparency.
  • Animation
    • Skeleton::_mergeSkeletonAnimations added to merge animations from multiple skeletons
    • Added option to Skeleton::optimiseAllAnimations which only destroys node
      tracks which have identity keyframes only for all animations.
    • Several runtime and memory footprint optimisations 
  • Math optimisations
    • Added specially optimised functions to dealing with affine matrices, all world / view transforms now have to be affine transforms (they were assumed so before anyway). 
  • Material enhancements
    • mipmap_bias supported on texture_unit
    • texture attribute allows you to specify a desired pixel format separate from the format of the loaded texture
    • depth bias now supports slope-scale biasing as well as fixed biasing
    • serialising
      a material is now simpler, there is no need to call
      addConstantDefinition et al to make sure program params are recorded
      for export
    • quieter logging when including GPU programs which target a rendersystem which is not loaded
    • shader compilation errors now dealt with more gracefully
  • Texture enhancements
    • You can now describe the desired pixel format to be used instead of the original
      image format when loading a texture
    • You can now set the
      preferred bit depth for integer and float pixel formats respectively,
      for example loading 128-bit float textures as 64-bit for performance
  • Vertex Texture support (SM3.0)
  • Shader-based Instancing (SM2.0+)
  • Particle system enhancements
    • Particle System now supports emitted emitters (to create effects such as fireworks more realistically).
    • Particle system renderer now has optional callback when particle(s) being emitted, moved, expired or cleared.
  • ManualObject enhancements
    • ManualObject now allows you to update its contents more efficiently provided the structure does not alter
    • ManualObject can be used to render 2D elements by using an infinite
      AABB and telling it to use identity view and projection matrices
  • Background loading
    • Queue the loading of resources in a background thread
    • Register your own thread or use automatic background queue manager
    • Simple queued notification callbacks in primary thread so user doesn't have to think in a thread-safe manner
    • Advanced users can perform other tasks (like scene graph setup) in a separate thread if they're careful about locking
  • Static Linking official support
    • Build targets for linking everything statically into one executable, including plugins
    • Be aware of LGPL license conditions on derived works, or consider the OGRE Unrestricted License
  • Unicode support on Font and Overlays
  • WindowEventUtilities introduced
    • Allows subscription to window events on auto-created windows
    • Allows access to message pump for externally created windows
  • RenderWindow::getCustomAttribute and related features unified across platforms
  • Build / dependency changes:
    • Image routines replaced – FreeImage + custom DDS codec now used
    • SDL platform removed on Linux
    • PlatformManager removed, all classes now referenced / created direct
    • CEGui 0.5 supported
    • Input removed from core, now using OIS in samples
    • Windows-specific:
      • All dependencies are now statically linked to OgreMain, no dependency DLLs
      • All plugins & rendersystems now use the naming convention _d for debug
      • All library files now found in ogrenew/lib rather than distributed in subfolders
  • Exception changes
    • Ogre::Exception now subclasses from std::exception and implements what()
    • All error codes now result in a separate subclass of
      Ogre::Exception being thrown so you can catch particular types, e.g.
      RenderingAPIException and InvalidParametersException
    • OgreGuard / OgreUnGuard and stack tracing option have been removed