Annwvyn Experimental 0.2.5 maybe not faster, but definitively better and stronger!
Pre-releaseAnnwvyn got a a few new features, a lot of bug fixes and some structural improvement since the last release.
I'm progressing to the goal of having a lightweight, easy to use VR engine that is VR system independent.
This release add 3 main things, and they have some side effect :
- The basis of an hand controller abstraction, to use with Oculus Touche and Vive wands
- A way for the use to extend what the engine is doing without having to write your own update loop via UserDefinedSubsystems
- A system that can actually render text on your scene
This also added a way to make a level able0 to automatically unload non-managed movable objects you add to the environment if you use RAII by writing a proper destructor. You have to subclass the AnnAbstractMovable class for that.
Also a nasty bug was due to a really stupid mistake. I will not be bitten twice, so I'm now compiling with the maximum warning level, and using static analysis to make theses things less likely to happen.
I'm also changing my way of doing some things from "a C99 guy that learned C++03" to modern C++. I already adopted newer features like range-for loops, auto, and nullptr. More recently I'm using smart pointers instead of naked_type* pointers and newer STL containers.
Feature wise, I need a way to cleanly push hand controller events from the VR integration to the event manager, in a way that I will easily implement Oculus Touch support to it in December when I will got them. For now I just have a pair of Hydra (borrowed to a teacher at my school) and I use them through SteamVR as Vive controllers.
The other thing I absolutely have to work on is to not be that mono threaded. Currently, Annwvyn run the logic, then the physics, then the graphics. There's some work to make this better 😉
The last, and least fun issue that bother me is that I have currently no way to turn on any anti-aliasing on the intermediate render buffer. For some reason, adding FSAA to a Render Texture makes Ogre render a black image. So for now, we're still stuck with jagged edges 😢
Changelog (and other improvement to the code base):
- Basic hand controller support with in -vive mode
- Added a -noVR mode to test games without VR hardware
- Increased Physics engine temporal resolution (sub-stepping at 240hz)
- Corrected a physics initialization bug where a -INF "advance time" was passed to bullet
- This was causing objects positions/orientations to be set at NaN fp values
- This was due to uninitialized double variables that were then subtracted and casted to float, getting -INF as a result.
- Now using cppcheck as a static analyzer to catch this kind of problem
- Removed vestiges of the old .map system
- Improved code quality
- Compiling at the maximum warning level, and treating warning as errors
- Systematic static analysis of the code
- Using tools to check string and comments spelling and to clean code presentation
- Removed vestiges of the old Linux compatibility
- Listener and Level declarations are logged
- Using more of C++ modern features to simplify the code
- I prefer now to use std::array in place of C style array everywhere.
- Added custom classes to hold angle values AnnDegree, AnnRadian that are seamlessly convertible between each-other
- If a function or a method wants an AnnRadian, and you give it an AnnDegree, it will convert with the right value
- AnnDegree(90) == AnnRadian(Math::HALF_PI)
- Added floating text rendering in VR, transparent or with background images, using TTF fonts
- Added an abstract movable class that define the basic interface of something that can be moved in 6DoF in 3D space
- Added an abstract translatable class that define the basic interface of something that can be translated in 3DoF in 3D space
- Levels can hold a list of movable to be destroyed at level unloading, including the 3D text planes mentioned above
- AnnConsole will use glCopyImageSubData only if the GPU OpenGL version support this function
- Corrected a bug when a texture copy was touching other textures in the engine (Circumvented a bug in Ogre? Probably.)
- Added the possibility to create, register and remove SubSystem defined by the user
- AnnEngine will append to it's update queue the subsystems you add to it. You can control when they are going to be updated (or not) by the "needUpdate" method of the AnnUserSubSystem class you are expanding.
- This permit to cleanly implement things that need to tick with the engine (network code, additional devices support like a Novint Falcon or a Leap Motion)
- Added a simple "Hub" system for demoes
- Fixed a problem when a Level was declared as an event listener itself
- AnnEventManager only store weak pointers to each event listeners, and will verify if a listener still exist before de-referencing it.
- Finally added AnnPlayer::teleport method
- AnnLevelManager will not act before the current frame logic has been processed. (no more crash when unloading of a level while stuff is still happening)
- Added the possiblity to pre-load some resources
- if used cleverly, it can cuts to the "hanginng" time whlile level are loading.
- AnnAudioEngine code that initialize OpenAL has been simplified, some hard-coded references to the Oculus Rift audio interface have been removed
- Fixed vive rendering
- OpenVR renderer now use a shared texture to submit eye buffer
- Dynamic allocation of the objects that abstract the hand controllers don't rely anymore on the trackedDeviceIndex they got at runtime
- Cleaned the code of the Oculus rendering
- Now the application declare itself to the Oculus service, as expected by the SDK
- Static geometry is checked by the compiler instead of run-time