Today marks the official release of jMonkeyEngine 3.1 alpha. Generally I wouldn’t make a news post over a minor alpha release but a) jme has been pretty quite lately b) I’m currently looking at this engine right now c) it’s a pretty massive release.
In addition to underlying changes like a move to github, transition from ant to gradle build systems and implementation of a commenting system that isnt from the 90s, there are some pretty huge new features, such as iOS support, FBX importing, VR support, render optimizations and much more.
Not only does this release mark the introduction of some absolutely game-changing features (or shall we say, abbreviations: iOS, FBX, VR!); it also marks a significant step forward in jME’s underlying infrastructure. In the following weeks, we will explain each and every one of these changes in depth.
All the same bits, structured differently
First, we switched from using Google Code (SVN) to GitHub (Git) for our source code repository.
And then, as if that wasn’t enough, we went from using ANT for our build system to using Gradle.
We also migrated our forum to the ever more awesome Discourse, which was followed by a series of website updates, with more to come.
These structural changes will allow us to do our work more effectively, and with the combined power of GitHub and Discourse, we’re already seeing a big uptake in contributions and overall user participation.
Unified Renderer Architecture
Previously, there would be a Renderer implementation for each platform that jME3 supported, but all of these platforms supported OpenGL, so in the end, this led to a lot of code duplication. Each time we wanted to add a new renderer feature, all existing renderer implementations had to be modified in the same way.
The new unified renderer architecture means there’s only 1 Renderer implementation, “GLRenderer”, which then calls into GL interfaces implemented by each back-end – this is much easier to maintain. It means easier modification of renderer internals, including performance improvements, as well as the ability to add really advanced features to the renderer that wasn’t possible before. As a consequence, the OpenGL 1 renderer is now out, nobody will ever miss it and (probably) nobody used it for anything. There were some other changes around the rendering pipeline, reduce useless work and improve performance.
OpenGL 3 Core Profile Support
This is a significant improvement especially on Mac OS X and Linux where using the Core Profile actually allows more features to be used than otherwise. Do note that many jME3 shaders don’t support GLSL 1.5 which is required on some platforms when using OpenGL Core Profile – this is being worked on …
Geometry / Tesselation Shader Support
Added support for specifying geometry and tessellation shaders in the material definition. Note that this requires hardware capable of running such shaders. This feature is not used in the engine itself for any capability.
Scene Graph Optimizations
Previously, the engine would need to recurse into the scene graph 3 times every frame, even if nothing was changed! This has been improved so only the branches of the scene graph that require updating or rendering are actually walked into. This equals big performance boost for mostly static and large scenes. The only kind of scenes that don’t benefit from this are scenes where all objects and lights are constantly moving and the entire scene is visible in the camera the whole time. Those kinds of scenes are very rare!
In addition, hardware skinning is now enabled by default, which means a big speed boost when there are many animated models on screen.
Remy “nehon” already made a post about this which you can read here. With both single pass lighting and light culling you can now expect big performance improvements in large scenes with many lights. – When rendering shadows for lights, only casters that are inside the light’s area of influence are rendered.
FBX Importer (Beta!)
There’s a beta quality FBX importer currently in development. Unfortunately skeletal animation is not supported yet, but once it is finished, it should replace the semi-functional OgreXML support and hopefully be on par with the .blend importer.
If you want to render a certain (complex) model many times in different places. E.g. a forest or asteroid field, you can use InstancedNode (requires OpenGL3 and higher support!)
Rewritten Audio Streaming
If you were using audio streams before, you might have noticed that they have quite a lot of limitations. They cannot be looped, reset, or stopped without the audio stream becoming useless. The new changes mean you can now stop, loop, or reset audio streams with ease. Also, updates about audio finishing playing now occur every frame instead of every 50 milliseconds (e.g. if you were relying on it for any events & such)
Further, there’s a new capability to determine current playback position of an audio source. Can be used to synchronize events or video to an audio stream.
HostedServices: Essentially like AppStates, but independent of jME3 Application infrastructure.
Gamma-correct lighting and high dynamic range rendering
Gamma-correct lighting – basically means lighting looks better or more realistic, or both. Oh, and if you’re planning on using this, you better make sure its always on because your scene will look different depending on if its on or off. While at it, you can also use the new tonemap filter for HDR rendering. The tonemap algorithm is based on a filmic curve from Uncharted 2.
Profiling Frame Times
With the app profiler state, you can see how long each part of a frame takes, e.g. rendering or updates, thus allowing you to detect stuttering parts in the game and optimize them.
Now iOS support is mostly stable (but still behind Android support). More testing is needed.
Texture loading issue fixed.
Audio support now enabled.
Android Bugfixes & Improvements
Texture decoding is now handled by C++ code so loading time is now much shorter. This also means the terrain alphamap issue is fixed. Previously you had to flip the alpha channel to use terrain on Android, this is no longer required.
OGG/Vorbis audio decoding is now handled by C++ code. This allows using the native OpenAL Soft audio library to handle audio instead of the Android built-in MediaPlayer, hence 3D audio, doppler effects, and reverb is now supported.
Support for Android Fragments (on Android 4.0+)
Added support for joysticks. For example, you can connect your Xbox 360 controller to your Android tablet and it will show up as an actual joystick in jME.
Improved support for models animated with IK (inverse kinematics)
Support for loading linked .blend files
SDK Editor Improvements
Enhanced shader node editor with many issues fixed.
3D Scale / Rotate Tool.
New “DarkMonkey” theme which matches the forum theme (you have to enable it manually under the Look and Feel settings)
Added capability to change number of solver iterations – aka “physics accuracy”.
Added support native sweep test (previously was unimplemented)
Fixes to native ray test (previously was broken / crashing)
Allow 3D vector linear and angular factor instead of just a scalar factor
Print out current build branch / tag / revision / hash in log
Fix inconsistent mouse coordinate origin on AWT panels
Fix translucent bucket on AWT panels
Fix using texture arrays with GPU compressed textures
Fix building engine on JDK8 and latest Android NDK
Fix point sprites on Android
Fix post-processing / FBO on Android
Fix running jME3 in the Android emulator
Fix shadow effect Z fade feature
Fix compilation issues on Java 1.8
Fix broken Material.preload() method
Fix water filter not working on GPUs without OpenGL 3 support
Fix crashing filter multisample support on OpenGL 3.2 contexts
Fix bounding volume not updated when geometry inside BatchNode is modified
Fix incorrect flipping of 2×2 DXT5 images
Fix audio source reverb being enabled by default
Fix batching with vertex colored meshes
And a trillion other bug fixes I forgot to mention, so you better start using jME 3.1 today!