EihortNotes         ChangeLog and porting notes for OGRE 1.4.0 "Eihort"

Welcome to the ChangeLog and porting notes for OGRE 1.4.0 "Eihort"

ChangeLog

  • Added Bitwise::isPO2 to determines whether a number is power-of-two or not.
  • New class AlignedMemory/AlignedAllocator for allocate aligned memory.
  • New class PlatformInformation to detect run-time platform-dependent information.
  • SSE/SIMD optimisation
    • Software vertex skinning.
    • Software vertex morph.
    • Concatenate affine matrices in batches. Note that standard C/C++ implementation of bone's local to world transform concatenation now also supports affine matrices only.
    • Added SSE implementation of triangle face normal and light facing state calculation.
  • New class WindowEventUtilities: Adds ability to subscribe to recieve window events (Move/Resize/Close/Focus change)
    • Fixed Multiple Windows + Using Close ("X") Button to close the proper window
  • Removed Platform Manager
    • Instantiate (and deallocate) previous items yourself now (Timer, ConfigDialog, ErrorDialog)
    • PlatformManager::messagePump is replaced by WindowEventUtilities::messagePump() which updates all registered RenderWindows (automatic for Ogre created Windows) message loops
  • Removed Ogre Core Input System
  • Removal of SDL Platform under Linux
  • Use "WINDOW" for RenderWindow::getCustomAttribute( ) for getting window handle for both Linux and Win32
  • Shader enhancements
    • HLSL program added column_major_matrices and preprocessor_defines parameters.
      • column_major_matrices tell HLSL compiler whether or not matrices packing in column-major format, default to true which according with previous behavior (standard D3D behavior).
      • preprocessor_defines declare macros which can access within the program, i.e. via "#if define(...)", "#ifdef" directives. Multi macros are split by ; (semicolon) or , (comma), and use = (equal mark) to split macro's name and definition part. Note that definition part are optional, if absent, the macro define as 1.
    • Added new program language 'unified'
      • Wrapper program that chooses one 'delegate' program at runtime whilst technique refers to 'unified' program
      • Allows you to use GLSL and HLSL programs in one technique if they do the same thing
      • Could use for choosing between other programs automatically if their iterface & the containing pass is the same, eg HLSL with different targets
    • GLSL array uniforms can now be accessed using the zero-index parameter name, e.g. paramName0. Previously Cg and HLSL behaved like this but GLSL required you to drop the 0 which caused consistency problems. In all languages you can either include or omit the 0, both work.
    • GLSL 1.2 supported (GL 2.1 drivers) allowing non-square matrices
    • GLSL auto-bound arrays now work properly so you can use hardware skinning in GLSL (example provided for Demo_SkeletalAnimation). Our example uses a 3x-sized array of vec4's for compatibility with GLSL 1.1 (GL 2.0) but you can use an array of mat3x4 on GLSL 1.2 (GL 2.1)
    • Memory usage on GpuProgramParameters reduced; parameter lookups are now shared and the parameters are now packed with no wasted space even when there are unused sections of the raw constant index list
    • Optimised the layout of GpuProgramParameters and allowed direct access to the params buffer using _writeRawConstant
    • Optimised the setting of parameters on the render system
    • Added spotlight_params auto-binding with useful precalculated members for doing per-pixel spotlights
    • Added 'array' versions of light auto-bindings (light_position_object_space_array, light_diffuse_colour_array, etc) - useful for single-pass lighting shaders that want to bind many lights in a smaller space in the material script
    • Added surface colour reflectance properties auto-binding (surface_ambient_colour, surface_diffuse_colour, etc) and derived colour values (calculated from the surface colour reflectance property and the light colour) auto-binding (derived_ambient_light_colour, derived_light_diffuse_colour, etc). Allow access to fixed-function surface properties handily.
    • Added texture_size, inverse_texture_size and packed_texture_size auto-binding, so shaders that requires the size of the texture can bind auto (i.e. filtering texture manually should be requires the texture size in the shader).
  • Image internal data format has altered structure slightly when there are custom mipmaps embedded in a cubemap (all the mips for each face are grouped together now instead of all faces at one mip level). See the Image API docs - the internal format was never documented before anyway (it is now) and you were always better to use getPixelBox anyway so I doubt this will affect anyone.
  • Triangles in the edge list now grouping by vertex set. The mesh file format has been changed to support this requirement. Old format can still load directly, but has performance penalty on loading if edge list embed in mesh file. You had better upgrade mesh file with MeshUpgrader tool ASAP.
  • LogListener are no longer added to the LogManager. Instead, addListener and removeListener have been added to Ogre::Log. So, you will need to get the log you wish to add a listener to, messages will no longer be broadcast for all created logs to listeners. Also, the interface is slightly different then previously, please check Ogre::LogListener (in OgreLog.h) class for details
  • Added specially optimised functions to dealing with affine matrix (check Matrix4::isAffine for the detail of affine matrix). Internally engine now explicit requires all world / view transform matrices are affine matrix. Frustum::setCustomViewMatrix now accept affine matrix only (assertion in debug build). For the user that implemented their own Renderables, overriden of Renderable::getWorldTransforms must be returns affine matrix / matrices.
  • Vertex programs and VES_TANGENT and VES_BINORMAL
    • GL ARB programs automatically bind attribs 14 / 15 to support this
    • GLSL automatically binds based on defined attribute names; e.g.
      • attribute vec3 tangent;
      • attribute vec3 binormal;
      • attribute vec4 blendWeights;
      • attribute vec4 blendIndices;
    • Example Cg shaders changed to use TANGENT0 instead of TEXCOORD1 now
    • Meshes upgraded
    • Mesh::suggestTangentVectorBuildParams and Mesh::buildTangentVectors now take a target semantic, so you can choose whether to use texture coords or real tangent bindings
    • If you want to convert existing meshes which have embedded 3D texture coords for tangents, use OgreMeshUprade -t -i my.mesh , then choose to reorganise the vertex data, and remove the last texture coord set. The '-t' will rebuild tangents into a VES_TANGENT binding instead. Remember to change your shaders!
    • Remember, DirectX 8.1-class hardware (GeForce3/4Ti) can't use VES_TANGENT bindings, so if you target that hardware you will have to stick to binding tangents to VES_TEXTURE_COORDINATES.
  • ABI version change - Using -release instead of -version-info, better when dealing with stable/unstable branches, more automated, and less prone to errors. This should clear up the fact that app's need to relink to OgreMain for each release if they want to update
  • Mipmap enhancements
    • Mipmaps choice can now be biased upwards or downwards using the mipmap_bias directive in material scripts
  • AxisAlignedBox can now be infinite as well as null, meaning it is always visible
  • ManualObject can be used to render 2D elements by using an infinite AABB and telling it to use identity view and projection matrices
  • Removed RenderTarget::setDebugText and getDebugtext. ALl it did was store a string, so if you need that functionality, just hold your own local string.
  • Skeleton::_mergeSkeletonAnimations added to merge animations from multi-skeletons 'physically', and helper function Skeleton::_buildMapBoneByHandle and ~np~Skeleton::_buildMapBoneByName~/np~ added to support mapping bone between skeletons for merge.
  • MovableObject::Listener added so you can use MovableObject::setListener to get callbacks when object being rendering, finding for lights, and more.
  • Customable light finding support added.
    • Lights affecting the frustum now find and cached during rendering the scene, advanced method SceneManager::_getLightsAffectingFrustum added to supports implementing customise light finding algorithm.
    • SceneManager::_populateLightList now use cached lights that affecting the frustum instead of all lights in the scene.
    • SceneNode::findLights now requires a light list parameter to store results instead of returns its local light list.
    • MovableObject::queryLights added to supports implementing Renderable::getLights. You can also use MovableObject::Listener to implement your ower light finding if need.
  • Particle System
    • 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 now allows you to update its contents more efficiently provided the structure does not alter
  • Texture enahncements
    • Texture, TextureManager and TextureUnitState now allow you to describe the desired pixel format to be used instead of the original image format when loading a texture. Related functions: Texture::setFormat, TextureUnitState::setDesiredFormat, TextureManager::load and TextureManager::loadImage.
    • Texture and TextureManager now allow you to set the preferred bit depth for integer and float pixel formats respectively. Related functions: Texture::setDesiredIntegerBitDepth, Texture::setDesiredFloatBitDepth, TextureManager::setPreferredIntegerBitDepth and TextureManager::setPreferredFloatBitDepth, etc.
    • The texture attribute in material script now allows an option pixel format parameter to specify pixel format of texture to create.
  • Viewports can now have their own visiblity masks, making it easier to change the mask per view of the scene without listeners
  • Threading enhancements
    • Threading now officially supported for loading & initialising resources in the background
  • Enhanced lighting and shadowing
    • You can now integrate texture shadows into your primary material pipeline, saving passes (SHADOWTYPE_TEXTURE_ADDITIVE_INTEGRATED, SHADOWTYPE_TEXTURE_MODULATIVE_INTEGRATED)
    • 'content_type shadow' added to texture unit to auto-bind shadow textures into your materials and use them in normal rendering
    • More texture shadow projection options through ShadowCameraSetup subclasses:
      • 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
  • Added option to Skeleton::optimiseAllAnimations allows preserving all node tracks with identity keyframes only, and is now only destroys node tracks which have identity keyframes only for all animations.
  • Depth biasing:
    • Slope scale bias now available as well as constant bias (for hardware that supports it)
    • Biasing is now floating point for finer adjustment
  • Animation:
    • Animation is now collect keyframe time from tracks and build up lookup table, which used for fast keyframe searching.
    • NodeAnimationTrack now allocate memory for spline interpolation on demand, saved a little memory footprint.
  • Exception changes
    • Ogre::Exception now sbuclasses 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
  • Mesh enhancements
    • 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. For some meshes with transparent materials (partial transparency) this can be useful. You can either specify these or generate them automatically with the XML converter.
  • Added TagPoint::setInheritParentEntityOrientation and TagPoint::setInheritParentEntityScale allows TagPoint whether or not inherits orientation and scaling factors from it's parent entity.
  • Static Linking support. See Statically Linking Ogre
  • Added TextureManager::isHardwareFilteringSupported to detecting whether the render system has hardware filtering supported for the texture format requested with the given usage options. Mainly useful for detecting floating-point texture filtering supports.

Porting notes

  • Vector2, Vector3, Vector4, Quaternion and ColourValue - 'val' is no longer available due to ANSI compliance changes (anonymous structs). Instead, use
    • 'ptr()' method to access a pointer to the elements, ie obj.ptr() instead of obj.val
    • regular operator[] to access individual elements by index, ie obji instead of obj.vali
  • Quaternion getYaw, getPitch and getRoll now return a more intuitive result by default ie the projection of local axes onto the plane required to get the absolute angle, rather than the shortest internal rotations required to recreate the quaternion's orientation. You can pass 'false' to the methods to return to the previous behaviour.
  • RenderTarget::setDebugText and getDebugtext no longer exist. All it did was store a string, so if you need that functionality, just hold your own local string - the ExampleFrameListener does this in mDebugText.
  • Renderable::useIdentityProjection and Renderable::useIdentityView removed
    • When extending Renderable, do not override useIdentityProjection or useIdentityView to implement 2D rendering. Instead, initialise mUseIdentityProjection and mUseIdentityView in your constructors
    • Replace calls to useIdentityProjection with getUseIdentityProjection and useIdentityView with getUseIdentityView
  • Resource changes
    • ResourceGroupListener::scriptParseEnded now also includes the name of the script in the callback, you will need to change your listener signature.
    • Texture::loadImage or Texture::loadRawData should not be called inside a ManualResourceLoader anymore. Use the internal Texture::_loadImages instead. The reason is that the former methods are designed for external use and check statuses / threadsafety properly now, whilst manual loaders are called inside existing Resource::load() call which already does this.
  • Light finding changes
    • SceneNode::findLights now requires a light list parameter to store results in instead of returning its local light list.
    • SceneNode::findLights, SceneManager::_populateLightList and Renderable derived classes in the engine core now look at a pre-calculated list of lights that could be affecting the frutum, rather than re-querying the entire light pool every time
    • Implementors of custom Renderable instances should now consider implementing their getLights() method in terms of the MovableObject::queryLights method rather than SceneNode::findLights.
  • Texture changes
    • TextureManager::load, TextureManager::loadImage now have extra parameter desiredFormat allow describing desired pixel format for create the texture, it's default to PF_UNKNOWN, which means use original input format.
    • TextureManager::enable32BitTextures and TextureManager::isEnable32BitTextures was deprecated and replaced with TextureManager::setPreferredIntegerBitDepth and TextureManager::getPreferredIntegerBitDepth. There also added new method TextureManager::setPreferredFloatBitDepth and TextureManager::getPreferredFloatBitDepth allow describing preferred float pixel format bit depth.
    • Texture::enable32Bit was deprecated, for now should use Texture::setDesiredIntegerBitDepth instead.
    • Texture::setFormat behavior changed, in previous version, sets to PF_A8 will treat PF_L8 input format as PF_A8. This function now sets the desried pixel format, which means the internal resource will create with this format instead of original input format (will adjusts to hardware requirements). For treat PF_L8 as PF_A8, you need to call Texture::setTreatLuminanceAsAlpha explicitly.
    • TextureUnitState::setTexture default parameters mipmaps and isAlpha has been removed, for now you need use TextureUnitState::setNumMipmaps and TextureUnitState::setIsAlpha instead.
  • Shadow Texture Changes
    • You can no longer rely on the naming of shadow textures. To access one, call SceneManager::getShadowTexture instead of trying to access it by name.
    • Settings for shadow textures (size, format) are now held in a list so different settings can be used for each. Therefore getShadowTextureSize and getShadowTexturePixelFormat have been removed in favour of iterators over the shadow texture configuration. The equivalent 'set' methods just change the settings for all textures, although you can set the configuration per texture if you need to.
    • By default now, casters are rendered into the shadow texture using their back faces only. This has benefits when using depth shadow mapping, and has no effect usually on other types, but it can be turned off by calling sceneManager->setShadowCasterRenderBackFaces(false) if you want to revert to the previous behaviour.
  • Skeleton changes
    • Skeleton::optimiseAllAnimations is now only destroys node track which have identity keyframes only for all animations.
    • ANIMBLEND_AVERAGE now only rebalances animation weights when the cumulative weight exceeds 1.0f. Therefore the only difference between ANIMBLEND_CUMULATIVE and ANIMBLEND_AVERAGE is now when you have total animation weights above this value, when all weights will be renormalised to sum to 1.0f. This means you can have weightings under 1.0f in average blending mode which is more convenient.
  • Camera changes
    • The ray from getCameraToViewportRay now originates at the camera near plane rather than the camera position. For picking this is a little more realistic since it will only pick things you can actually see if there are objects behind the near plane
  • SceneManager changes
    • _findVisibleObjects has changed signature, be sure to update your custom SceneManager classes that override this method. It passes a new member, 'visibleBounds' which if non-null must be updated with the bounds of all objects that are found to be visible in the implementation. SceneNode::_findVisibleObjects has changed signature for the same reason.
    • OctreeSceneManager no longer supports custom 'CullCamera' option - use the standard Camera::setCullingFrustum method instead
  • Pass changes
    • Pass::setDepthBias now supports 2 parameters, constant and slope-scale biasing. Existing calls should compile without issue since they will use the constant bias value and no slope-scale bias.
    • Pass::setDepthBias parameters are now floating point for greater flexibility
    • Pass::getDepthBias has been replaced by Pass::getDepthBiasConstant and Pass::getDepthBiasSlopeScale
  • Animation changes
    • AnimationTrack::getKeyFramesAtTime, AnimationTrack::getInterpolatedKeyFrame, etc now accept TimeIndex instead of Real for time position. Note that because TimeIndex can be constructed from Real implicitly, there is (almost) no difference to Dagon.
  • RenderWindow changes
    • RenderWindow::getCustomAttribute now uses WINDOW instead of HWND and GLXWINDOW on all platforms to retrieve the platform specific window identifier.
  • Media changes
    • StdQuad_vp is now 'unified' (see unified high-level programs feature) and uses GLSL on GL by default, Cg version is called StdQuad_Cg_vp. You should change your Cg-specific passes which use it to use the new name.
  • GpuProgramParameters changes
    • GpuProgramParameters::ConstantDefinition no longer exists. You no longer need to use addConstantDefinition when registering a parameter that you'd like to be serialised back to a script later.
    • If you need to access named parameter information, there is now GpuConstantDefinition which replaces the above and is automatically populated by all high-level programs. Information includes the array size, element size and data type
    • getRealConstantEntry and getIntConstantEntry don't exist anymore. This is because all the params are packed into a raw buffer now. To get a buffer index, use getConstantDefinition(paramname) for named parameters or _getFloat/IntConstantPhysicalIndex for indexed parameters and use the physical index in a call to getFloatBuffer or getIntBuffer. You can read or write float values direct.
    • GLSL now packs parameter data tightly, therefore a 'vec3' will only take 3 floats now, it won't be padded to 4 like all other languages do (this allows us to pass arrays of vec/vec2/vec3 etc to GLSL much faster than before).
    • If you've been appending '0' to the names of array parameters to set them in bulk, you can remove this now. Both 'paramName' and 'paramName0' will work fine
    • You can only individually address elements of a param array (except 0) through the name if the array is no larger than 16 elements. Ogre does not populate name lookups for larger arrays due to size issues. You can easily fill the entire array at once using just 'paramName', or get a pointer to the buffer via getFloatPointer and index the pointer to jump to a specific point, there's no need to use separate names.
    • Only single-dimension uniform arrays are supported in shaders. If you wanted to do 'uniform float4 something22', use 'uniform float4 something 4' instead and address it using a single dimension. Internally the shader would do that anyway. It's important to note that whilst this isn't a specific change (we never supported multidimensional uniform arrays), Ogre may have silently let this pass in previous versions. In Eihort it will potentially cause more problems so avoid.
  • Replacement of Ogre Input with OIS
    • The Ogre Input code has been removed from Eihort and replaced with OIS, an open-source cross-platform input abstraction layer. You can either visit the Sourceforge OIS project page, or look through the Ogre demo source code for information on how to use OIS with your application that previously depended on the Ogre Input code. Practical Application also contains example skeleton code for using OIS with Eihort.
  • Removal of PlatformManager with WindowEventUtilities
    • If you are driving your own main loop and calling renderOneFrame() instead of startRendering(), previously you needed to invoke the window system's message pump using PlatformManager::messagePump(window). In Eihort, you need instead to invoke WindowEventUtilites::messagePump() (in OgreWindowEventUtilites.h). See the Practical Application Wiki articles for an example of how to use this.
  • Windows Build Organisation
    • All libraries are now built into the 'lib' folder underneath the root build folder. You should repoint your linker to this folder rather than OgreMain/lib/$(ConfigurationName)
    • All debug binaries and library files now have a '_d' suffix, including plugins. You will need to adjust your plugin loading routines to take this into account
    • All libraries now have extra build targets 'DebugStaticLib' and 'ReleaseStaticLib' for building staticly linked versions. The libraries produced have 'Static' appended to them e.g. OgreMainStatic.lib or OgreMainStatic_d.lib. See Statically Linking Ogre.
  • RenderSystem changes
    • mWorldMatrices has been removed from RenderSystem, customise render system should override RenderSystem::_setWorldMatrices to receive world matrix array if required.
  • MSVC2005 users You MUST have the Service Pack 1 (SP1) installed for MSVC2005 if you use the prebuilt SDK, or your programs will compile and link, but not run. If you are getting an error message before your application can even start into the call stack that says "The application failed to initialize properly", this is almost certainly the problem. Note that this service pack is different than the ones for Windows XP (which you probably already have unless you've been living under a rock or just reinstalled Windows from an old CD). Microsoft released this service pack December 2006, so unless you've been vigilant in keeping your Microsoft products up to date, you'll need to download and install the SP1 before you get started with Ogre. The SP1 can be found free from Microsoft's MSDN.
  • Font changes
    • Font::StrBBox method has been removed, it was misleading anyway since Font can't know an actual size without context. Use getGlyphInfo instead to calculate any metrics you need.
  • Logging changes
    • LogListener are no longer added to the LogManager. Instead, addListener and removeListener have been added to Ogre::Log. So, you will need to get the log you wish to add a listener to (use getDefaultLog for the main one), messages will no longer be broadcast for all created logs to listeners. Also, the interface is slightly different then previously, please check Ogre::LogListener (in OgreLog.h) class for details
  • Archive changes
    • The 'list' and 'find' methods and derivatives now have an optional 'dirs' parameter, which if set to true lists or finds directories instead of files.

Annotated roadmap

  • SSE/SSE2/SIMD optimisations (Owner: Genva)
    • CPU detection [done]
    • Aligned memory allocator [done]
    • Software animation routines:
      • Software vertex skinning [done]
      • Software vertex morph [done]
      • Batch concatenate affine matrices [done]
    • Shadow volume generate routines:
      • Triangles face normal calculation [done]
      • Triangles light facing state calculation [done]
      • Software vertices extruding [done]
  • Unicode support [done]
  • Improve background loading options (Owner: Sinbad) [In progress]
    • Finalise threading & locking strategies [done]
      • boost::thread, uses relatively fast critical sections rather than kernel mutexes. Discarded spin-lock / interop approaches because they are architecture specific, low-level (errors easier to make) and sometimes unpredictable performance. Performance will be maintained by being careful about lock strategies.
      • No generalised thread safety of all objects since locking is not free - use careful strategies to achieve parallism without having to guard everything
      • SharedPtr must be thread safe but try to minimise copying
      • One background loading thread, one rendering (main) thread - user interaction with objects is assumed to be in main thread except specifically identified patterns
      • Use lock-free early-out conditions wherever possible; especially useful with read-only atomic state flags
      • Make locks specific to usage category to allow parallism of different usages which are safe to combine
    • Queue background operation callback notifications to main thread to simplify use [done]
    • Operations that should be possible in the background:
      • Loading of pre-existing unloaded resources (in groups) in background [done]
      • Initialise resource groups / parse scripts (note: creation of resources) [in progress]
      • Creation / destruction of scene object instances
      • Manipulation of the scene graph - however locking will be limited to one top-level scene lock (taken out by SceneManager on _findVisibleObjects), to avoid excessive detail locking. Therefore parallism is limited to times when SceneManager is not examining the scene at all. This reduces the parallelism during periods of manipulating the scene graph (rare, and should be at pinch points anyway) in favour of reducing the number of locks needing to be taken out during regular rendering (which is far more common).[done]
  • OGRE Unrestricted licensing option
    • Replace DevIL (Owner: Sinbad) [done]
      • Use FreeImage for most image loading [done]
      • Write custom DDS codec:
        • Cube maps [done]
        • Volume textures [done]
        • Custom mipmaps (for 2D, 3D and cube maps) [done]
        • Compressed DXT1/2/3/4/5 (for 2D, 3D and cube maps) [done]
        • Decompress DXT1/2/3/4/5 (for 2D, 3D and cube maps) [done]
    • Rewrite contributions for which we didn't get license agreement responses:
      • [ 1104900 ] Custom debug log listeners (Owner: pjcast) [done]
    • Finalise Unrestricted License text
  • Official 3DSMax support (Owner: Sinbad)
  • SM3.0-specific features
    • Vertex textures (Owner: Sinbad) [done]
    • Hardware instancing (Owner: Crashy/tuan, SoC) [in progress]
  • OIS Integration into Example Application Framework (Owner: Pjcast) [Done]
    • Add basic OIS JoyStick use in ExampleFrameListener.h (Owner: Pjcast)
  • Drop PlatformManager plugin, statically link timer & config dialog for each platform (input will be gone)
    • Win32 & Linux (Owner: pjcast) [Done]
    • OSX
  • Unify RenderWindow::getCustomAttribute for Window handles (ie, instead of "GLXWINDOW" or "HWND", just ask for "WINDOW") (Owner: pjcast) [Done]
  • Google Summer of Code project outcomes (TBD)
  • Content creation supports (Owner: Genva)
    • Embed bones hierarchy and initial pose into mesh: allows two version of binding pose, one embed in mesh file and used to transform vertex from model space to bone space; another one keep in skeleton file as previous, used to make animation work. [done but abandoned - since tests show harm performance a lot of in the case of sharing skeleton instances]
    • Tools for merge / split skeleton files [in progress]
    • Skeleton animation optimisation better supports accumulate animation blending [done]
    • Add option to XMLConverter allow preserving all identity node tracks.
  • Material system enhancements
    • Select technique / gpu-program context-sensitive (fog setting, max bones per vertex, etc)
    • HLSL supports more compile options (Owner: Genva) [done]
  • Texture enhancements (Owner: Genva) [done]
    • Option to load texture with desired pixel format instead of original format. [done]
    • Allow describing preferred bit depth for integer and float pixel format respectively in Texture and TextureManager. [done]
    • Support scripting desired pixel format in TUS. [done]
  • Mesh changes
    • Use VES_TANGENT by default for tangents (better GL shader binding support required) [done]
  • Material system Enhancements
    • Technique, Pass, and texture unit enable/disable
    • Mipmap LOD biasing on TextureUnitState (http://www.ogre3d.org/phpBB2/viewtopic.php?p=109026) [done]
    • Materials that have techniques using gpu programs that fail to compile/link use next available technique or fall back to fixed pipeline rendering. Error messages are logged but exception is not raised which could shut down the renderer. [done]
    • make material scripts reloadable without having to unload the materials
    • add methods to manipulate order of techniques, passes, texture unit states
  • GLSL bug fixes
    • Support VES_TANGENT and VES_BINORMAL bindings properly [done]
      • Skeletal Animation support (hardware skinning)
    • support for uniform arrays & hardware skinning[done]
  • Material Script Compiler
    • enhance compiler so that it can accept more flexible text source layout [on hold: performance and memory problems]
      • ie pass (texture_unit decal { texture "my texture.jpg" }}
      • allow names (includes texture file names) to have spaces - names with spaces have to surrounded with double quotes
  • Configurable light finding (Owner: Genva)
    • Cache lights affecting the frustum in the scene manager. [done]
    • Lights will cache by moveable object instead of by scene node. [done]
    • Add listener to movable object allow callback notify to user to customise light finding. [done]
    • Light finding/caching optimisation: [done]
      • SceneManager tracking all lights that affecting the frustum, if changes detected then increase an internal lights dirty counter.
      • MovableObject has a local lights dirty counter, and re-populate light list only if it's difference with SceneManager's.
      • MovableObject will sets local lights dirty counter to invalid value to force light list re-populate next time, if:

It's being attach/detach from SceneNode.
The SceneNode it's attached to has been moved (suggest: if possible, only move outside the range that affect lights finding/sorting will take into account).

  • Restructure messagePump/Event Procs & add ability to subscribe to window events (Resize/Move/Close/etc) (Owner: Pjcast) [Done]
  • Better lighting and shadowing options (Owner: Sinbad)
    • Integrate shadow textures into custom material sequences & algorithms instead of just auto-rendering [done]
    • Passes to iterate per 'n' lights [done]
    • Passes to have 'light start' offset [done]
    • Incorporate SoC texture shadowing
      • ShadowCameraSetup and PlaneOptimalShadowCameraSetup [done]
      • Depth shadowmaps [In progress]
      • LiSPSM support [In progress]
  • Separate & generalise concept of debug rendering from isVisible on Camera etc

Eihort Dependencies

  • New Dependencies
    • OIS 1.0
    • FreeImage 3.9 is strongly suggested (required for VC8 and gcc 4.1+), 3.8 may work on other platforms/compilers
    • CEGui has been updated to 0.5.x
  • Removed
    • SDL is no longer used under Linux
    • DevIL