Development log: November 02, 2010

Refactored render, improved vegetation system, increased data precision in scripts

Valley demo: terrain and vegatation

Render:

  • Completely new vegetation system: trunk bending, rotation of billboard leaves, spatial noise for randomized movement of vegetation.
  • Added the motion blur postprocess (takes into the account both the camera velocity and velocities of physical bodies).
  • Added indirect occlusion (SSDO) to simulate real-time global illumination.
  • Complete shaders refactoring (all texture samplers were shifted).
  • Unified LOD system for all objects, parameters are in surface settings (visible and fade distances are removed from objects).
  • Smooth transition between LODs for all meshes, 3D GUI objects and billboards basing on the screen space noise. Leaves use fading based on the to alpha test scale.
  • Improved stereo 3D model: parallel axis asymmetric frustum perspective projection instead of the old toe-in projection. Now there are only two stereo 3D parameters: depth and eyes distance.
  • Added mesh_terrain_base base material for mesh-based terrains.
  • Slice count in volumetric clouds became tweakable (ObjectSky).
  • Transparent surfaces are sorted by the the distance from the oriented bounding box (OBB).
  • Unified shadow rendering for all light types into a single pass.
  • Improved tesselation DIP performance.
  • Eliminated deferred buffer conflicts.
  • Added dedicated depth buffer with 24 bit precision, dedicated diffuse color, normals and parallax offset buffers.
  • Different sets of deferred buffers are used depending on the render settings.
  • Added a super-simplified rendering of lights - pure deferred shading, when geometry is drawn only once. It is activated with 'render_deferred 2' console command and can be very useful for old hardware.
  • Fixed a bug by WidgetSpriteRender rendering.
  • Improved ObjectVolumeBox precision.
  • Fixed PolygonOffset in auxiliary and refraction passes.
  • DirectCompute is not used for postprocesses, beacuse it has proven to be useless.
  • Added more render profiler counters (RT*); use 'render_profiler 1' console command to activate.
  • Added support of of circle and circular sector rendering into the visualizator.
  • WorldClutter can be randomized with a seed.
  • Global scale parameter for all distance-related render parameters, including LODs (easy quality/performance tuning).
  • Fixed sRGB on diffuse texture of terrain.
  • Improved parrallax occlusion mapping quiality.
  • All objects can be drawn into the auxiliary buffer.
  • Changed blending mode of the auxiliary buffer: now it's lerp() according to its alpha value.
  • Added a sky background cubemap into the ObjectSky.
  • Added a shadow offset for billboard-based grass.
  • Added two more parameters for DoF.
  • Fixed Direct3D9 bug of rendering random additional geometry instead of a fullscreen polygon.
  • Several minor Direct3D9 bugfixes.
  • Added a fast antialiasing filter, use 'render_antialiasing 1' console command to enable.
  • Removed post_filter_antialiasing material.
  • volume_cloud_base supports a gradient image for volume rendering.
  • Improved render streaming for objects with big number of surfaces.

Valley demo: terrain and vegatation
Valley demo: terrain and vegatation

UnigineScript:

  • Added new data types with increased precision into UnigineScript: long, double, dvec3, dvec4 (see details below).
  • Support of 'long long' data type in streams.
  • Support of #pragma preprocessor instruction.
  • Fixed wrong 'this' statement in UnigineScript class destructor.
  • Added a frame counter: engine.game.getFrame().
  • Fixed NULL pointer memory leak.
  • Fixed bug with incorrect deletion of user classes.
  • Added Unigine::Quadrulple container.

C++ API:

  • Introduced C++ plugins to the engine, that allow to load a custom library dynamically in engine runtime (see Unigine::Plugin class in C++ API documentation). To enable a plugin, use engine.addPlugin(PLUGIN) or add '-extern_plugin PLUGIN' command line option, where PLUGIN is a name of the plugin library (without a postfix and extension).
  • Added sample of C++ plugins usage: source/samples/Api/Plugin.
  • A set of functions for easy access to C++ API pointers without complex type casting.
  • C++ API pointers can be cleared by calling clear().

Tools:

  • Added global parameters for hardware tessellation into UnigineEditor.
  • Added global parameters for vegetation animation into UnigineEditor.
  • Added Maya 2011 plugins.
  • Added tooltips to all material parameters in UnigineEditor.
  • Restored ImageView tool.

Documentation:

  • Added terrain tutorial into the reference manual.
  • Added "Programming / Memory Management" article.
  • Updated UnigineScript library documentation.
  • Added articles on terrain and terrain occluder objects into the "Principles of Operation / Objects" section.

Other:

  • Support of OpenCL 1.1.
  • Added dumping of linear velocity for ropes and cloth.
  • Fixed signal handling in Linux.
  • Access to bodies of the object or its parents via nodes.
  • Fixed FontRich parser in GUI.
  • Added support of font spacing in GUI.
  • Changed the file format of terrains. Use utils/Upgrade/terrain.py script for upgrade.
  • Non-physical PlayerActor supports friction.
  • Added 'clear' console command.
  • File searching in a separate thread (be aware that filesystem_reload is less safe now).
  • Fixed HScroll and VScroll precision bug.
  • Fixed crash by loading NodeReference without a node.
  • Network system now works as a C++ plugin.
  • Added support of Sixaxis gamepad (new script defines are available now: HAS_JOYSTICK, HAS_XPAD360 and HAS_SIXAXIS).

SSDO in action:
SSDO (real-time global illumination)
SSDO (real-time global illumination)


Notice on double-precision data types in scripts

Long data type has L/l postfix. Long and double data types don't consume additional memory in comparison with ordinary types, while dvec3 and dvec4 are quite heavy.

There are two useful preprocessor instructions: '#pragma no_long' and '#pragma no_double' is to treat all variables in old fashion (ints and floats); '#pragma warn_long' and '#pragma warn_double' is to block script compilation if there is a long or a double variable present.

Please be aware that if you leave your scripts unrevised, memory consumption will increase, while the performance will decrease!


There are also updated in-game screenshots in OilRush gallery (don't mind the UI, it's still work-in-progress):
OilRush pre-release in-game screenshot
OilRush pre-release in-game screenshot

Whew, that was a huge update indeed!