TindalosNotes         ChangeLog and porting notes for OGRE 2.0.0 "Tindalos"

Welcome to the ChangeLog and porting notes for OGRE 2.0.0 "Tindalos" - work in progress

Frank Belknap Long wrote:
"They are lean and athirst!" he shrieked... "All the evil in the universe was concentrated in their lean, hungry bodies. Or had they bodies? I saw them only for a moment, I cannot be certain." - Frank Belknap Long, "The Hounds of Tindalos"


Updates — IMPORTANT 2014/12/06

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:


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)

ChangeLog

  • Not started

Porting notes

  • None yet

Annotated roadmap

  • 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


dark_sylinc notes:
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

Missing stuff that needs to be designed for 2.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.

2.0 - Cache misses and ground base

Scene Manager

Task Status
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
Implement UpdateAllAnimations() 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.


(2) Interesting reads:

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.

RenderSystem

  • Replace "create read only -> lock" pattern for "initialize on creation" pattern in order to ease D3D11 development.

Missing broken stuff

  • Intersection & PlaneBoundedVolumeList queries
  • TagPoints UPDATE 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 component UPDATE 2.1: Done in 2.1-pso branch using new Terra system and compute shaders.
  • Volume component


Samples:

  • 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.

2.1a

Phase One: Setting up base infrastructure

  • Implement UpdateAllAnimations()
    • 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

2.1b - Features back

Phase Two: Restoring advanced culling & compositing abilities

  • 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. --

2.3 - Rendering features

RenderSystem

  • 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.

2.4 - Flexibility, tools and integration

  • 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)

2.5-2.9

TODO

  • Add next gen demos.

3.0

First stable release

Talks about it