Development log: June 08, 2013

Data Streaming and Terrain Improvements

Terrain Improvements

  • Terrain data streaming is fully asynchronous now.
  • It's also possible to force loading of a specified terrain region via Terrain::loadHeights() function with the specified bounding box.
  • Added "progression" parameter for terrain LODs, that affects LOD switching distance: prev_distance + lod_distance * (lod_progression ^ lod_number); default value is 2.0.
  • The terrain file format has been changed as well, please use the upgrade script: utils/Upgrade/terrain.usc.

Rescue helicopter simulation

Landscape Plugin for UnigineEditor

Landscape plugin allows to create huge seamless scenes containing virtually unlimited number of terrain objects (each one of them can be up to 16385x16385 units in size).

Each terrain in the landscape is an independent object that has all the terrain features and can be modified in the same way. Besides, there is an opportunity of applying only required tiles of textures and masks right to the whole landscape or to any specific region. The plugin also takes care about optimal compression of textures.

landscape plugin

File System Speedup

Added support for pre-cached file hierarchies: if the engine finds .ulist file in a directory, it stops scanning its contents (including nested directories) and use the list of files from the file instead. Thus the engine initialization time can be extremely reduced even with large assets database. There is a .ulist file generator available for your convenience: externs/bin/datalist.py. Don't forget to re-generate .ulist files, if you modify contents of a directory.

Added background loading of images (with unpacking): engine.filesystem.loadImage() function.

Added filesystem_clear console command to remove all loaded, but unused resources.

Rescue Helicopter Simulator

UNIGINE Engine has been using in training and simulation field for several years, so we've decided to make our own simulation demo. At ITEC 2013 in Rome we showcased the preview of a new rescue helicopter simulation.

Rescue helicopter simulation

Features of the demo:

  • Huge open space: 262x262 km
  • Real geospatial data
  • Urban terrain simulation
  • Dynamic weather
  • Large visibility distance: 40 km
  • Supersonic camera speed
  • Extremely detailed close-up view
  • Advanced light scattering model
  • Double precision of coordinates
  • Volumetric clouds
  • Day/night cycle

Rescue helicopter simulation

We'll publish the video teaser quite soon, so you'll be able to see the details.

Render

  • Performance optimization of terrain rendering.
  • The number of rendering groups has been increased to 8.
  • Improved OpenGL core profile compatibility.
  • Added support for PNG and TGA formats in Image::info() function.
  • Added "Substitute normal" option for decal_deferred_base material (if enabled, only decal normals will be used, otherwise decal normals will be combined with underlying surface ones).
  • Added "First frame" flag: it stops FPS counting and sets unlimited budget for Grass and Clutter generation.
  • Added new ObjectDynamic object: it can render any type of geometry, with support for instancing and point/line/triangle rendering modes. This type of object requires custom shaders in order to work.
  • Point/line/triangle rendering modes have been removed from ObjectMeshDynamic, use ObjectDynamic instead.
  • Begin/end indexes of multi-surface ObjectDynamic and ObjectMeshDynamic objects can be changed.
  • Render vegetation animation time can be changed via UnigineScript: engine.render.setAnimationTime().
  • Added detection of NVIDIA TITAN and Kepler-based Quadro cards.

World Management

  • Performance improvement for all engine resource managers (render, world and sound) on large (100k+) amounts of resources.
  • ObjectGrass, ObjectMeshClutter and WorldClutter objects can intersect with the parent node even if they are placed inside a node reference.
  • Added generation budget (per-object) for Grass and Clutter objects to avoid performance spikes: engine.world.setBudget() via scripts (in ms) or Render tab in UnigineEditor (in FPS). Objects with lower rendering group ID have higher priority when out of budget.
  • Performance info on resource managers is available via EngineAnalyzer now.
  • Grass and Clutter objects are checking parent terrain or mesh loading status to avoid lags on generation stage.

UnigineScript

  • Added Xml.setChildData() and Xml.getChildData() functions for convenient access to the child node data.
  • Fixed bug with incorrect scoping of "new" operator.
  • Arrays can be used as a function reference return values.

C++ API

  • Added access to ObjectDynamic.
  • Access to Node and Object surface boundings can be obtained via getBoundMin|Max|Center|Radius|... functions.
  • Added access to Render::FirstFrame and Render::CameraOffset parameters.
  • New sample with editor nodes interaction.
  • Added access to NodeDummy.
  • Added access to Node data.
  • Added access to load|saveWorld functions.
  • GLAppQt sample supports Linux and MacOS systems now.

GUI

  • Fixed incorrect initial Z-order of widgets.
  • WidgetDialogImage shows internal format info on ZLC images now.
  • Text alignment parameter for text rendering in the visualizer has been flipped in Y direction.
  • Support of point image filtration in Flash interface.
  • Added Gui.setFocusedPermanent() function: 1 - font color will be overrided with global GUI focused color, if a widget is focused; 0 - font color will be unchanged if focused.
  • Fixed bug with incorrect multiple object resizing in Flash.
  • Fixed Interface plugin bug: disappearing of the window after video mode change in Mac OS X.
  • Interface plugin can work correctly with -video_app null CLI option.

Tools

  • Added "Drop down" button in Nodes window of UnigineEditor: once pressed, all selected nodes will fall on the underlying geometry.
  • Added support for new postfixes in imagedds.py script for pre-mipmapped images: _dm, _nm, _sm, _pm, _hm, _tm, _am, _em, _lm, _mm.
  • It's possible to change mesh file for ObjectMeshClutter and ObjectMeshCluster in UnigineEditor without clearing their parameters.
  • Correct resource saving outside the data directory via UnigineEditor.
  • Added save() callback on world saving for UnigineEditor plugins.
  • Fixed bug in UnigineEditor with incorrect automatic texture compression from "uncompressed" directory.
  • Terrain editor can edit ZLC textures.
  • Added First frame parameter into Tracker.
  • Improved double precision support in Tracker transformations.
  • Double-click on a property name field (with file flag set) will open file dialog in UnigineEditor.
  • Updated icons in UnigineEditor.
  • Added export/import plugins for Maya 2012, 2013 and 2014.

Mobile

  • Refactored Android UnigineActivity classes: now it's possible to call system or Java functions with up to three different arguments and get return value of all supported data types (int, float or String).
  • Added hardware accelerometer support for Android and iOS devices.
  • Added two simple samples for custom iOS applications.

Other

  • Added configurable physics simulation budget: engine.physics.setBudget() function.
  • Fixed missing application icon in 64-bit Linux.
  • Added support for double precision for Image down-scaling.
  • Added Image::compare() function to compare regions of two images with the specified threshold.
  • Added /largeaddressaware option for 32-bit Windows builds in order to be able to allocate up to 3 GB of memory on 32-bit systems.
  • Updated .world and .node file format: please use upgrade.py script to upgrade your data.