Welcome to the ChangeLog and porting notes for OGRE 2.0.0 "Tindalos" - work in progress
Table of contents
- Updates — IMPORTANT 2014/12/06
- Porting notes
- Annotated roadmap
- Missing stuff that needs to be designed for 2.x:
- 2.0 - Cache misses and ground base
- 2.1b - Features back
- 2.3 - Rendering features
- 2.4 - Flexibility, tools and integration
- Talks about it
Original plan for 2.0 is ready and currently available as branch 2.0 from the repository; labelled "CTP" (Community Technology Preview). We never managed to package it as a downloadable version; but it's quite useful and stable.
It's the most similar version to 1.x but with a new, more powerful Compositor, and much faster Frustum culling and Scene node updates.
After discussion with the rest of the team, what belongs here to "Ogre 2.1" is now referred as "Ogre 2.0 Final"; which is a deep refactor in API usage:
- It removes support for D3D9 (See http://www.yosoygames.com.ar/wp/2014/04/dx9-may-be-dropped-in-ogre-2-0-final/)
- Refactored how materials are handled. (See http://www.yosoygames.com.ar/wp/2014/05/a-glimpse-of-whats-comming-to-ogre-2-0-final/)
- New material system, much friendlier and easier to use.
For updates on progress follow my board on [https://trello.com/b/59pirbgD/ogre-2-0-final/|Trello]. It is much easier to maintain than a Wiki and is up to date. JIRA is nice but it's better for tracking bugs, it isn't quick for keep track of progress. The trello board contains only my personal tasks required to bring Ogre 2.0 Final to completion.
This page will be kept as is as history record.
Matías (aka. dark_sylinc)
- Not started
- None yet
- SceneManager redesign
- Very large world support (deal with precision issues at large coordinates)
- Support for rendering a single scene using multiple SceneManagers
- Significant decoupling of SM roles & responsibilities
- SceneNode optional, can integrate objects directly with external state system (Ogre == View in MVC)
- Asynchronous updates, support multithreading where Model is updated at different rate to View
- Construct Camera & Light via MovableObjectFactory instances
After much consideration, it appears that it would be best to follow Blender's strategy towards their redesign, where they released several alpha/unstable versions with official numbering (the 2.5x branch) until around 2.53 it became stable enough & with enough features to become production ready.
Their redesign was done rather in incremental steps than complete write from scratch.
Each version down below will lack some features (since they'll become incompatible) but it should be significally faster/stabler/with more features than 1.x
- Design idiom (material syntax & code interface) for binding shaders using constant buffers for GL & D3D11 instead of constant registers
- Design Compute Shaders interface (must work within Compositor manager for integrationg with rendering pipeline, and outside of it for regular GPGPU)
- Resource System replacement. Should be scalable, load in background, easier to work with; and can "define itself" so that exporters and other DCC tools can read the Resource config and ease the importing process of assets into Ogre content.
|Create all SoA counterparts (SoA_Vector3; SoA_Matrix4)||DONE|
|Create small unit tests for SoA math||DONE|
|Implement fsel (conditional move)||DONE|
|Replace Node::mChildren from ChildNodeMap to a sorted vector and use std::lower_bound for search.||DONE (1)|
|No mutables in Node (makes a lot harder to detect race conditions when accessing supposedly read-only data at the same time)||DONE|
|Remove Node::mNeedParentUpdate, Node::mNeedChildUpdate, Node::mCachedTransformOutOfDate except for debug asserts & implement Node::_getDerivedPosition + Node::_getDerivedPositionUpdated||DONE|
|Refactor Node::mInitialPosition, Node::mInitialOrientation, Node::mInitialScale: They're only used on keyframed Nodes (i.e. barely used)||DONE|
|Create flexibility levels (virtual_l0, virtual_l1, virtual_l2). Set Node::get & setPosition to the levels specified in the slides||DONE|
|Disable (temporarily) OctreeSceneManager & co. Create a null HighLevelCull that will keep all nodes in one Chunk (grouped per render queue ID, grouped by hierarchy depth for breath first)||DONE|
|** Must handle growing of the Chunks.||DONE|
|** Create MemoryManager that will control how memory is assigned to SoA_Vector3 AND to Nodes (so that Nodes are also contiguous, but not SoA)||DONE|
|** Until CompositorManager is refactored, all nodes will be grouped on the same render queue ID.||DONE|
|** Modify Node::_update to be used only on demand's Node::_getDerivedPositionUpdated||DONE|
|** Replace Node::_update with a function called UpdateAllTransforms() that interates on all nodes chunks. Shouldn't be virtual. Will be called by SceneManager for the moment.||DONE|
|*** Write UpdateAllTransforms() code with parallelization in mind!||DONE|
|Thread Manager (can be delayed to 2.1)||DONE|
|Tool to split submeshes into multiple Entities (useful when a submesh must go in a different render queue)||POSTPONED|
|Render queues go from [0; user defined), no gaps. In order to be more flexible & array friendly. (Remove currently fixed "[10; 108)" range)||POSTPONED|
|Adapt Aabb according to LightType and update if position changes||DONE|
|All entities are unique by ID, not by name. An incrementing counter (i.e. mId = ++mIdCount) is recomended||DONE|
|Entity names may be allowed, but use fixed strings. Not variable-length (2)||DONE|
|Implement compositor manager||DONE|
|Each compositor has multiple input textures (superior method than "input previous"; just defined "texture input 0" avoids duplicating resources as a bonus) as well as global texture names||DONE|
|Each compositor has multiple (named) output targets||DONE|
|Make Frustum::isVisible SoA and parallel||DONE|
|Null LowLevelCuller for the moment||DONE|
|Group all bones by hierarchy for breath first.||DONE|
|Do SoA in all Bones||DONE|
|Integrate OgreAnimation into OgreCore||DONE|
|Integrate OgreAnimation into HW VTF instancing||DONE|
|Integrate OgreAnimation into Entity & SubEntity||POSTPONED|
|Restore LOD and allow switching between LOD techniques||DONE|
(1) Not using sorting, but a better approach.
- See http://www.yosoygames.com.ar/wp/2013/06/ogre-2-0-o1-insertion-removal-and-contiguous-memory-iteration/ Blog post
(2) Interesting reads:
- http://home.comcast.net/~tom_forsyth/blog.wiki.html#[[A%20sprintf%20that%20isn%27t%20as%20ugly]] Fixed length strings
- http://bitsquid.blogspot.com.ar/2011/06/strings-redux.html Hashed strings
Update: Hashed strings ended up being used for unique names. But where names are optional (ie. Entity) an Id is used; the names are variable-length, but empty by default.
- Replace "create read only -> lock" pattern for "initialize on creation" pattern in order to ease D3D11 development.
- Intersection & PlaneBoundedVolumeList queries
TagPointsUPDATE 2.1: v2 TagPoints are working v1 TagPoints still broken and wontfix. Checkout TagPointListener workaround: http://www.ogre3d.org/forums/viewtopic.php?f=4&t=84650#p522055. Shadows in Terrain componentUPDATE 2.1: Done in 2.1-pso branch using new Terra system and compute shaders.
- Volume component
- Character: Crashes when withdrawing weapon as TagPoints aren't supported yet. UPDATE 2.1: see TagPoints above.
- DeferredShading: Needs to be ported to the new compositor.
SSAO: Compositor scripts need to be ported.UPDATE 2.1: DONE. See new SSAO sample.
The only "hard" sample to port could be DeferredShading.
Modify the Mesh format to store bones in the same way (but store 1 float only "XYZXYZ" for cross platform and easy parsing. Do the swizzle conversion when loading if needed) DONE
Write update code with parallelization in mind! DONE
TagPoints are now SceneNodes. (TagPoints have lots of issues) DONE
- Implement HighLevelCull grid as in the slides.
- Can merge all RenderQueueIDs that can be ever be requested by current compositor chain, so HighLevelCull can know which ones it should send
- Can workout compositor dependencies (i.e. Stream Out & shadow passes) DONE
- Keyword hint on cull list reuse (so Compo Mgr decides whether to create two identical lists of culled objects in 2 different threads for each compositor pass, or process them sequentially in one thread and reuse the list).
- Define compositor syntax to work with Stream Out.
- Add MetaData to Mesh format
- Metadata: Support bounding geometry for sw occlusion culling
- Metadata: Number ID system for keyframed animation, to allow embedding sound cue information, particle effects trigger, etc.
- Implement low level depth-only sw rasterizer for occlusion culling
- Get rid of "debug visualizers/debug renderables" in Frustum and Nodes (which are adding unnecessary dependencies and don't belong there)
-- At this point Ogre 2.1b is similar to 1.x, however it should be much faster & efficient. --
Removal of all fixed function state managing out of Scene Manager & RenderSystem DONE
Put all state changing code into one or multiple state blocks. DONE
Add support for Depth textures (including HW PCF) DONE
GL, DX9 (through INTZ fourcc), and DX11 DONE
- Add HW Gamma keyword toggle on the material (in 1.x if the texture name is not defined, gamma can't be turned on through scripts)
- Add ".texture" files where textures may be defined for certain particularities (i.e. change of format, load for gamma correction) before all materials are parsed.
Add normal compression. DONE
Interface to pass data through texture registers (VTF for DX9) DONE
HW Skinning through texture registers DONE
- Morph Targets through through texture registers
- Replacement of "camera relative rendering" hack in favour of true working in camera space matrices.
- Binding to pass HW Skinning matrices in local space rather than world space.
Add Compute Shaders (GPGPU) to system. May be managed from CompositorManager (i.e. for rendering) or manually (for pure GPGPU) DONE
- Implement bokeh demo using atomic counters
Implement Light Indexed Deferred demo. Considered DONE (via Forward3D)
- Implement Real Time Global Ilumination demo.
- Remove manually setting VertexElement::mOffset as it induces to commong mistakes (may remove the variable itself if caching proves to be unnecessary), because this value can be deduced from declaration order.
- Vertex format enhancements (custom flexible vlayout files)
- Add next gen demos.
- http://www.ogre3d.org/forums/viewtopic.php?t=30250|"Tindalos" (Ogre v2.0) SceneManager redesign forum thread
- http://www.ogre3d.org/forums/viewtopic.php?f=25&t=75459 |Ogre 2.x engine