Recently there were several updates around the Ogre infrastructure and ecosystem. This post will outline the highlights for you.
Ogre 1.10.9 released
While this is actually core, there were several updates that also improve the Ogre ecosystem. Maybe the most prominent one is that ApplicationContext will now fall back to the installed plugins.cfg and resources.cfg if it does not find any it the working directory (or any previously searched locations).
While this sounds trivial it means that your
ApplicationContext based application will just run ™ – no need to worry about the RTSS resources or where the plugins are located. Ok, to load custom resources, still have to provide a resources.cfg, but in most cases you will not need a plugins.cfg. By default all enabled plugins will get loaded automatically.
Related to this change is the deprecation of
SceneType enum (i.e.
createSceneManger(ST_GENERIC)). Most of the time it only gave you the right SceneManager Plugin by chance. See this thread for details. Instead you are now supposed to call
Next, basic tutorials 1 & 2 were ported (thanks to Bohdan Kornienko) from the wiki to the new Doxygen documentation and to 1.10 (ApplicationContext). The code is no longer copy pasted into the page, but rather referenced from a real project that can be built and tested. Obviously the tutorial porting is an ongoing effort that you are invited to join.
-Wmissing-declarations warnings were enabled and fixed the code. These warnings help us ensuring that internal functions are correctly marked static and that our preprocessor branching is sane.
Of course there were many more changes. For the details – as usually – refer to the github tag.
Many addons ported
If you take a look at the OGRECave group on github, you will find many of the addons, that make up the Ogre ecosystem. The ones inside the group, were ported to 1.10. Due to the internal reorganization in 1.10, this allowed dropping lots (like lots) of code: e.g. FindOGRE.cmake and BaseApplication could be safely dropped.
But particularly, the documentation was regenerated and now even correctly references any external Ogre classes. Take a look:
You might notice that some information is outdated or find some typos. Take the chance and and create a pull-request on github. Most of this is just some markdown inside the according repository.
Ogre visualisation module in OpenCV
There have been Augmented Reality demos using OGRE and OpenCV for a long time. However the new Ogre Visualisation module, short ovis, provides a far better and easier integration. This allows you to write an AR demo in just 35 lines of code.
Regular visitors might have noticed some downtime of the Forums and the Wiki. This was due to the migration of our Webserver to Bytemark that are kindly providing us with free hosting. This was quite a leap forward as the old server was still running Ubuntu 12.04 with PHP software versioned at around that time. To me it is a miracle that the server still was under our control..
Anyway…the new server is now running Ubuntu 16.04 with automatic security updates. Furthermore we moved from phpbb 3.0.8 to phpbb 3.2.1 (~6 years advance) and tiki from 6.4 to tiki 15.5 (~5 years advance). Besides better security, this brings us responsive (mobile) pages and emoji support 🙂
Wiki deprecation and addonforums archival
The migration has shown some problems with our infrastructure though. We had an isolated addonforums phpbb instance where users had to register separately from the main forums. However only a few addons even had post from this year – let alone having responses. Therefore this instance was not migrated. Instead it was converted into a static archive.
Furthermore using a wiki for code is outdated by todays measures. It sits somewhere between Github, WordPress and Doxygen, where each of the alternatives offer a superior experience for the respective use-case. Therefore for contributing text, you should consider the following alternatives:
- for tutorial and sample code use Doxygen, which offers automatic code referencing
- for external projects use github, which offers code versioning and issue tracking
- the rest, which is general information, should probably be on the main page for better discoverability
IRC channel replaced by Gitter
In case you want to chat about Ogre related topics, you can now use our Gitter channel which replaces the #ogre3d IRC channel. The reason we drop IRC is that nobody of the current Ogre Team has admin access to the channel, preventing us to set-up an archival of the chat-logs or even change the headline. Of course we could have mailed back and forth with freenode, and then request botbot.me logging – but then Gitter took just a few clicks to set-up and offers superior code referencing..
With the 1.10.8 release, the 1.10 support cycle is approximately half way over, which is a good time to recap the features and switches that got introduced since the initial release.
Note that Ogre 1.10 is the only actively maintained release – all other branches have reached their end of life, so no bugfixes will be back-ported.
If you are still using Ogre 1.9 or even a previous release, you are encouraged to upgrade to 1.10.
But besides bugfixes, there were also some notable changes, which will be presented below.
Following the Python Component that got introduced with the initial 1.10 release, we now introduce the Java Component. Both of them share the same SWIG definitions, meaning they have the same API coverage.
The existing Vertex Array Object (VAO) implementation in GL3+ and GLES2 was so broken that VAOs had to be updated each frame – essentially disabling them. From 1.10.7 on VAOs work as expected and give a performance boost of about 10%.
Thanks to a contribution by Jean-Baptiste Griffo the GL3+ RenderSystem got a StateCache (accompanying GLES2 and GL). We took it as a starting point to further improve and unify the State Cache implementations and indeed could eliminate various bugs inside the GLES2 and GL caches.
Deprecation of node-less positioning
Traditionally Ogre allowed you to place Cameras and Lights in the scene without attaching them to a SceneNode. This resulted in three different positioning APIs for Cameras, Lights and SceneNodes with slight inconsistencies (
SceneNode::translate) and one big one:
- SceneNodes & Cameras look into (0,0,-1) by default
- whereas Lights look into (0,0,1)
To make things consistent, using the Camera and Light API for positioning is deprecated now. If you want to move away from the origin, you have to attach to a SceneNode (same as you would have to with Ogre 2.x).
The only exception is
Light::setDirection, which you should call with (0,0,-1) to make Lights behave like the other Nodes.
We cannot go ahead and change the default direction for 1.10 as it would break existing applications.
Compile time switches
Lets turn to some more fundamental changes that change the API and thus are hidden behind CMake switches.
OGRE_THREAD_SUPPORT == 3
To quote Steve, who initially implemented threading in Ogre:
OGRE_THREAD_SUPPORT==1 where resource management is fully threaded, was hopelessly naive. It required too many locks, and also that the rendersystem was multi-threaded.
OGRE_THREAD_SUPPORT==2 improved that by not requiring that the rendersystem was threaded, and just doing disk I/O in the background, but still, the whole process is still driven within the Resource class, which means the locks are still in place on Resource and by association SharedPtr and a bunch of other classes too.
Therefore we introduce the new
option. Setting this, Ogre core objects – most notably Resource – are not thread-safe. However the DefaultWorkQueue is
threaded. This allows the Terrain and MeshLOD Components to be multi-threaded without the locking overhead in OgreMain. See #454 for details
Setting this option, the custom
AtomicScalar types become merely aliases for
std::atomic which are both more portable and higher performance alternatives.
std::thread is used as the default threading provider.
Traditionally Ogre uses (hash-)maps to store everything by name, including sub-nodes and attached MovableObjects. While this gives you
O(log(N)) lookup, iteration performance is terrible as maps are spread all over the memory and thus trash the CPU caches.
However with rendering the most common operation is iterating (for e.g culling) over all children while lookup is only done for changing the state. Furthermore high-frequency lookups can be easily avoided by just storing the returned pointer.
will use the cache friendly
instead of maps. Naturally lookup by name becomes
and the API changes. However this improves rendering performance by about 20% – bringing Ogre 1.x into 2.0 range when only a few nodes need updates. See #440 for details
An outlook on Ogre 1.11
As the amount of possible configurations explodes with each switch we introduce, we are going to only allow one setting with Ogre 1.11 to keep things maintainable.
So rather think about the switches in terms of feature previews and not so much as options.
With Ogre 1.11 we will choose the following configuration:
OGRE_USE_STD11=ON will be supported. In other words Ogre will switch to C++11.
OGRE_NODE_STORAGE_LEGACY=OFF will be supported.
OGRE_THREAD_SUPPORT=3 will be the default. Only the
std::thread provider will be supported.
- OGRE_RESOURCEMANAGER_STRICT=ON will be the default.
- Default Lights direction will be (0,0,-1).
- Lots of the deprecated API will be dropped – better start looking at the deprecation warnings now.
- Custom memory allocators will no longer be supported. You will be able to define C++11 template aliases to set them for STL containers though.
We finally tagged the Ogre 1.10 branch as stable (tag: v1-10-4), making it the new current and recommended version. We would advise you to update wherever possible, to benefit from all the fixes and improvements that made their way into the new release.
This release represents more than 3 years of work from various contributors when compared to the previous 1.9 release. Notably, it includes the following three GSoC 2013 projects:
The ResourceManager redesign GSoC was superceded by the strict mode CMake switch.
Enabling the strict mode is highly recommended, however the default is legacy mode to ensure compatibility with existing projects.
Additionally it includes the changes from the git fork that got merged back into default. The fork formally did the 1.10.0 release, thats how we ended up with 1.10.4 here.
Currently we don’t have any published SDKs yet, since we still rely on team and community members to help with the building and packaging process and that takes some time of course. We will update the download page as they become available and also try to update the announcement thread in the forums.
For an detailed overview of the new features see the New And Noteworthy Document. Among the highlights are:
- Python bindings as a component
- vastly improved GL3+/ GLES2 renderers with GL3+ now being the recommended choice on *nix systems
- Bites Component for rapid prototyping of applications
- Emscripten platform target – supporting Web Assembly & WebGL2
- improved build system, automatically fetching all required dependencies.
- A new HLMS Component implementing physically based shading
- Unified Documentation: the API docs, the manual and some Wiki pages have been merged and are now managed with Doxygen. As a consequence, the Wiki is outdated when it comes to OGRE 1.10. If you find something particularly missing, feel free to submit an additional tutorial.
Despite the amount of new features OGRE 1.10 provides the smoothest upgrade experience between OGRE releases so far. See the API/ ABI change overview for OGRE 1.7 – 1.10 that is kindly provided by ABI-laboratory.
Note that some components are marked as
[BETA]. This does not mean that they are likely to crash, but that we can not give any API stability guarantees for them right now. You should expect their API to change without a deprecation period while we we iron the warts out as the Component get more exposure.
In turn for the core components, our deprecation list has grown considerably. You can keep using these APIs for now, as we intend to support them until OGRE 1.11. Speaking of which; to make OGRE releases predictable, we will switch away to a feature based to a time based release model for the 1.x branch. This means that you can expect OGRE 1.11 in April 2018.
We would like to thank everyone who helped us make this release possible. The following list shows a list of contributors for 1.10 based on the git logs:
Pavel Rojtberg, Eugene Golushkov, David Rogers, Jesse Johnson, Murat Sari, Lior Lahav, Peter Szücs, Philip Allgaier, Matías N. Goldberg, Sasu Robert, Assaf Raman, Jannik Heller, lunkhound, Juan Borda, Daniel K. O., Jan Drabner, Transporter, Ahmed Allam, Flavien Bridault, Lf3T-Hn4D, J. Edward Sanchez, Mattan Furst, Shenjoku, arkeon, nxgraphics, 0xc0deface, Alexpux, Caleb Bartholomew, Christian Refvik, Harald Reingruber, Stefania Pedrazzi, Unknown, ja0335, threax, Al Reay, Andrew Piper, BAntDit-PC\BAntDit, Bastian Köcher, David Reepmeyer, Inifinity, Joel Croteau, Tomáš Kováč, tangren, Arroy One, Charles Prévot, Chris Burns, Daniel Brall, Daniel Gouvêa, Jean-François Verdon, Joël Lamotte, Matthew Fletcher, Misha, Oleksiy Ivanov, Simon Willshire, al2950, xantares, Alex Peterson, Alexey Knyshev, Andrew Fenn, Arroy, Bruno Sanches, Carsten, Crashy, Dainius Vaiksnys, David Avedissian, Denis CARLUS, Francesco Guastella, Gauthier POGAM–LE MONTAGNER, Glenn Ramsey, Holger Frydrych, J W, James Chen, Joe Brown, Justin Grant, KoenMertens, KungFooMasta, Mako_energy, Marcin Juszkiewicz, Michaël Broutin, Osamu Takasugi, Richard Plangger, Robert Hildebrandt, Robin Norrman, Ryan Thoryk, SNiLD, Sam Hocevar, Steve Peters, TheOnlyJoey, Ziriax, emilie.harquel, mkultra333, philiplb
BTW: if you want to contribute to OGRE, you can now use github as well.
The new year has just started and already we have good news for the Ogre community: Pavel Rojtberg officially joined the development team. Many of you will already be familiar with him and his work in his Ogre 1.10 fork. Many / most / all of his changes will step-by-step make their way into the official 1.10 branch for which Pavel took over the maintenance. Some of you might already have noticed that based on him having commit/merge privileges now in the repository and him already making use of those since a few days.
Since most of the team resources are currently locked up in Ogre 2.x development, Pavel’s support is most welcome to make sure that the current Ogre 1.x versions don’t get left behind.
So, welcome on board Pavel!
Once again, we want to highlight one of the many games based on Ogre3D that have come out recently. This time: “Shadows: Heretic Kingdoms“.
As usual we asked the team behind the game if they could share some insights into the Ogre3D usage and how the game was built in general, and the guys from bitComposer were kind enough to provide those:
- The game was developed on an older Ogre version, but continually upgraded to the most recent versions (currently 1.10). We are thrilled to get the game to Ogre 2.0 though as there are some limits which we are not able to overcome with the 1.x versions (mostly related to hyper-threading and slow scene management).
- Apart of a few bugs fixes we have not made any modifications to Ogre core. However, we are using some extensions of shader rendering pipeline. To be more specific, we have modified deferred shading with cubemaps projected lights, added off-screen particles, outlines glow and color correction to name the biggest changes.
- We are supporting both DirectX 9 and DirectX 11 renderers. DX11 was included because of the improper detection of graphics cards on some computer with multiple graphics cards with DX9 version.
- For 3D modelling, animation and export we are using Maya. Some outsources create their models in 3D Studio and we import those into Maya environment and export into the games.
- We have developed our own editor which we are using for scene assembling which includes ragdoll editors, lightning.
- For particle effects we are using Particle Universe with in-game editor for seamless implementation of particles to the game environments.
- For physics simulation in Shadows we have used the Bullet library (mostly for collisions and ragdolls).
- Scripting is done using LUA language. A lot of external files are XML formatted.
- For text content handling (there is a lot of text content as you can imagine) we are using our own proprietary tool Locedit which is also available for 3rd parties if someone may be interested in. It features multiple languages, Unicode, subtitler for movies, XLS export/import, voice check and direction, etc.
- Game content is encrypted and packed to improve loading times.
- User generated content is planned to be distributed using Steamworks.
- The entire toolset will be released for the community together with the game sometimes in the near future. We believe that Ogre community may benefit from our tools even for their own projects… It certainly will lack the polish and proper documentation of Unreal but it likely may be the most complex tool for Ogre and available for all Shadows owners without any additional fee.
- We are currently starting porting of Shadows to Ogre 2.0 together with the Ogre team, so I hope our work will contribute to early availability of complete 2.0 version of Ogre.
You can see more videos and screenshots on Steam where you of course can also purchase the game: Shadows Heretic Kingdoms @ Steam
Below a first look at the editor that was used for the game and is planned to be released to the public in the near future: