Version 5.1

Release Notes


General Notes


Core Library


Forest Library

1. Billboard system completely revamped. Now batches billboard renders much more efficiently. Draw call count now equal to the number of base trees with billboards in a given forest (e.g. if a forest has eight base trees with billboards, the entire billboard population will now be rendered in eight draw calls total and is independent of the number of cells in the frustum).

2. SPEEDTREE_HEAP_FRIENDLY_MODE added. Primarily for use on consoles, this mode will trade some of the SDK's flexibility for far fewer (95+%) heap allocations and better general memory management. It is recommended that this mode not be used until your initial SDK integration is complete and you are familiar with the SDK.

3. CForest::EndInitialPopulation() function added and must be called after the forest instances have been set for the first time. Population methods.

4. SForestCullResults structure changed to facilitate changes to the billboard system. Details on the new member variables and functions.

5. SForestCullResults::Reserve(), STerrainCullResults::Reserve(), SGrassCullResults::Reserve() all added to prevent render-time dynamic allocations during culling. These can be used in and out of SPEEDTREE_HEAP_FRIENDLY_MODE. More on the hints and reserves system.

6. CInstance size was reduced from 52 bytes to 36 bytes, a 30% reduction (very helpful when instance counts approach the hundreds of thousands).

7. CInstance::GetPosAndScale() added as a small optimization during constant uploads in the render loop.

8. CForest::RegisterTree()/UnregisterTree() are no longer virtual and therefore not overridden in CForestRI. CForestRI::RegisterTree() would call both CForest::RegisterTree() and initialize the tree's graphics. Call CForest::RegisterTree() and the new function CForestRI::InitTreeGraphics() to accomplish the same thing. This change was made to give more control over when the tree graphics were initialized. More on initializing tree graphics.

9. CForest, CGrass, and CTerrain hint systems synchronized to use the same hint names and internal member variables (mostly HINT_MAX_NUM_VISIBLE_CELLS and m_nHintMaxNumVisibleCells).

10. CTerrain class now uses far fewer heap allocations in and out of SPEEDTREE_HEAP_FRIENDLY_MODE. It also provides correct values for DX9 DrawIndexedPrimitive() calls.


Render Interface Library

1. Under DirectX 9, OpenGL, Xbox 360, and PlayStation 3, effects (HLSL FX or CgFX) files are no longer used. Instead, separate vertex and pixel shaders are used. This helps general performance and bypasses some Cg performance issues on the Windows/OpenGL platform, yielding an average of 75% reduction in draw times there. DirectX 10 still uses Effects files.

2. Reference vertex formats were heavily compressed for tree-related geometry types. Some additional decompression instructions were added to their respective vertex shaders, but overall the shaders are slightly shorter than their 5.0 counterparts.

3. Texture binding in CForestRI::UploadMaterial() now prevents redundant texture binds. Impacted performance on PCs, but console performance remained unaffected.

4. PlayStation 3 support added EGeometryProcessingType processing flags to CGeometry::BindVertexBuffer(), ::RenderIndexed(), and ::RenderArrays() to facilitate optional SPU-based geometry processing. Note that this feature is in a beta state.

5. 16-bit index buffers now used everywhere possible. 32-bit now used only with tree models complex or detailed enough to require them.

6. SPEEDTREE_WORLD_TRANSLATE now #defined by default in ForestRI.h.

7. ECullType enumeration moved into Core.h now that the SMaterial definition houses a cull flag.

8. Support for all depth test modes added via EDepthTestFunc and CRenderStateRI::SetDepthTesting().

9. Unused functions CTextureRI::LoadSpecularLookup() and CTextureRI::LoadCubeNormalizer() removed.

10. Due to revamped billboard system, CGeometryBufferRI class now has much improved support for dynamic buffers; constructor now takes dynamic VB/IB flags.

11. CGeometryBufferRI::ReplaceVertices()/ReplaceIndices() functions replaced with ::OverwriteVertices/OverwriteIndices(), more general and better-performing functions.

12. CGeometryBufferRI::RenderIndexed() now takes DX9-like parameters.

13. CGeometryBufferRI::Reserve() added to help reduce heap fragmentation.

14. CTreeRI now houses some parts of the billboard system via new functions CTreeRI::InitBillboardSystem() and the GetBillboard*() group of functions.

15. CForestRI::GetVertexBufferStats() will return amount of vertex and index memory used by the tree and billboard geometry in SDK. Does not include terrain, grass, or sky, which are auxiliary rendering systems.

16. SForestCullResultsRI structure added which derives from SForestCullResults. This was necessary as part of the new billboard system stores some information per view, which is best housed in this structure.

17. Render statistics, queried via CForestRI::GetRenderStats(), were incomplete and inaccurate for some scenes. Corrected.

18. Sky rendering system now includes more dramatic time of day changes. Star effects also added.


Reference Application

1. Users can now successfully #ifdef out the auxiliary rendering systems using the #defines at the top of Application.h:

2. Reference vertex formats were heavily compressed for tree-related geometry types. Some additional decompression instructions were added to their respective vertex shaders, but overall the shaders are slightly shorter than their 5.0 counterparts.

3. Complete overhaul of forest population system to accommodate SPEEDTREE_HEAP_FRIENDLY_MODE. New population utility class CPopulate resides in Populate.h/cpp.

4. Several hints are passed into the SDK in order for SPEEDTREE_HEAP_FRIENDLY_MODE to work most effectively. ::Reserve() calls, too. The calls are made from CApplication::ManageMemoryReserves(), CApplication::InitGraphics(), CApplication::InitGrass(), and CApplication::InitTerrain(). More on the hints and reserves system.