UNIGINE 2.18: Performance Optimizations, Built-In VR, New Exposure & Tonemapper, New Event System, Experimental Animation Improvements
- DirectX 12 and Vulkan as primary graphic APIs
- VR in-the-core: no plugins, unified API, wider range of VR devices
- Numerous performance optimizations
- Optimized RAM consumption
- New event system instead of callbacks
- Asynchronous shader compilation
- Improved morph target support
- (Experimental) animation system improvements (new API, basic IK, retargeting, frame masks)
- Improved exposure and white balance correction
- Local tonemapper
- Multiple visual improvements: sharpen and blur for mipmaps, faster subsurface scattering, improved translucence, much more
- OpenSSL support
- Editor: batch rename, more visualizers, better world nodes hierarchy, updated cleaner, a lot of QoL improvements
- New Drone demo-project
- Free learning course
This release brings you more stabilization and reliability for DirectX 12 and Vulkan including out-of-the-box engine-core VR support, numerous performance optimizations and quality-of-life improvements here and there for both Engine and Editor, massive pack of updates for most of the Editor tools, a set of important updates for animations along with a new animation system (experimental in this release, but already on its final straight), a new event system to replace outdated callbacks, a new Drone demo, and much more.
DirectX 12 & Vulkan As Primary Graphic APIs
We continue polishing integration of DirectX 12 and Vulkan including further stabilization, optimizations, and new functionality. The following things were done:
- Integrated D3D12 Memory Allocator removing spikes on creation of static meshes and read-only textures.
- Fixed crashes on baking lights with high number of samples in large scenes.
- Fixed offscreen rendering for Vulkan on Linux.
- Projects using the Projection plugin now work as expected on Vulkan and DX12.
- Fixed issues with incorrect frame rate displayed on DX12 depending on Vsync settings in the NVIDIA Control Panel.
- Fixed an issue with updating the projection matrix on DX12.
- Primitives and Total GPU counters in the Performance Profiler now display correct values for Vulkan (except for AMD GPUs).
- Fixed a crash on minimizing a window (Vulkan + AMD).
- Fixed an issue with linear and curved 360-degree panorama rendering on Vulkan.
- Apart from that a number of crashes and minor issues were fixed to ensure stable and reliable operation.
A pack of optimizations was introduced improving CPU performance.
General Performance Optimizations
Reduced RAM Consumption
We continue to enhance overall engine resource-efficiency. This time, we have made a complex of numerous improvements for nodes (decals, mesh clusters, mesh clutters) that effectively reduced RAM consumption.
A significant reduction of around 20% in RAM consumption by materials has also been achieved.
Faster Subsurface Scattering
We have improved performance of the Subsurface Scattering (SSS) effect resulting in a 2x boost while producing the same image.
Interleaved Indirect lighting
As a performance optimization we have added interleaved rendering for indirect lighting - instead of rendering 4 neighboring pixels of indirect lighting at once, they're rendered during 4 subsequent frames resulting in 4x indirect lighting performance gain. Up to 2.18 you could only use Interleaved mode for the lighting as a whole, but sometimes it's enough optimizing indirect lighting only, while leaving direct lighting as is. The former Indirect Lighting option has been renamed to Direct Lighting Interleaved Rendering.
Denoiser is a cool but rather heavy effect for a GPU, as it uses a very complex blurring algorithm. To increase performance you can turn on Interleaved mode and its calculation in full-resolution will be split between 4 frames. Thus, the effect will become 4 times faster.
We have optimized rendering of the World Light source to make it less performance consuming by introducing the One Cascade Per Frame mode. This mode distributes the update of shadow cascades across multiple rendering frames: shadows from static geometry are rendered into only one cascade per frame.
The difference in shadows rendering performance with and without this optimization (tested on our Oil Refinery demo project) for DirectX12 and Vulkan is shown in the table below (the values can differ depending on the particular project's content and settings).
Another option to save performance of your application relates to shadows rendering which are expensive.
Shadow maps are normally rendered separately for each viewport when multiple viewports render the scene. It is important as each camera that renders into the viewport has its unique transformation. However, in cases when cameras are close to each other, shadows appear very similar, so for certain viewport and camera configurations you can save resources by enabling the Reuse Shadows mode (render_shadows_reuse console command). In this mode, the shadow maps are rendered only for the main viewport and then used for the others.
The difference in rendering performance depending on the
While this technique offers a performance gain, it isn't a silver bullet and may cause artifacts.
Asynchronous Shaders Compilation
UNIGINE streaming system now provides asynchronous shader compilation and loading. This improvement has significantly enhanced performance by resolving the issue of the Engine freezing during shaders compilation.
Also, it has resulted in some API changes. Previously, all necessary subshaders (vertex, fragment, etc.) were required to be loaded before compiling a shader program. You also had to consider the loading order of subshaders, as it affected the result. Now, UNIGINE compiles shader programs with all necessary subshaders at once.
Two compilation modes are available: Asynchronous and Forced. In the Forced mode, all shaders required for the current frame are compiled and loaded to RAM simultaneously in the current thread. The default mode is Asynchronous.
You can switch between modes in one of the following ways - in UnigineEditor (Settings-> Rendering -> Streaming -> Shaders -> Compile Mode), via the console (render_shaders_compile_mode), or via API.
The Performance Profiler now provides information on the number of compiled and loaded shaders.
Updated FPS Counter
Measuring your application’s frame rate in frames per second (FPS) is not ideal for delivering consistent experiences for users. Suppose, at run-time, your app renders 59 frames in 0.7 seconds, but the 60th frame takes 0.3 seconds to render. The average frame rate of 60 FPS is good, but in fact users will get a stutter effect since the last frame takes 0.3 seconds.
Therefore it’s important to aim for a specific time budget per frame, which is CPU time + GPU time. This provides you with a solid goal to work toward when profiling and optimizing your application, and creates a smoother and more consistent experience for users. Each frame will have a time budget based on your target fps. An application targeting 60 fps should always take less than 16.66 ms per frame (1000 ms / 60 fps).
We have updated the Engine FPS counter to make it more useful and informative - in addition to the frame rate counter you'll see the following two counters (in milliseconds):
- CPU - showing the time taken to prepare the current frame on CPU
- GPU - showing the time taken to render the current frame on the GPU
In case there is a CPU bottleneck, you'll see 'CPU bound' for the GPU counter and vice versa. In case you have VSync enabled - the counter will also indicate it.
- You're GPU-bound if frame rendering on GPU side takes more time than processing on CPU exceeding the frame budget, in this case GPU optimization is required.
- You're CPU-bound if frame processing on CPU side takes more time than rendering it on GPU exceeding the frame budget, optimizing GPU performance won’t help here at all.
Exposure and White Balance Correction
We have added an option to make auto-exposure adjustment more flexible and convenient enabling you to control overall scene saturation via a correction curve to fit your needs.
We have added a Metering Mask texture to Camera Effects settings to control the influence of auto exposure and white balance correction for the whole screen, where each pixel is weighted in importance in accordance with the specified texture mask. Giving importance to pixels toward the center of the screen rather than along the edges helps stabilize auto exposure.
We have put a lot of effort into reduction of artefacts appeared after the introduction of the new denoiser, as a result ghosting and noise were significantly reduced. All settings for related built-in presets were updated, so there's no need to use the Custom preset and change them unless you clearly understand the whole process.
Images with a high dynamic range have a high luminance ratio between the brightest and darkest object in a scene. Global tone mapping methods provide computationally simple solutions, but they apply the same mapping function to all pixels of the image resulting in loss of contrast and detail. For example, if we have a bright sky and dark areas on the screen at the same time, we'll end up either having shadow areas close to flat-black, or overlit ("burning") sky. Local tone mapping methods use a spatially varying mapping function determined by the neighborhood of a pixel, which allows an increase in the local contrast and the visibility of some details of an image.
Introducing a new local tone mapper with a mask generated based on the whole image, providing more pleasing results because human vision is more sensitive to local contrast.
Local Tonemapper is available for adjustment via the Color Correction section of the Rendering Settings, and can also be controlled via console commands and API.
The impact of surface normals on the translucence effect has become more significant making the whole image look even more convincing.
Clouds in Reflections
In case of using multiple viewports and dynamic reflections in a scene containing 3D volumetric clouds and a lot of reflective surfaces, rendering of clouds in reflections may significantly affect performance. For such cases we have added a new mode clouds rendering mode (Render To Panorama) enabling you to render them into the panorama cubemap texture once per frame. This automatically makes the clouds seen in simple default environment-based reflections making them look more natural for a reduced cost. However, this mode has limitations, it is only suitable if you do not need to render views from inside the clouds (Volumetric mode).
To activate this mode select Render To Panorama in the Mode dropdown of the Clouds section (Settings -> Render -> Clouds -> Mode).
Voxel Probe Multiplicative Blending
Added a new Multiplicative blending mode for the Voxel Probe. It can be used to blend Voxel Probe imitating ambient occlusion with the indirect lighting available underneath the probe. In order to bake ambient occlusion to Voxel Probe, you can enable the Multiply By Sky Color option, bake the probe with one bounce, and disable that option. As a result, Voxel Probe will contain white color from the sky that may be used as ambient occlusion.
Sharpen and Blur for Mipmaps
Usage of mipmaps can reduce Texture details, on the other hand, in certain cases too sharp mipmaps can cause visual artifacts making the image noisy. To counteract we have added two more options to the Mipmap Type switcher: Sharpen and Blur. As their names imply, you can make mipmaps more sharpened during down-sampling (to restore some of the information loss) or blurred (to reduce artifacts) with a possibility to control the radius of the applied effect. For sharpening, you can also control the intensity of the effect and apply it to the HSL lightness value only, if required.
Other Rendering Improvements:
- We have improved shading of reflections for surfaces with dielectric materials to make it consistent with the law of conservation of energy and get rid of excessive specular highlights.
- Environment Probe in the Raymarching mode now accounts for translucency
- Updated translucency rendering: now it uses our Diffuse BRDF instead of Burley BRDF.
Animation Improvements (Experimental)
We continue development of the new Animation System - a solid foundation for the new versatile Sequencer tool to replace the old Tracker system with all its limitations, and make working with animations simple and efficient, unleashing you creative potential and enabling you to achieve any goal you set. We have quite a progress here and although there are some things to be done and the Sequencer is in the active development phase, we'd like to share the progress with you as experimental functionality.
The Animation System enables you to create and play in-game cinematics in multi-track mode. Animation sequences are defined by creating Playbacks, adding Layers to them, and adding Tracks to these layers with the ability to control the track sequence and blending between different layers. Users can define the makeup of each Track by adding abstract Objects and Modifiers to define changes of objects and their parameters over time based on key frames. For each pair of keys an individual interpolation mode can be assigned (constant, linear, different Bezier curves). All currently available parameters are supported (from int to dvec4) with a separate support for ObjectMeshSkinned bone transformations.
Currently it is a code-based animation platform with API for all supported languages (C++, C#, and UnigineScript) which can be already used via code in application logic (so it's more programmer-friendly at the moment). But the next stage will bring you the GUI part to control the whole thing via widgets and windows (friendly for everyone) - actually it is the new powerful Sequencer tool which is currently being developed on the basis of this platform. Below you’ll find some details about the current state of the platform.
Animation Playback Node
For your convenience we have added a new Animation Playback node (NodeAnimationPlayback) to demonstrate the functionality of the new Animation System. This node enables you to convert old animation track files (.track format) into the new .utrack and .uplay formats, as well as to play new animation tracks with the ability to change playback speed and set a particular time to see the corresponding animation frame applied to the scene.
A set of Animation samples (<SDK_folder>/source/samples/api/animation) has been added to the SDK to demonstrate various aspects of use.
For more details on the Animation System please refer to the Animations article.
Basic Animation Retargeting (Experimental)
We have added animations retargeting (experimental in this release) enabling you to share and reuse animations between models with different proportions but using similar skeletons or having similar bone hierarchy and slightly different T-poses.
Four characters below have skeletons with different proportions but share the same animation (retargeted): a tall slim guy (whose skeletal animation is actually used), another shorter but thicker man, and two women (normal and chubby). All of them move according to the animation while keeping their proportions. Without retargeting the smaller skeletons (women) as well as the wider and shorter man's one would be distorted after applying animation from the tall guy.
Model limitations can be ignored if you need to retarget only some subset of the bones (e.g.: retarget bones having different names and then use only masks).
Animation Frame Masks (Experimental)
Masks are the simplest way of reusing animations, a couple of words about how they work. To each layer of an ObjectMeshSkinned you can assign some animation and based on its frames it will change bone transformations on this layer. You can use masks to choose which components of the animation frame (position, rotation, scale, their combinations, or all of them) are to be used for each particular layer. In case any component is missing in the mask, the corresponding value will be taken from the T-pose.
Basic IK (Experimental)
ObjectMeshSkinned now supports basic Inverse Kinematics (IK) for bone chains (IK chains) providing a way to handle joint rotation from the location of an end-effector. The IK Solver attempts to find a rotation so that the final joint coincides with the given location of the effector as best it can. This can be used to position a character's feet properly on uneven ground, and ensure believable interactions with the world.
Each IK chain can have an arbitrary length (contain an arbitrary number of bones) and it has an auxiliary vector enabling you to control bending direction. You can also set rotation for the last joint of the chain. Each IK chain has a weight value that can be used to control the impact of the target on the last joint of the chain. This enables you to make smooth transitions from the source animation to the required target position of the limb.
For your convenience there is a visualizer for selected IK chains.
Improved Morph Target Support
We made it possible to increase the maximum number of active morph targets per surface for DirectX12 and Vulkan — it is now set to 100 by default, and can be even more (however, for DX11 and OpenGL it's still 7).
We also extended FBX model import settings — at importing Morph Targets you can now decide on the approach to the normals import:
- Use the normals of the base mesh.
- Use normals of the imported asset.
- Recalculate normals of morph targets using the specified angle value to make the edges smoother or sharper.
A preview of Morph Targets has been added to the Parameters window for Skinned Mesh objects.
Keep in mind that shader cache is to be compiled for any ObjectMeshSkinned with a certain number of active morph targets (an active morph target is the one that is enabled (via setTargetEnabled) and has non-zero weight).
The development of VR applications is now made simpler! VR support has been moved from plugins into the core of the UNIGINE Engine - making its use much more convenient (unified API, easier initialization, less files in the project). This also opened up the door for more in-depth performance optimizations.
VR plugins (OpenVR, Varjo, Oculus) that implement similar functionality are considered deprecated and will be removed in the next SDK release.
UNIGINE VR system provides OpenVR and Varjo integration with support of modern graphics APIs — DirectX 11, DirectX 12, and Vulkan — right out of the box. It enables you to create VR and XR applications for different VR platforms with the support of a wide range of VR devices.
Built-in VR support for the OpenGL API won’t be available since 2.18.1, so if needed, you’ll have to use the deprecated VR plugins.
OpenVR integration enables you to develop projects for both SteamVR and Oculus VR. With the Varjo integration, you can also implement Mixed Reality applications designed to run on Varjo HMDs.
Unified VR Input System
UNIGINE's Input System now provides access to a wide range of VR devices. You can manage input from VR controllers, head-mounted displays (HMDs), base stations, and trackers out-of-the-box, as well as get a device model, check the battery level, or access other properties and settings of your device.
We have also implemented model-independent, unified handling of buttons and axes for VR controllers and HMDs.
The VR Template has been updated to align with built-in VR functionality:
- The implementation of classes and components now uses the new API.
- VR controller models are now automatically loaded from OpenVR, so you don't need to add them to the project manually.
New Engine Events System
We have improved the core mechanism of tracking various events everywhere across the Engine. The old callbacks-based system had a number of issues and weak points:
- Users had to keep and track all signals and handlers to manually unsubscribe properly.
- Signal signature was unclear from API, without any type checking, you could subscribe with virtually any signature, then compile successfully (even with some mistakes), and get invalid data at runtime. No compiler notifications in case of any API changes, again resulting in getting invalid data at runtime.
- Crashes when subscribing with a class member function in case the subscribed object was deleted (a frequent case as users often forget to unsubscribe).
- Calls to MakeCallback() and typecasting for lambda expressions were required in order to use addCallback() functions.
Introducing the new Event System to replace old callbacks with strong reliability and a much better flexibility, bringing you the following features:
- New Events have strict type checking for function signatures. It is now clearly seen how many arguments and which exactly a callback (event handler) function requires.
- Compile-time checking determines whether argument types match event types or not.
- Simpler subscription to events with lambda functions. There is no need to perform internal type conversions.
- The new EventConnection handler does not require you to unsubscribe manually. It automatically breaks any connection in the destructor.
- More flexibility: you can temporarily disable particular events to perform certain actions without triggering them, as well as you can toggle on and off just a particular connection (EventConnection).
- Batch management: a set of different subscriptions can be linked to a single EventConnections instance, enabling you to unsubscribe from all of them in a single function call.
The new Event System will require manual migration. But there's nothing to worry about as the entire process involves locating all instances of “addCallback” in your code and replacing them with the new approach according to the instructions given in the API Migration Guide. For a medium-sized project this can be completed by one developer in a couple of days.
We have switched from the axTLS library to OpenSSL, a commercial-grade significantly more robust, full-featured, and well-documented Open Source Toolkit for the TLS (formerly SSL). For your convenience new SSL Socket samples were added to the Sim C++ Samples suite available for the Sim SDK edition.
Landscape Terrain Improvements
Landscape Terrain operates with huge amounts of data. For this release we have boosted compression/decompression of terrain data for both lossless and lossy compression modes.
Decompression has become ~65% faster, while compression yielded from 7% to 74% speedup depending on the selected algorithm (lossless or lossy).
Other Engine Improvements
- Added a Fast Shutdown mode for the Engine with memory cleanup performed by the Operating System (controlled via the -fast_shutdown startup command-line option). By default this option is enabled to ensure that your application quits and releases all resources quickly. If you need to have the ability to re-initialize the Engine again after shutting it down (call init() after shutdown()) without restarting the application, you can disable this option, but in this case the Engine shutdown process may take significantly more time.
- Improved import of STEP/STP/IGES/IGS files with non-latin symbols handled correctly.
- Fixed abrupt switching of shadow LODs of Mesh Clusters with Opaque materials assigned when the LOD Smooth Fading option is enabled.
- The Scale component in the transforms of light sources is locked to 1, any changes are ignored to avoid visual artifacts.
- Information on storage location for each console parameter is now displayed in the console command description.
- Disabled rendering of Transparent Blur buffer when there are no objects with this state in the scene.
- Fixed the failure of some Engine subsystems (profiler, onscreen messages, input) to operate if the Engine is starting unfocused with the background update enabled.
- Fixed issues on importing models created in Daz3D software resulting in broken bones hierarchy of imported models.
You can now maximize your viewport in the Editor with a keyboard shortcut. Just hit F11 on your keyboard and the viewport will go fullscreen. Pressing F11 again will take you out of fullscreen mode and return the viewport to its original size and place.
More Visualizers And Helpers
Visual debugging helps to tune content and settings in your scenes to perfection, so the more tools here - the better! For this release we have added the following helper visualizers to the Helpers menu:
- Visualizer for tangent, bitangent, and normal (TBN) vectors for the selected surface of an object.
- Visualizer for Lighting Modes enabling you to check which objects use Static, Dynamic, or Advanced lighting mode.
And debug visualizers to the Rendering Debug menu:
- Visualizer of the buffer that stores per-pixel distance to the nearest surface (for Raymarching Environment Probes).
- Visualizer for the Metering Mask texture used to control the influence of auto exposure and white balance correction for the whole screen, where each pixel is weighted in importance in accordance with the specified texture mask.
Improved World Nodes Hierarchy
When you work with large-scale worlds containing thousands of nodes every tiny detail making a frequently performed operation faster and easier matters, as well as matters flexibility. To simplify world management and make it more convenient we have updated the World Nodes window splitting it into the following columns (with an ability to choose which ones to display):
- Node name with a node type icon.
- Shows you whether there are logic components / properties assigned to the node.
- Node selection toggle enabling you to choose which nodes can be selected to filter out the ones that should not be affected (e.g. if you want only characters to be selected with a frame selection tool in the forest).
- Node transformation lock enabling you to prevent positions of particular nodes from unwanted changes.
- Node enable/disable toggle.
A new powerful Batch Rename tool is now available enabling you to rename multiple objects (nodes, properties, materials, or assets) in the Editor at once and saving you a lot of time, especially when working with large-scale projects. You can use the tool to:
- set a prefix for the names of selected objects,
- set a suffix for the names of selected objects,
- change case in the names of selected objects,
- find the specified combination of symbols and replace it with the combination you define.
The tool is available by selecting Tools -> Batch Rename in the Main Menu, or right-clicking on a file in the Asset Browser or an item of any hierarchy window. For more information please refer to the related article.
Updated Cleaner With Similar Assets Search
Cleaner is a tool you use to optimize your project and save disk space by removing unnecessary assets.
Now it enables you to find similar assets, so that you could decide whether they are really needed or you just forgot to remove them. Assets are pre-checked based on their previews generated with selected resolution (higher resolution). You can filter out the types of assets to be checked (e.g. limit the scope to textures only), specify similarity threshold to define the degree when assets are considered similar. The tool will display assets grouped by similarity, so you can decide which of them can be removed.
All functions of the Cleaner tool earlier displayed under dedicated accordion widgets stacked in one window layout were moved to separate tabs for convenience focusing on each particular task.
You can find more details in the updated article.
Better GLTF/GLB support
Now you can import Mesh Skinned objects, their animations, and morph targets, this functionality is also available in runtime.
Import of PBR Textures has also been improved.
Material Graph Editor Updates
Materials can actually modify geometry of the object (displacement mapping, tessellation, etc.) in case the discrepancy between the initial and material-altered geometry becomes significant; it may result in visual inconsistency (incorrect detection of contacts between object bounds, occlusion, etc.). To compensate for such discrepancy we have added an ability to alter object bounds via the graph-based material that alters object's geometry. Connecting a parameter or some value to the Vertex Offset input of the Material node in the Visual Material Editor automatically adds the Bound Scale parameter to the basic settings of the material. In case the displaced vertices go beyond the default object bounds you can use this parameter to manually adjust compensation factor (value to be added to expand object bounds to cover the maximum discrepancy).
The following new nodes were added:
- Texture Buffer Direct Lights
- Texture Buffer Indirect Lights
- Texture Buffer Indirect Diffuse
- Texture Buffer Indirect Specular
Other UnigineEditor Improvements
- Editing curves has become more convenient with an ability to zoom the curve view in and out along both axes
- Long lists of logic components/properties and their fields in the Parameters window can now be collapsed and expanded by a single click on the corresponding icon, just like in the World Nodes hierarchy window.
- Added an option to Invert G-Channel for batch importing of OpenGL normal maps from imported models.
- Fixed an issue with the Revert button in the Curve Editor resulting in clearing the Undo / Redo stack.
- Holding the Shift key during a transform operation will now transform the object at 1/4 th of the normal rate, allowing much finer control.
- Brushes in the Cluster Paint Mode will now ignore (draw through) objects from the Filter list that are switched off, so you can paint an underlying cluster when the one above it is unchecked.
- The Restore Defaults button now resets values to user-selected default settings.
- Hotkey presets (QWERTY, QWERTZ, AZERTY) are now automatically updated as you switch regional settings.
- Mask-type parameters can now be edited when multiple nodes are selected.
- You can now focus on multiple selected nodes in the World Nodes hierarchy window via the corresponding button.
- Fixed issues with incorrect operation of sliders for integer parameters.
- Fixed an issue with unavailable Mip level selection in the Preview for 2D Array images.
- States (expanded/collapsed) of parameter subcategories (accordions) in the Parameters window are now saved, so when you switch between nodes, properties/components, or materials you won't have to rearrange (re-expand/re-collapse) all of them again.
- Added an option to make base materials in the project editable (User Project Settings -> Editable Base Materials).
- Optimized painting in Cluster Paint Mode with a huge number of cluster elements (over 50 thousands).
- Fixed an issue with OS event buffers overflow in case of reimporting large Landscape Layer Maps sometimes resulting in accidental deletion of the corresponding .lmap assets.
- Added the possibility to set default values for a number of settings to be used when creating new nodes: Immovable, Lightmaps, Intersection, Collision, and Physics Intersection. Related settings are available via the Settings window (Settings -> Editor -> Project Settings -> Default Settings For Node Creation).
- Fixed an issue with multi-editing of surfaces resulting in a failure to apply a value that is already set for one of them.
- Fixed an issue with deleting orphan graph-based materials after removing the base material graph.
- Fixed snapping of scaled objects.
- Hotkeys for single-instance windows now open and close them as well.
- Focusing on a Player now implies focusing on its icon ignoring the size of its frustum, while Shift + F allows focusing on the camera bounds.
- Fixed selection of cloned nodes after completion of the 'Clone And Move' operation (LMB + Shift), selection shall not be reset.
- Fixed selection of Front/Up Axis in the model import settings.
- Fixed an issue with copying and pasting surface parameters, the Custom Surface texture is copied as well.
- Fixed an issue with non-functional 'directory' icon opening the list of animated items in the Tracker tool.
- Optimized displaying of parameters for multi-selection in case of huge numbers of selected nodes (tens of thousands) removing Editor freezes. Reparenting of multiple materials has been optimized as well.
- Fixed parenting issues when using the Ctrl + P combination.
- Fixed selection of surface LODs in the viewport.
- Fixed an issue with node replacement by the Randomizer tool.
- Fixed an issue with incorrect orientation along surface normals (Orient By Normal) when using the Snap to Surface tool. Snapping of scaled objects fixed as well.
- Fixed an issue with some Editor windows not shown on Linux (Ubuntu 23.04, GNOME 44.3).
- Fixed a pack of issues with DPI Scaling on Windows.
Sandworm Tool Improvements
- Added support for graph-based materials (*.mgraph) for buildings generation.
- Fixed issues with seams on ObjectTerrainGlobal.
- Fixed generation of trees in areas where there are roads and buildings.
- Fixed issues resulting in artifacts and data losses when generating terrain data using compression algorithms.
- Fixed an issue resulting in a failure to generate ObjectTerrainGlobal using the GeodeticPivot projection if the bound size exceeds 30 degrees on either side).
- Fixed blending of vegetation masks.
- Fixed an issue with gaps between textures applied along linear vector objects.
- Fixed an issue affecting generation of buildings.
- You can now rate add-ons and leave your comments to share your thoughts, suggestions, or experience regarding their use.
- Added an ability to attach multiple packages to the same add-on for various SDK editions and operating systems, so now there's no need to create multiple add-on versions for this purpose.
- Improved relevance of search results now taking into account specified filtering options.
- Added an ability to send a question directly to a publisher via the dedicated feedback form.
For more information on new functions please refer to the updated version of Add-On Store Documentation.
- Added bounds for GPU particles making them work the same way as CPU particles regarding rendering of light sources (taking into account limitations on the number of light sources rendered for transparency). This made GPU particles lighting look more consistent and stable without random switching of all light sources in the world on and off (without bounds it was not possible to define which lights should be rendered).
- Fixed an issue with cutting out Length-type particles with high values of Size and Length parameters by the Particles Spacer.
- Fixed interpolation issues related to using CIGIConnector resulting in image jittering especially noticeable on large-screens.
Demos and Samples
New Drone Demo
Introducing a new Drone Simulator demo project showcasing the ability to render UAV imagery on UNIGINE in both desktop and VR modes, while also offering gamepad control over the drone. The demo uses a basic physical flight model that provides an immersive flight experience. Additionally, it offers various camera modes to simulate different POVs, connection types, and sensors.
The demo project can be used as a template to cover the typical UAV use cases:
- Aerial Videography
- Infrastructure Inspection & Maintenance
- Search & Rescue Operations
- Emergency Response & Disaster Management
New C++ SIM Samples
Introducing a new set of C++ samples showcasing various tasks for simulation (available for the Sim SDK edition only), which is to be extended in the upcoming SDK updates. The High-Level Car Physics System demo is now a part of this suite including a number of new samples:
- Rope simulation samples:
- Crane demonstrating how to imitate a crane with sling ropes transferring an object.
- Wires - illustrating how to create realistic-looking wires with physics simulation.
- SSL Socket - showcasing the implementation of message exchange with a server through an SSL connection.
New API Samples
A pack of new Animation samples showcasing the new Animation Sequencer has been added to C++ API Samples including the following:
- MaterialAnimation - animating emission scale and color parameters of a material by name and by index.
- NodeAnimation - animating position, rotation, and scale of a node.
- PlaybackLayers - creating two playbacks with three animation tracks (position, rotation, and scale): the first one has each track on a separate layer and plays them simultaneously, while the second one has the tracks played sequentially within a single layer.
- PropertyAnimation - animating a property parameter.
- SingletonAnimation - animating global Gravity along with the Fade Color rendering parameter.
- WidgetAnimation - animating font color and size of widgets along with their positions.
The C++ Samples suite has been updated with the following:
- New samples for streaming text data and images from Internet showcasing implementation of asynchronous http-requests to a server and displaying results: a PNG or JPEG image in the first sample, and meteo data according to the entered location name - in the second.
- Added a new Mask Paint sample demonstrating how to paint a terrain mask in runtime with ObjectMeshClutter elements spawned automatically on it.
The C# Component Samples suite has been updated with the following:
- Boat buoyancy sample shows how to simulate water buoyancy for physical bodies to make them float in Global Water
Free Learning Course
Introducing our free Learning Course on UNIGINE! It is an introductory course tailor-made for individuals with basic C# programming skills and a foundational understanding of 3D applications to help them get up and running fast. In case you’ve already spent some time with UNIGINE, do not hurry to pass by - take a peek, you might still find something interesting, some solutions or parts of the code might come in handy in your projects.
In this comprehensive course, you'll delve into a wide range of topics, including:
- Animations and Physics
- Illuminating the World: Lighting
- Mastering Materials Creation
- Soundscapes: Adding Sounds and Music
- Crafting Engaging GUI Elements
- Optimization Basics for Peak Performance
- Capturing Your Creations with Video Recording
- Plus, there's much more to explore!
Upon successfully completing the course, you'll not only gain practical experience but also enrich your portfolio with four exciting projects. These projects are built upon provided templates and include:
- ArchViz: Create an immersive interior scene with interactive objects.
- FPS: Dive into the world of first-person shooters with a simple yet engaging project.
- Race: Put your creativity to the test by crafting an arcade-style cross-country racing game.
- VR: Step into the realm of virtual reality with a project designed for VR headsets.
This course is designed for use with the free UNIGINE Community SDK and available for all - no registration required! Don't miss out on this incredible opportunity to elevate your skills and broaden your horizons.
Ready to Get Started? Sign up for free Community SDK, go to https://learn.unigine.com/ now and embark on your UNIGINE learning adventure!
Please note, that the code and content used in the course are currently optimized for SDK version 2.17, but they’re to be updated for the latest 2.18 SDK soon.
- Added a new article on Animations.
- Updated the Cleaner Tool article.
- Updated the article on Asynchronous Data Streaming and related articles.
- Added more descriptions to Material Graph Nodes Reference.
- Fixed a number of issues in the docs based on your feedback.
- The complete list of API changes is available in the API Migration Guide.
- The complete list of Console command changes is available in the Console Migration Guide.
Thank you for reading, and don't miss the updates as we keep working to make UNIGINE even greater!
- Your UNIGINE Team