---
title: "UNIGINE 2.12: Faster Physics, Better Clouds, Earthworks Demo, Advanced Particle Systems"
version: "2.12"
release_date: 2020-07-31
lang: en
slug: "unigine2.12"
entry_id: 144
author: "fox@unigine.com"
source: "20200731-unigine-2.12/index.xml"
source_url: "https://developer.unigine.com/devlog/20200731-unigine-2.12"
---

# UNIGINE 2.12: Faster Physics, Better Clouds, Earthworks Demo, Advanced Particle Systems

## Key Changes

- Improved particles simulation with advanced control
- 2x physics performance optimization
- Better clouds and atmosphere improvements
- Advanced control over Landscape Terrain details
- New Earthworks demo
- .NET Core 3.1 integration and C# API improvements
- Multiple IG and Syncker improvements, dead reckoning for DIS protocol
- New content add-ons: Airport and Industrial assets
- UnigineEditor product in the Sim edition

![UNIGINE 2.12](https://developer.unigine.com/devlog/20200731-unigine-2.12/preface_big.jpg)

## Improved Particle Systems

### Better Simulation

Now you’ve got full control over various particles parameters, enabling you to control their values during the whole lifetime of your particles. The changes affected the Particle System object (*ObjectParticles*) itself along with the particles_base material. We’ve added a new visual Curve Editor to simplify adjustment of parameter’s behavior making the process more intuitive and flexible.

![](https://developer.unigine.com/devlog/20200731-unigine-2.12/particles_curves_color.gif)

So, some parameters can now be controlled via curves, some new parameters were added (like particle position enabling you to create swirls, for example), and UI for Particle Systems has become more intuitive and convenient.

![](https://developer.unigine.com/devlog/20200731-unigine-2.12/particles_curves_ui_1.gif)

A new Curve Editor:

![](https://developer.unigine.com/devlog/20200731-unigine-2.12/particles_curves_ui_2.gif)

### Motion Texture Support

Added a new texture - **motion**, containing vectors and providing smoother animation for sprite-to-sprite transitions. This can be useful in case you use particle texture atlases with high-resolution sprites and low number of frames. Such textures can be generated in EmberGen or Houdini.

![](https://developer.unigine.com/devlog/20200731-unigine-2.12/particles_motion_vector.gif)

### Emission

Emission color can now be controlled per-material (**`particles_base`**) via dedicated ***emission*** texture.

![Emission: Disabled](https://developer.unigine.com/devlog/20200731-unigine-2.12/emission_off.jpg)

![Emission: Enabled](https://developer.unigine.com/devlog/20200731-unigine-2.12/emission_on.jpg)

### Translucency

Translucency effects for particles can now be controlled per-material (**`particles_base`**) via dedicated ***translucence*** texture.

![](https://developer.unigine.com/devlog/20200731-unigine-2.12/particles_translucence.gif)

### Other Particles Improvements

- Two new separate passes (***Procedural Decals*** and ***Procedural Fields***) were added for rendering particles into procedural textures to be used by orthographic decals or height fields.
- *Albedo* and *Emission* colors of particles can now be changed via curves.

## 2x Physics Performance Optimization

Built-in physics has been significantly refactored with a set of optimizations (data preparation for the solver and others) and extended use of multithreading giving it a 2x boost.

![](https://developer.unigine.com/devlog/20200731-unigine-2.12/physics_perf.jpg)

### Easy Contacts Management

Getting all contacts for the body has become much easier now. As a matter of optimization in UNIGINE by design, contacts are distributed between the interacting bodies in a random manner (not to store each of them twice). This was a cause of a complication - in order to collect all contacts in which a certain body participates, you had to catch them in callbacks and put them to an array or vector to be processed later. Now all contacts of the body can be accessed right from this body as it holds both *internal* contacts (handled by the body) and references to *external* ones (handled by other bodies).

Another convenience is that you can now set the priority for a body in the process of contacts distribution, so that the most of them are stored by this body (e.g. when you detect collisions for your car) - it does not affect performance but makes iterating through them much faster.

### Unified Physics Callbacks

Physics callbacks for all APIs are now uniformly called from the main thread. These callbacks are mostly used to create, destroy, or modify objects, which is only allowed in the main thread. So, everything is safe now and there’s no need to write your custom asynchronous task queue.

## Advanced Landscape Terrain Details Control

We’ve seen a lot of requests from the community (on our forum and [discord server](https://discordapp.com/channels/620570438505857024/)) for detail management improvements and distance-dependent performance optimization. Well, here you are!

Visibility of Landscape Terrain details can now be configured depending on the density (texel size) - this option is an analogue of distance-dependent visibility applied to the Landscape Terrain implementation and is to be used for performance optimization.

![](https://developer.unigine.com/devlog/20200731-unigine-2.12/details_by_texel_size.gif)

Even more flexibility in setting up Landscape Terrain details is now available - you can control rotation and offset for details via the corresponding parameters of the **`landscape_terrain_detail_base`** material. These parameters can also be successfully used for tiling reduction.

![](https://developer.unigine.com/devlog/20200731-unigine-2.12/details_rotation_offset.gif)

### Detail Masks Dithering

You can now control dithering for detail masks of the Landscape Terrain to remove artifacts on smooth gradients of detail masks due to insufficient mask bitness. This parameter adds some jitter to the masks which may result in some additional noise but the final look gets much better. Jitter intensity is controlled, per-mask via the corresponding sliders and globally via *Settings -> Render-> Landscape* or via the [`**render_landscape_terrain_mask_dithering**`](https://developer.unigine.com/en/docs/2.12/code/console/#render_landscape_terrain_mask_dithering) console variable.

![](https://developer.unigine.com/devlog/20200731-unigine-2.12/details_dithering.gif)

### Other Landscape Terrain Improvements

- Fixed an issue with an *Additive* Heightmap brush of the Landscape Terrain behaving like in *Alpha Blend* mode.
- The *Erase* brush of the Landscape Terrain now works properly with height maps instead of affecting only opacity of the heightmap data.
- Data picker for the Heightmap brush now takes Height Scale into account.
- Fixed an issue with *LandscapeLayerMap* loading sometimes resulted in the `LandscapeFetch::fetchForce()` method failing to work properly.
- Fixed collision detection for the Landscape Terrain sometimes resulted in players falling under the terrain surface.
- Fixed Landscape Terrain generation from 32-bit EXR data sources.
- Added an ability to visualize debug albedo data of the Landscape Terrain via *Helpers->Landscape Data -> Albedo* (or via the `**render_show_landscape_albedo**` console command). ![](https://developer.unigine.com/devlog/20200731-unigine-2.12/show_landscape_data.png)
- Fixed padding artefacts on the surface of the Landscape Terrain when editing it with brushes.
- Fixed shader errors associated with Landscape Terrain rendering on AMD hardware using OpenGL API.

## Clouds and Atmosphere Improvements

Atmosphere in UNIGINE’s virtual world now looks even more true-to-life, with cloud system improvements and physically correct haze.

### Clouds On The Horizon

It is now possible to imitate curvature of the planet’s atmosphere, with the ability to set a specific radius for the planet eliminating the unnatural gap between the clouds and the ground at the horizon. This feature is performance-friendly, affects clouds only, works relative to the camera position, and is not taken into account in intersection detection. You can control the feature in the UnigineEditor via the *Settings -> Render -> Clouds* section (***Rounded*** and ***Planet Radius*** parameters) of the Settings window, or via the [**`render_clouds_rounded_*`**](https://developer.unigine.com/en/docs/2.12/code/console/#render_clouds_rounded) console commands.

![Curving: Disabled](https://developer.unigine.com/devlog/20200731-unigine-2.12/clouds_rounded_off_sm.jpg)

![Curving: Enabled](https://developer.unigine.com/devlog/20200731-unigine-2.12/clouds_rounded_on_sm.jpg)

### Physically Based Haze

A new physically based gradient calculation mode is now available for atmospheric haze rendering. The new haze now works correctly with clouds with default settings providing a realistic look out of the box. A set of clear and simple parameters, including height-dependent density control, enables you to fine-tune the result to fit your needs (tweak the color a bit, etc.).

![](https://developer.unigine.com/devlog/20200731-unigine-2.12/haze_height_falloff.jpg)

**Haze in 2.12**

### Tiling-Free Clouds

Tiling of the clouds coverage texture can sometimes be noticeable in large-scale worlds, but now there is a solution for that - simply enable the [***Fix Coverage Tiling***](https://developer.unigine.com/en/docs/2.12/editor2/settings/render_settings/clouds/#fix_tiling) option via the *Settings -> Render -> Clouds* section and enable the [***Fix Coverage Tiling***](https://developer.unigine.com/en/docs/2.12/content/materials/library/clouds_base/#fix_tiling) state in the **`clouds_base`** material. Another tiling reduction feature is on the way (expected in 2.13) - it shall affect the 3D noise used for clouds generation, so tiling will be totally wiped out from the sky.

### Other Clouds Improvements

- Added a new [*Attenuation Coefficient*](https://developer.unigine.com/en/docs/2.12/content/materials/library/clouds_base/#attenuation_coefficient) parameter to the **`clouds_base`** material enabling you to control the rate of opacity growth (alpha channel) with the distance inside the cloud, imitating cloud volume and fixing a break at a certain height appearing in the process of rendering curved cloud layers when viewed from inside the layer.
  ![Lower Attenuation Value](https://developer.unigine.com/devlog/20200731-unigine-2.12/clouds_attenuation_low_sm.jpg)
  ![Higher Attenuation Value](https://developer.unigine.com/devlog/20200731-unigine-2.12/clouds_attenuation_high_sm.jpg)
- Detail noise in the **`clouds_base`** material is now unbound from the base noise with a new [*Base Noise Mip Offset*](https://developer.unigine.com/en/docs/2.12/content/materials/library/clouds_base/#base_noise_mip_offset) parameter added to control mip levels of the base noise texture in order to reduce blurring at large distances.

### Work-In-Progress

In the research branch we have even more improvements for the clouds (including support for Cumulonimbus) and the weather system in general, including a major upgrade of the regional weather system.

Please note that these improvements are under active development, they are planned to be available in full for UNIGINE customers in 2.13+ SDK releases.

![](https://developer.unigine.com/devlog/20200731-unigine-2.12/clouds_wip_1.jpg)![](https://developer.unigine.com/devlog/20200731-unigine-2.12/clouds_wip_2.jpg)![](https://developer.unigine.com/devlog/20200731-unigine-2.12/clouds_wip_3.jpg)

## Animation Improvements

More advanced and convenient control over skinned mesh animations is now available. Each bone of a skinned mesh can now be bound to a separate node to control its transformation giving you a lot of flexibility. For example, you can animate these nodes via the *Tracker* tool or enable physics-based control over skinned mesh bones binding them to nodes driven by physics. You can fine-tune animations for your skinned mesh via the [*Bones*](https://developer.unigine.com/en/docs/2.12/objects/objects/mesh_skinned/#setting_bones) section of the *Parameters* window right in the *UnigineEditor*, using an improved bones visualizer for monitoring. For your convenience the *Bones* section also displays bones hierarchy of the selected skinned mesh. This functionality is also available via API.

Bones that are not attached to the skeleton shall now be imported by default ([*Import Bones Without Skin option*](https://developer.unigine.com/en/docs/2.12/editor2/fbx/#fbx_import_bones_wo_skin)).

![](https://developer.unigine.com/devlog/20200731-unigine-2.12/animation_bones_control.gif)

### Looped Animation Smoothing

Added an ability to smooth looped animation playback for imported animations - simply check the [*Forced Loop*](https://developer.unigine.com/en/docs/2.12/editor2/fbx/#fbx_force_loop) option in the Animation Import parameters for your mesh- or FBX-asset and set the number of frames to be used for smoothing.

![](https://developer.unigine.com/devlog/20200731-unigine-2.12/animation_forceloop.gif)

## Materials Loading Modes

By default materials loading in UNIGINE is optimized for moderate spikes reduction, average memory consumption and loading time at Engine’s and Editor startup. In case of insufficient memory capacity or when it is necessary to perform a lot of iterations quickly (e.g. development stage) you might want to sacrifice spikes reduction to save memory and increase loading speed. Or, on the contrary, you might want to reduce spikes during run time as much as possible (e.g., for simulators or other applications). Now you can choose between three materials loading modes to fit your needs:

- **No caching** - minimum memory consumption and maximum Engine loading speed. *Recommended for fast iterations during the application development phase.*
- **Caching for materials** - slightly slower loading at Engine's startup and more memory used than for the first mode, but less spikes. *Can be used for a small project having a small number of materials (in case of satisfactory performance and sufficient memory amount).* This mode is **enabled by default**. Switch mode for faster loading or better spikes reduction when necessary.
- **Caching for materials and shaders** - this mode ensures stable work and significant spikes reduction, but takes a lot of memory and increases loading time at startup. *Recommended for production phase (when you hand over your application to the end user).*

![](https://developer.unigine.com/devlog/20200731-unigine-2.12/materials_control.png)

You can set this mode via the new [`**materials_loading_mode**`](https://developer.unigine.com/en/docs/2.12/code/console/#materials_loading_mode) console command, as well as via the corresponding option in the configuration file.

## New Boot, Splash, and Loading Screens

![](https://developer.unigine.com/devlog/20200731-unigine-2.12/boot_screens.png)

We’ve completely redesigned splash screens in UNIGINE applications. Up to 2.11 you had a system, and world splash screens. Now there are three types of screens available:

- **Engine boot screen**
- **Splash screen** with UNIGINE logo animation
- **Loading screens** for other purposes (world loading, etc.)

Boot and Loading screens are highly customizable (offer you a lot of flexibility in customization). You can add any custom messages (with Rich Text formatting supported) or modify existing ones to display progress or any other information to the user. Callbacks enable you to connect to boot/loading screen render to add something to it, like render some custom 3D model, add widgets, etc.

Good news - we made **customization available for everyone** - from now on customization of loading screens and Engine boot screen is available for all editions starting from the *Community* one (the Splash screen cannot be changed or removed in the *Community* edition, but it is possible in *Community Pro*, *Engineering*, and *Sim*).

For more information on loading and boot screens, as well as customization, please refer to the [dedicated article](https://developer.unigine.com/en/docs/2.12/code/gui/screens/).

## Engine Configuration Files

We have analyzed Engine configuration parameters stored in the **unigine.cfg** file in the project’s **bin** folder and decided to split them into separate groups to optimize management.

![](https://developer.unigine.com/devlog/20200731-unigine-2.12/config_files.png)

Now, instead of a single file, there are four in the **data/configs** folder (but you can move them to other locations if necessary):

- **`default.boot`** - the main configuration file with Engine startup parameters, world to be loaded by default (`starting_world`), World Manager settings, and links to other configuration files as well.
- **`default.config`** - all settings available when working with the *Config* class in API.
- **`default.controls`** - keyboard control keys and settings defining the mouse behavior.
- **`default.user`** - various personal settings, such as helpers (wireframe, profiler, etc.)

## Specular Anti-Aliasing

Rendering scenes containing both complex geometry and highly specular materials is a challenging task. A high quality image requires finding all tiny speckles induced by geometry as well as elongated anisotropic highlights that can often have areas of sub-pixel size.

Presence of normal maps and displacement maps makes the problem even worse. Moreover, as the roughness of the material is decreased, these highlights increase their intensity, while their area decreases.

![Specular AA: Off](https://developer.unigine.com/devlog/20200731-unigine-2.12/specular_aa_off.jpg)

![Specular AA: On](https://developer.unigine.com/devlog/20200731-unigine-2.12/specular_aa_on.jpg)

Specular AA helps fight such artefacts by increasing roughness at places where normals change their orientation. Simply enable the [***Specular AA***](https://developer.unigine.com/en/docs/2.12/content/materials/library/mesh_base/#option_specular_aa) state in the **`mesh_base`** material, adjust *intensity* and *threshold*, and that’s it. Normal map is not required, as the geometry of the model is used. This feature is available for the *Metalness* workflow only.

## Ranges For Screen Space Shadows

Screen Space Shadows, a great feature to provide a consistent image with shadows rendered for objects at any distance from the camera at a low cost, has become even better. You can now set different *Step Size* and *Threshold* values for objects located near the camera and far away from it. Thus, full-scale shadows will be rendered for large objects located far away, while within the close distance range only shadows cast by small objects will be rendered. This feature is especially useful for locations where details are required for both short and long-distance ranges.

![](https://developer.unigine.com/devlog/20200731-unigine-2.12/screen_space_shadows.gif)

New settings adjusted per-light are available in the [***Screen Space Shadows***](https://developer.unigine.com/en/docs/2.12/objects/lights/parameters/#ss_shadow_settings) section of the light source’s parameters.

## Integration of .NET Core 3.1

Having started with .NET Core 2.2 support, we have now implemented support for 3.1 released in December 2019. It is a Long-Term Support (LTS) version, which means it will be supported for three years. This update brings you many fixes and new features as well:

- Better performance.
- Garbage collection improvements (reduced memory consumption).
- C# 8.0 support.
- Support for Windows desktop applications using Windows Presentation Foundation (WPF) and Windows Forms.
- A lot of bugs fixed and much more.

Please note that the minimum required Visual Studio version is now 2019 (only for C# projects using the Component System). We have also added support for the cross-platform JetBrains Rider IDE.

## Updated Character Controller Component

We have revised our character controller component to simplify player management in your C# projects built on the basis of the Component System and make adjustment and debugging easier.

![](https://developer.unigine.com/devlog/20200731-unigine-2.12/player_component.jpg)

The new *FirstPersonController* component is available in all relevant C# project templates with the following updates:

- Y axis now points forward for the player.
- Added simplified support for Gamepad.
- Additional flags for optional use of jump, crouch, and run, as well as for default always-run mode are now available. As well as a set of parameters to control player’s flying behavior, e.g., angle for sliding against the walls.
- Extended debugging options with the support for Profiler. Color customization for debug information output for your convenience.
- Additional debug camera to look at the player from a third-person view. This camera either follows the player with the same orientation, or can be rotated freely as well as shift closer to the player and away from it.
- The transformation of the node, to which the component is assigned, now properly affects player’s transformation.

## C++ Component System Changes

Our pioneer C++ Component System, initially implemented as a user-customizable feature attached to the UNIGINE Core, has become a part of the Engine now. This means that checking additional options to enable the Component System when creating a new C++ project is no longer required, and what is more, you won’t have to migrate the Component System in your projects manually. The next step is refactoring to improve usability of the C++ Component System and make it as convenient as the one used for C#.

## Other Engine Improvements

- Fixed an issue with *ObjectWaterGlobal* rendering.
- Fixed rendering artefacts sometimes occurring in case of a large number (thousands) of static meshes rendered in the scene.
- Batching-related issues sometimes resulting in disappearing objects are fixed now.
- Shadows shall again behave correctly in case of setting up Viewport masks for objects' surfaces.
- Fixed an issue with *Mesh Clutters* disappearing when oriented at certain angles relative to the camera’s view direction.
- Fixed an issue with transparent objects (*Alpha Blend*; *Additive*; *Multiplicative* preset) ignoring the *Render Transparent* option when rendered inside Environment Probes in case the *Multiple Env Probes* mode is disabled.
- Fixed an issue with the `World::getNodeByName()` method occurring when loading a node and trying to find it by name.
- Fixed full window mode (***video_fullscreen 2***) when an application window is rendered borderless, without decorations.
- Fixed an issue with *PlayerPersecutor* losing its target after being exported to a node reference.
- Collision shapes will be displayed even when objects' surfaces are disabled.
- Fixed an issue with incorrect *StringStack->char\** conversion resulting in incorrect return values of FileSystem::getModifier() and `Material::getPath()` functions.
- The `loadWorld()` method in case of failing to load a world file shall now display its name instead of the GUID.
- Fixed alpha-related issues for *Mesh Decals* with *Screen Projection* option enabled and *Alpha Blend* / *Alpha Test* transparency preset selected.
- Fixed *Voxel Probe* rendering artefacts in case of enabling the *Cubic Filtering* option.
- Fixed an issue with Environment Probe being rendered as dynamic even when Dynamic Reflections are disabled globally.
- *Grass* and *Clutter* masks are now properly reloaded after being modified using a third-party software.
- Added an ability to change node’s transformation without affecting its children, as sometimes it might be useful to transform just the parent relative to them. The functionality is available via API (`setTransformWithoutChildren()` and `setWorldTransformWithoutChildren()` methods).
- Added support for 24-bit WAV files.
- You can now create widgets via API without specifying a GUI simplifying your code, in this case a new widget will be added to the Engine GUI. New constructors were added for all widgets.
- *WidgetMenu* is now rendered atop of all other widgets eliminating issues with z-ordering.
- Changed Profiler colors to make them more distinctive improving the visual look of the Profiler graphs and values displayed.
- Fixed an issue with the first bounce calculation when baking lighting for overlapping *Voxel Probes*.
- Added [callbacks](https://developer.unigine.com/en/docs/2.12/api/library/rendering/class.render#CALLBACK_BEGIN_SHADOWS) to be called before and after shadows rendering stages for *World, Projected*, and *Omni* light sources.
- Now you can get the Engine version, build configuration, and precision via API. See the [`Engine::getVersion()`](https://developer.unigine.com/en/docs/2.12/api/library/engine/class.engine#getVersion_const_char_ptr), [`Engine::isDouble()`](https://developer.unigine.com/en/docs/2.12/api/library/engine/class.engine#isDouble_int), and [`Engine::getBuildConfig()`](https://developer.unigine.com/en/docs/2.12/api/library/engine/class.engine#getBuildConfig_const_char_ptr) methods respectively.
- Fixed issues with setting waves control parameters of the *Water Mesh* object.
- Replaced getters and setters with properties in the C# API of the *Mesh* class for the sake of consistency.
- Fixed error messages in the *Console* related to setting detail materials of the *Landscape Terrain* on reloading materials.
- Fixed XPad controller buttons becoming unresponsive in some cases. The right order of buttons was set for Linux.
- UNIGINE’s log file has changed its format from *html* to *txt*, reducing file size due to removed excessive formatting and making it easier and faster to load. For your convenience the following two custom color schemes highlighting log syntax for Notepad++ are included in the SDK:
    - **`<SDK>/utils/log_styles/notepad_light.xml`**
    - **`<SDK>/utils/log_styles/notepad_dark.xml`**

**Visualizer updates:**

- Improved the look of the visualizer for collision shapes.
- You can now control depth testing for each Visualizer element (point, line, triangle, circle, etc.) as well as time period during which each element shall be displayed. The corresponding arguments were updated for all related methods of the Visualizer class.
- Vectors drawn by the Visualizer are now scaled properly.
- Changed the zero default message font size for the Visualizer, so the message shall be displayed even in case the font size is not specified when calling the `renderMessage()` method.

## Removal And Deprecation List

- *World Layer* and *World Cluster*, which were [marked earlier as deprecated](https://developer.unigine.com/en/devlog/20200410-unigine-2.11#f6d74773f125a2ac6729f7ac02389bbb), are removed.
- `WorldLogic::destroyRenderResources()` has been removed since now reloading of all graphic resources is automatically handled by UNIGINE when the video mode is changed.
- *Sun Shafts* effect has been considered deprecated and removed. It is recommended to use Volumetric objects instead.
- `Render::renderProcedurals()` method as well as textures of the "*filter*" type are considered deprecated and will be removed in future versions. Please, use [scriptable materials](https://developer.unigine.com/en/docs/2.12/content/materials/#scriptable_materials) instead.

## Earthworks Demo

So many times we were asked if it is possible to dig the ground… Well, now it is possible - check out the new ***Earthworks*** demo project (available for *Sim* SDK edition only). Featuring a backhoe loader, that you can operate to drive across the construction site, dig holes and trenches. Digging is performed via voxelization of terrain volume inside the bucket and baking of voxels back into the heightmap after dumping. More features are yet to come.

**Video (YouTube):** https://www.youtube.com/watch?v=jCuizWLDGjE

Dynamic excavation zone size is 300x300x20 meters, voxel size is 10 cm. In addition to the voxel-based simulation of precision digging, the demo uses runtime terraforming ([*ObjectLandscapeTerrain*](https://developer.unigine.com/en/docs/2.12/objects/objects/terrain/landscape_terrain/)) as well.

![](https://developer.unigine.com/devlog/20200731-unigine-2.12/earthworks_1.jpg)![](https://developer.unigine.com/devlog/20200731-unigine-2.12/earthworks_2.jpg)![](https://developer.unigine.com/devlog/20200731-unigine-2.12/earthworks_3.jpg)

## UnigineEditor

![](https://developer.unigine.com/devlog/20200731-unigine-2.12/editor_updates.jpg)

### Better Presets Management

We've improved management of *Render, Physics*, and *Sound* settings making it flexible and convenient. Switching between the presets is much easier now, simply select the corresponding preset in the dropdown, all settings will be applied automatically.

![](https://developer.unigine.com/devlog/20200731-unigine-2.12/preset_switcher.png)

You can save your settings to the selected preset by simply clicking ***Save*** or save them to a new one via the ***Save As New*** button. There is also an ability to revert your changes made to the preset via the corresponding button.

![](https://developer.unigine.com/devlog/20200731-unigine-2.12/presets.png)

For your convenience there is also a new **[From World]** option enabling you to use *render*, *sound*, and *physics* settings stored in a **`*.world`** file, that is currently loaded.

### Other Editor Improvements

- Creation of nested mount points is now supported.
- Fixed an issue with removing a mount point from the *Asset Browser* after deleting the corresponding file via the file browser.
- In case an asset requires your attention or has any problems associated with it, you will see it marked with the exclamation sign in the *Asset Browser*.
- A new button was added to the shader compilation message displayed in the viewport enabling you to stop the process of shaders cache generation in case the UnigineEditor’s UI response has become too slow.
  ![](https://developer.unigine.com/devlog/20200731-unigine-2.12/precompilation_off_btn.png)
- The total number of currently selected nodes shall now be displayed in the *Parameters* window.
  ![](https://developer.unigine.com/devlog/20200731-unigine-2.12/selected_nodes.png)
- The camera speed can now be adjusted by holding the right mouse button and spinning the mouse wheel in the Editor Viewport. Use the *Shift* and *Ctrl* keys as modifiers for the speed of change.
- Fixed an issue with animating *float* property parameters in the *Tracker* tool.
- The *Texture Cache Preload* parameter responsible for loading textures at the Engine startup was moved from Streaming settings (*Settings->Render->Streaming*) to the Engine startup configuration file (**`data/default.boot`** by default).
- Current selection is no longer affected when clicking on elements inside an imported FBX-asset, the information displayed in the *Parameters* window does not change.
- Hitting *Esc* on the keyboard in the UnigineEditor shall clear the current selection.
- Fixed an issue with setting *Max Visibility* for the last LOD to ***-inf*** instead of ***inf*** when importing a model with LODs having the *Combine By Postfixes* option enabled.
- *Collision* for the ground plane in the template world is now enabled by default.
- Fixed an issue with wrong mask texture format being set upon mask creation for *Grass* and *Clutter* objects restricting modification of these masks.
- Fixed an issue with assigning a water body to a *WaterMesh* object.
- Fixed an issue with the *Run* button ignoring the first click event after switching between the windows with *Alt+Tab*.
- Fixed a crash on reimporting an FBX asset when the *Asset Browser* displays its contents.
- Fixed issues with applying changes made to an FBX asset on re-importing it.
- Restored missing creators for *Decal => Particles, Water => FieldHeightParticles, Water => DecalParticles*.
- Fixed an issue with some parameters of a C# Component being hidden after re-importing.
- Fixed a crash on launching the Editor with ***-video_app null***.
- For your convenience all fields in the UnigineEditor where you specify coordinates (X, Y, Z) are now color-coded.
  ![](https://developer.unigine.com/devlog/20200731-unigine-2.12/xyz_color.png)
- Fixed issues when performing reparenting operations between ULON-based and old XML-based materials.
- Added reset buttons for *Filmic Tone Mapper* settings in the *Camera Effects* section.
- Renamed the *Radius* parameter of the Smooth brush to *Smooth Intensity* for the sake of clarity.
- Fixed an issue with Video Grabber not working when UnigineEditor is out of focus.

## Multi-Channel Rendering and Image Generator Updates

### Syncker Plugin

- Added an ability to connect additional slaves on the fly (***sync_allow_extra_slaves 1***) for the synchronous mode (***sync_async = 0***). However, stable work may require additional effort as channels launched with a significant delay can skip some packets sent from the Master.
- In case only the Master is present (***-sync_count 1***) and connection of additional slaves on the fly is enabled (***sync_allow_extra_slaves 1***) the session shall start immediately and last forever (until the Master is on).
- The *setSlavePlayer(slave_index/view_name, player)* method now affects only the specified Slave as expected. Synchronization settings for all other Slaves will remain the same and the camera will be automatically changed for them after calling the `Game::setPlayer()` method on the Master. A crash related to calling the `setSlavePlayer()` method for a new connected slave was also fixed.
- Added a new `SKIP_FLAGS::SET_PLAYER` flag for Slaves to ignore `setSlavePlayer()` calls by the Master for them.
- Function call buffering is enabled for Syncker. In case of calling `Master::loadNode()`, `Master::loadNodeReference()`, or `Master::createNode()` methods on the Master these calls are put to a buffer and sent to each new Slave connecting during the active session (***sync_allow_extra_slaves 1***).
- Fixed issues with the `Master::createNode()` method, now it returns a *bool* value (*true* - on success).

### IG Improvements

![](https://developer.unigine.com/devlog/20200731-unigine-2.12/IG_2.jpg)

### Dead Reckoning

Extended DIS protocol support and added implementation of Dead Reckoning algorithms (*Static*, *FPW*, *RPW*, *RVW*, *FVW*, *FPB*, *RPB*, *RVB*, *FVB*) used in Advanced Distributed Simulation to reduce the need to continually update a simulated entity's state information. These algorithms are available in the Entity State PDU.

Velocity and acceleration of an entity used to perform extrapolation can be set in IG via the `Entity::setVelocity()` method (former *setRate*) and *Entity::setAcceleration(linear, angular_deg)* method. As for CIGI, we’ve added support for Trajectory Definition (X, Y, and Z Acceleration).

#### Packet IDs

The `sendUserMessage()` method now has a packet ID argument, so now you can tell exactly what was sent, unlike in 2.11 and earlier versions. This method can be called from anywhere and at any time you can subscribe to any packet you want.

#### Initialization

Added a new *OnIGReady* callback - it is used for initialization of various user settings. Since 2.12 you can initialize your settings **only when the IG is ready**, otherwise Slaves may not receive some data. The best place for initialization of user settings is inside this callback.

#### Loading Worlds

The **`world_load`** console command doesn’t work now!

Do not use the following in your launchers:

**Shell commands**

```shell
-console_command "world_load world_name"
```

It is recommended to specify the ID of the desired database in the `autoload_database` parameter of the **`ig_config.xml`** configuration file instead.

To load the world in case you don’t have a connector available and the default world is not set you can use the following console command: ***database_load [id]***

#### Working with Cameras

Cameras in IG are synchronized in a special way.

IG now has the following methods to set the desired view for a Slave:

- *void setCurrentView(int view_id);*
- *void setSlaveView(int slave_index, int view_id);*

![](https://developer.unigine.com/devlog/20200731-unigine-2.12/IG_1.jpg)

A view is an IG wrapper for the player, so you can manage a camera via the view only.

In case of a multi-channel application the following methods of the View class can be used:

- `copyDefinitionFromPlayer()` - to copy projection from a usual camera to the view.
- `copyTransformFromPlayer()` - to copy the transformation of a usual camera to the view.

You can also create a dedicated component to copy all camera settings to the view each frame, when necessary.

In the configuration file you can set the desired view for each *Slave* and specify if it is affected by the *Syncker’s* projections:

**Source code (XML)**

```xml
<syncker_channels>
	<channel syncker_name="center_view" view_id="0" use_syncker_projection="1"/>
	<channel syncker_name="left_view" view_id="0" use_syncker_projection="1"/>
	<channel syncker_name="ground_cam" view_id="1" use_syncker_projection="0"/>
</syncker_channels>
```

## Sim SDK Licensing Changes

Very often, when your UNIGINE application is already in the maintenance phase and is actively used, it might be necessary to make some changes to virtual scenes, add new entities, or adjust settings - perform any operation you usually do in the UnigineEditor. You don't actually need the whole SDK, just the Editor, and you wouldn't like to overpay. Introducing a new ***UnigineEditor*** product, with its own licensing plan, enabling you to open any world in your project and make necessary updates just like you would do with a regular SDK, but for a reduced price. The feature is available for *Sim* edition only.

![](https://developer.unigine.com/devlog/20200731-unigine-2.12/editor_product.jpg)

So with the introduction of UnigineEditor as a separate product, there are two types of development licenses now, providing better budget flexibility:

- **Full SDK Seat** - all the tools, including C++ / C# / UnigineScript API access, editor, samples and demos (useful for programmers and content creators)
- **Editor Seat** - editor only (useful for content creators only)

There are also three types of runtime licenses for the *Sim* edition now, more budget-flexible as well:

- **IG Channel** - enables you to launch an application using *IG* (*AppEasyBlend*, *AppProjection*, *Syncker*, etc.) and *VR* plugins (see the list below).
- **VR Channel** - enables you to launch an application using *VR* plugins (*AppOculus*, *AppVarjo*, *AppVive*, *TeslaSuit*, etc.).
- **Desktop Runtime** - any other application with base plugins, except for IG and VR.

Please contact your account manager for more info on pricing and licensing options, or email at [`licensing@unigine.com`](mailto:licensing@unigine.com) if not a customer yet.

## Demos and Samples

![](https://developer.unigine.com/devlog/20200731-unigine-2.12/samples.jpg)

The ***Normal Maps*** sample from the **Art Samples** suite was improved with a demonstration of the best way to use. New samples were added to the **Art Samples** suite:

- Particles parameters set via curves.
- Settings of the **`particles_base`** material.
- Example of a forest fire created using particle systems and decals.

## Add-Ons

### Industrial Assets

Introducing a new add-on with a set of ready-to-use assets with LODs, that can be used to create various industrial scenes, including vehicles (such as trucks, minibus, pickup, backhoe loader, etc.), containers, fences, mobile light tower, diesel generator, and many others.

This add-on is available for free in the *Engineering* and *Sim* SDK editions.

![](https://developer.unigine.com/devlog/20200731-unigine-2.12/addons_industrial_1.jpg)

![](https://developer.unigine.com/devlog/20200731-unigine-2.12/addons_industrial_2.jpg)

### Airport Assets

Another new add-on contains a set of ready-to-use assets with LODs, simplifying creations of various airport scenes, including vehicles (such as buses, tractors, trucks, light-duty vehicles, etc.), ladders, carts, fences, masts and towers, airport and airfield lights, and a lot more.

This add-on is available for free in the *Engineering* and *Sim* SDK editions.

![](https://developer.unigine.com/devlog/20200731-unigine-2.12/addons_airport_1.jpg)

![](https://developer.unigine.com/devlog/20200731-unigine-2.12/addons_airport_2.jpg)

### VFX

All particle systems in the **VFX** add-on were updated to use the new curve-based workflow.

![](https://developer.unigine.com/devlog/20200731-unigine-2.12/addons_vfx.jpg)

### Vegetation

The **Vegetation** add-on was updated with a set of trees, small plants, and different grass types used in the Fox Hole demo.

![](https://developer.unigine.com/devlog/20200731-unigine-2.12/addons_vegetation.jpg)

## New Multilingual Website

We are excited to announce the launch of our new redesigned official website with the most accurate, up-to-date information on all our products and services available in English, German, French, Chinese, and Russian (more languages are to be added soon).We are excited to announce the launch of our new redesigned official website with the most accurate, up-to-date information on all our products and services available in English, German, French, Chinese, and Russian (more languages are to be added soon).

Please visit us at [unigine.com](https://unigine.com).

![](https://developer.unigine.com/devlog/20200731-unigine-2.12/ucom.jpg)

Also, we are working on the localization of the official SDK documentation, in addition to providing localized subtitles to video-tutorials.

## Learning Materials

We have launched a new UNIGINE training video format - **Technical Livestreams With Experts**:

The first one is about Making a C# Car Project:

**Video (YouTube):** https://www.youtube.com/watch?v=ROy9oGPnABE

The next one on Assembling a Village Scene:

**Video (YouTube):** https://www.youtube.com/watch?v=ar2O1Ao5GAk

Added a new video tutorial on the **Landscape Terrain**:

**Video (YouTube):** https://www.youtube.com/watch?v=DhINNCo6Gg4

and a set of new ultrashort **HowTo quick tip** videos in English, Chinese, and Russian:

**Video (YouTube):** https://www.youtube.com/watch?v=videoseries

### In-Place Documentation for API Methods

It's good to have API documentation, but it’s much better when method descriptions, at least basic ones, are always at hand, available in your IDE while you code. We’ve made the first effort to provide you with in-place API documentation for C#/C++.

![](https://developer.unigine.com/devlog/20200731-unigine-2.12/docs_ide.gif)

Descriptions for some of the methods may be missing, but they will be added in the upcoming releases.

### Other Documentation Changes

- Added an article on [Garbage Collector](https://developer.unigine.com/en/docs/2.12/code/csharp/garbage_collector).
- Added an article on [Working with Landscape Terrain via Code](https://developer.unigine.com/en/docs/2.12/code/usage/landscape_terrain/index).
- Added a new [HowTo](https://developer.unigine.com/en/docs/2.12/videotutorials/how_to/) section for ultrashort video tutorials.
- Added a new article on the new [Curve Editor](https://developer.unigine.com/en/docs/2.12/editor2/curve_editor/).
- The complete list of API changes is available in the [API Migration Guide](https://developer.unigine.com/en/docs/2.12/upgrade/migration_api).
- The complete list of Console command changes is available in the [Console Migration Guide](https://developer.unigine.com/en/docs/2.12/upgrade/migration_console).

The up-to-date list of learning materials can be found in the new [Learning Support](https://unigine.com/learning-unigine/?sa=D&ust=1596115779446000&usg=AFQjCNFArYSXcSfzF8bSfxnGq6GX9FrUXA) section of the website.

## New Landscape Tool (WIP)

Our tools team is currently working on a new version of the *Landscape Tool*. The main goal is to provide UNIGINE users with a convenient terrain generation tool supporting the new *LandscapeTerrain* object introduced in 2.10. One of the new features is the ability to pull terrain generation data from common open server protocols (***WMS***, ***TMS***, ***WFS***, and others). As data sources, you'll be able to specify both, open services (such as [***OpenStreetMap***](https://www.openstreetmap.org/) or various state/municipal databases) or private tile servers created and supported by users on the basis of services similar to [***QGIS***](https://qgis.org/en/site/). To generate a terrain using the data from the *OpenStreetMap* TMS-service simply mark the desired area on the world map, enter service URL and desired zoom value - that’s it! More popular protocols and useful features are to be added.

The new *Landscape Tool* is still in an R&D branch and is **not included in UNIGINE 2.12 SDK**, but stay tuned as the release is coming.

**Video (YouTube):** https://www.youtube.com/watch?v=P2SdTHqljBU

**Notice**: UNIGINE 2.12 SDK requires SDK Browser version **1.9.26** or later.

**PS:** Special thanks to all the beta testers from our amazing user community on the [forum](https://developer.unigine.com/forum) and [discord](https://discord.com/invite/gFN7w9b). You are awesome!
