Development log: November 16, 2012

Improved SSDO, Collada import

Improved SSDO

The quality of SSDO is tremendously improved:

  • No more circle artifacts on high settings for AO, now it is physically correct and affects only the ambient light component.
  • No more noise for real-time GI. It has a full set of adjustment settings.
It is possible since SSDO is rendered in two separate passes: ambient occlusion (AO) and light occlusion (LO). You can choose to render only AO, only LO, or both at the same time by setting different values for render_occlusion console command. Check new AO and LO on samples samples/render/occlusion_00 and occlusion_01.

Sun light + ProbLight GI (with specular) + AO + LO:

Sun light: Sun light + ProbLight GI: Sun light + ProbLight GI (with specular):
Ambient occlusion: Sun light + ProbLight GI (with specular) + AO: Light occlusion:

COLLADA Import Plugin

New COLLADA import plugin is a new and easy way to streamline your art pipeline, as it is available in a variety of 3D editors. You can load *.DAE files straight into Unigine with all materials, animations and it's not the end of the list. Conversion into a Unigine native format is done completely automatically. Simply load a file, check options and add art assets to the scene. Textures are also converted into Unigine-specific formats if Import textures option is used.

To load the Collada import plugin, specify -extern_plugin Collada option on the engine start-up. Load the interface for it via Tools -> Plugins -> Add and choose core/editor/plugins/import/collada.cpp.

COLLADA import

What can be exported from Collada? Everything you need to have!

  • Mesh geometry. The plugin performs automatic conversion from Collada to Unigine coordinate basis.
  • Full node hierarchy is supported for exported meshes. Set a scene up in the Collada file once, and it's ready for use in the Unigine editor.
  • Materials are created based on diffuse, normal and specular textures. If any, diffuse and specular colors, as well as specular power parameters will be correctly set. Moreover, with additional Import textures option, you can compress all textures and create mipmaps on the fly, so you do not have to worry about what formats to choose for optimized performance.
  • Animation based on step, linear, bezier or hermite interpolation. It is imported together with a DAE file, if baked (Import animation option), or from a separate file (Animation button).
  • Lights to illuminate nodes. Ambient color, directional sun light, point and spot lights are created with all parameters set up in Collada: their color, position, orientation and radius.
  • Camera nodes can are also be imported, whether they are orthographic or perspective. To view the imported cameras, simply use Camera view in the Unigine editor.

Render

Lens flares

Lens flares

  • Shiny new addition to HDR lens flares: now they come together with spherical optical flares and chromatic aberrations. You can also set an arbitrary photo texture to simulate unique lens artifacts. (Check these new options on Render > HDR > Lens tab.) Moreover, the flares quality is improved: the buffer resolution is reduced, and additional filtering provides an extremely realistic result.
  • Added antialiasing x16 mode (video_multisample 4). You can enable it on latest NVIDIA and AMD graphics cards (this mode should be supported on the hardware level).
  • Environment lighting for grass is now calculated faster (on the per vertex level).
  • Texture mipmaps are displayed in the image dialog (Mip drop-down list when a texture is viewed, for example, in Materials).
  • Fixed a bug with incorrect colors on the last mipmap level for non-square textures.
  • Console commands gles/d3d119_render_use_rgba8 now have 3 possible variables to set. These commands allow to control the reflection texture precision. 1 means that the screen buffer is RGBA8, while a reflection buffer is R5G6B5 (used by default). The value of 2 means that both buffers are in RGBA8 format (this variant allows for smaller reflection buffer and higher rendering speed in the result).
  • Deferred auxiliary, refraction and velocity buffers are now displayed with correct names when render_show_textures is used.
  • In materials deferred_ambient AO texture is available.
  • Added show_visualizer 2 mode that does not perform a depth test. It allows to render a wireframe and other visualizer features even if the object is behind other objects in the scene.
  • Decal offset parameter now correctly works when a decal is projected onto a skinned mesh.
  • Added support for array material parameters (it is now possible to pass a lot of vectors into the shader from a material, allowing complex manipulations like manual skinning or vertex shader Perlin noise without texture fetches): Material::set|getParameterArray().
  • Added support of RGB10A2 texture format for Intel HD GPUs.
  • Wet postprocess material (post_filter_wet) is applied with a refraction effect for geometry under the rain.
  • Color banding for gradients is gone and forgotten. Shades of light scattering smoothly blend into each other at dawns, sunsets or moonlit nights. Make sure that render_use_rgb10a2 is set to 1 (by default), for color dithering to be performed in the composite shader.

Color dithering

Meshes
    Now you can generate unique meshes for characters and equip them into different armor on the fly. Merge, split or morph static and skinned meshes when they are created in run-time.
  • Added dynamic flag in ObjectMesh and ObjectMeshSkinned constructors. Such meshes can be loaded from a file and then uniquely modified in run-time. (These meshes are not instanced unless cloned).
  • Added access to vertices and indices for ObjectMesh and ObjectMeshSkinned (via setVertex(), setNormal(), setTangent(), setTexCoord() and other functions).
  • New addMeshSurface() function for meshes and skinned meshes adds geometry to the existing mesh surface or a completely new one.
  • New function addMeshFrame() safely copies per-frame transformations between skinned meshes if identical bones in their skeletons are found by name.
  • ObjectMesh and ObjectMeshSkinned can be saved into a file via save().

GUI

  • AppWall plugin can have GUI in all of its windows. GUI instances are available via engine.wall.getGui(int x,int y) function.
  • Interface plugin windows correctly restore their position on Linux.
  • ObjectGui and ObjectGuiMesh load a default GUI skin (core/gui/) if NULL specified as a skin name.
  • Automatic directory reloading on modification for WidgetDialogFile dialog.
Flash
  • Now you can access ActionScript classes from packages (via import com.my_package.MyClass;).
  • Array slice() function can work without arguments. In this case, it returns the same array.
  • Bool variables in ActionScript are automatically converted into int data type in Unigine scripts.
  • For a Button object, enabled variable is available.
  • Correct functions calling when no arguments is specified (function receives undefined values in that case).

UnigineScript

  • New functions as_int() and as_float() convert int to float data types, and vice versa, on the bit level.
  • Fixed issues with ControlsJoystick: no more errors after control over a joystick was lost. The correct default POV value is also used (that is, -1).
  • WidgetEditText can now safely remove its last line via removeLine() function.
  • Expression performs search for variables and functions only inside its namespace.

C++ API

Just like from scripts, now you have full control to modify ObjectMesh and ObjectMeshSkinned in run-time on their creation:

  • Provided access to vertices of ObjectMesh and ObjectMeshSkinned (via setVertex(), setNormal(), setTangent(), setTexCoord() and other functions).
  • Added functions to control per-vertex bones for ObjectMeshSkinned (via setBones(), setWeights() and others).
  • New addMeshSurface() function for ObjectMesh and ObjectMeshSkinned adds geometry to the existing mesh surface or a completely new one.
  • New Unigine::Mesh and Unigine::MeshSkinned classes allow to import and export meshes right into Unigine native format. These classes are not used for rendering meshes. Instead, they can be used on the import stage to create a mesh, add geometry and save it into a *.mesh file. (After that, you can load it in the world from scripts as ObjectMesh from scripts.) As another variant of usage, you can load a mesh from disk, split it or merge with another mesh and then save.

Other new API features are as follows:

  • Added Object::setEnable() function to control object surfaces.
  • Added new C++ data containers: Unigine::Map and Unigine::Set.
  • Added C-string compare operators for Unigine::String (that is, ==,!-,>,<,>=,<=).
  • Added a function to get and set string arrays into the Xml arguments and data (Unigine::Xml::setStringArrayArg() and Unigine::Xml::setStringArrayData())
  • Added functions to compose/decompose matrix transformations (Unigine::composeTransform()/decomposeTransform()).
  • A single character symbol can now be added to a string (via Unigine::String::append()).
  • New Unigine::String::getInt()/getLong()/getFloat()/getDouble() functions convert a string into int, long, float or double types.

Engine

  • Defines for the engine can now be changed dynamically in run time: set them via extern_define console command and use system_reload for changes to take effect.
  • The engine can be built using Clang compiler (via scons compiler=clang). This option is available only on Mac OS X.
  • On Windows the engine links with dynamic run-time library (MSVCR100.dll is included into SDK).
  • On Windows release builds do not send debugging output to the system debugger.

Mobiles

  • iOS binaries are now compiled with NEON instruction set support (by default).
  • Added support for system volume buttons on Android.

Tools

  • New image_atlas.h script (from data/core/scripts folder) can be used for automatic texture atlas generation. Alternatively, you can run an executable script source/tools/Interpreter/scripts/core/image_atlas.usc based on it. To create an atlas, simply pass images by their IDs and specify the maximum size of the atlas.
  • Added a camera_to_track executable script that converts camera paths exported from a 3D editor into camera tracks in Tracker. You can find it here: source/tools/interpreter/scripts/core/camera_to_track.usc.
  • ImageDDS can be used to decombine and combine mipmaps of 2D uncompressed images (-md and -mc flags). This options can be used to manually correct mipmaps, for example, if thin lines disappear at a distance.
UnigineEditor
  • New smart (bi-axis) "move" widget.
  • Added an option to disable showing a confirmation message when nodes are cloned with SHIFT pressed (Tools > Common > Node clone confirmation).
  • Added a search field on Nodes panel. Moreover, searching in Nodes, Nodes > Surfaces, Materials and Properties can be done not only from the beginning of the string.
  • When nodes are exported into node files, it is not necessary to reset position coordinates to zero.
  • Fixed crash on changing Body type of the object.
Plugins for 3D Editors
  • The last set export settings in Utilities -> Unigine Exporter are automatically restored each time 3ds Max is launched.
  • Surfaces of exported meshes and nodes are always sorted in alphabetical order. Reexporting a mesh or a node is now completely safe.
  • Move textures option works correctly if Compression option is unchecked.
  • If selected, one or several bones can be exported into a *.sanim file.
  • Fixed Node export when Groups as surfaces option is checked.
  • Speedup of texture export for nodes (especially if Compression option is checked).

Other

  • Scripts system.h, wall.h and stereo.h are relocated into core/scripts/system/system/ folder.
  • Correct monochrome TTF fonts loading.
  • In Tracker all cross, shaft, lens flares parameters can now be found under render > hdr > cros/shaft/lens.
  • When BodyCloth is assigned to mesh, an error message is printed in case a mesh topology is not correct. For example, if an edge is shared between more than 2 triangles, or there are any vertices that do not form triangles.
  • Fixed a bug with properties not saving their color, vec3 and vec4 parameters when they were edited for a node instance.
  • Fixed an issue with incorrect sound failsafe mode (NULL sound system is now correctly used if the specified one cannot be initialized).
  • Fixed a bug when checking intersections with ObjectMeshDynamic.
  • Fixed full-text search on developer.unigine.com forum.

Samples

  • Added a sample data/samples/shaders/lines_00 to draw lines of the arbitrary width using a geometry shader.
  • Added a sample data/samples/widgets/menubox_01 where WidgetMenuBox objects are checked for RMB pressed callbacks.
  • Added a sample data/samples/shaders/vertex_noise_00 with shader array parameters.

Documentation

  • Added detailed articles on Volumetric objects (Principles of Operation -> Objects -> Volumetric Objects).
  • Updated articles on all materials for volumetric objects (volume_*).

P.S. Some of the core members of UNIGINE team will be attending I/ITSEC 2012 (December 3-6) in Orlando, Florida - the world's largest modeling, simulation and training conference. If you would like to meet with UNIGINE at I/ITSEC 2012, please feel to contact us at info@unigine.com.