Development log: August 16, 2013

Road Decals and UnigineScript Cache

Road Decals

Introducing new object: DecalDeferredMesh. It allows to create mesh-based orthographically projected decals on all underlying geometry. DecalDeferredMesh can be used to create roads or markings and inscriptions on any surface.

DecalDeferredMesh

A 2D mesh is required to generate these decals, decal_deferred_base material is used for shading.

FieldSpacer and FieldAnimation

FieldSpacer has replaced a WorldSpacer node, which is removed now. It can be applied to grass and water and allows to specify areas, that won't be rendered.

FieldAnimation node affects procedural shader vegetation animation parameters - it allows to animate only selected parts of grass and vegetation. Grass, leaf and stem shaders will be affected by FieldAnimation node only when Field mode of Animation option is enabled.

Both objects supports box and ellipsoid shapes.

FieldSpacerFieldAnimation
FieldSpacerFieldAnimation

Render

  • Added support for parallax oclussion mapping into decal_deferred_base material, shadows are received with respect to it.
  • decal_terrain_base material uses correct terrain normal texture as a base normal level, so this material can be used as an additional terrain detail materials provider now.
  • It is now possible to control virtual shader origin offset, as well as maximal camera distance threshold (if the distance from the origin is larger than the threshold value, the origin will be automatically moved to the camera).
  • Full Oculus SDK sources are required for Oculus Rift plugin compilation (set path to it in the OCULUSROOT environment variable).
  • The number of polygon offset modes has been increased, as mesh based decals require huge polygon offset values to be precise and artifacts free.
  • All mesh-based nodes like WorldOccluderMesh/NavigationMesh/DeferredDecalMesh/NavigationMesh will have setMesh/getMesh methods for dynamic mesh reinitialization. These methods receive ObjectMesh node as an argument.
  • Functions for line rendering with multiple (3 and 4) point arguments have been added: engine.visualizer.renderLine3D().
  • Maximal size of a single Terrain object have been reduced to 32769 x 32769, it is recommended to use multiple terrains (see the Landscape tool) in order to achieve large worlds.
  • Achieved better render compatibility with DirectX 11 feature level 9.1.
  • Texture anisotropy filtration has been enabled for grass and impostors by default.
  • Optimized grass and clutter object generation when seen from high altitude, reduced CPU load.

GUI

  • Added dedicated shader virtual offsets for WidgetSpriteViewport and WidgetSpriteNode widgets.
  • A bug in loadSkin() function has been fixed.
  • WidgetSprite* widgets work correctly on all available platforms now.

C++ API

  • push|popWorld, push|popEditor functions have been removed, use pointers to the corresponding interpreter (obtained via Unigine::Engine::getSystem|World|EditorInterpreter() or Unigine::Interpreter::get() for the current interpreter).
  • runSystem/runWorld/runEditor functions have been renamed into runSystemFunction/runWorldFunction/runEditorFunction.
  • New Stream::read|writeArray() functions have been added.
  • New Stream::isAvailable() function has been added, it indicates that the stream isn't ended yet.
  • Added new functions for struct/public class member accessing: addSetFunction() and addGetFunction(), see source/samples/Api/Structures sample.
  • Added min/max/clamp/lerp functions for scalars and vectors.
  • Added a quaternion to matrix multiplication functions.
  • Added left and right matrix to vector multiplication functions.
  • Constant iterators and iterators for Vector, Set and Map containers have been added.
  • Vector::space() function has been added. This function returns the allocation size of internal buffer.
  • Added an application sample with built-in resources (so the result is a single executable with no file dependencies, like ResourceEditor): samples/Usage/Atomic.

UnigineScript

  • Reflection class can provide names for the current and base classes on the given object.
  • Reflection class is able to return the function identifiers for call() method.
  • Arrays can be passed as references to the functions.
  • Fixed incorrect type casting for from external to user classes.

UnigineScript Cache Files

UnigineScript can be pre-compiled into cache file in order to achieve faster initialization and for distributing final builds without full script sources.

The cache for system and editor scripts is generated automatically (or re-generated, if checksum of the source files doesn't match the one stored in the cache) every time you start the engine, to generate the world script cache one needs to pass file name as the second argument to world_load command.

The engine looks for the world, system and editor cache files inside the data folder first, after that they are looked for according to the cache_path variable. system_cache and editor_cache console variables can override default file names for the corresponding scripts. File name for the world script cache is passed to world_load command as the second argument, world_reload console command can receive the cache file name as an argument as well.

Now it is possible to make cross-platform generation of cache files (e.g. generate a world cache for Android on Linux): a new engine build option called emulation has been added to produce Windows/Linux/Mac binaries emulating the selected platform (script defines, list of available functions). The available emulation values are: ps3, android, ios, winrt, webgl, none.

Mobile platforms

  • GLESAppTablet.mm has been re-factored to the function-based platform detection instead of preprocessor directives use (_IPHONE, _IPOD and _IPAD defines has been replaced with engine.tablet.isIPhone|isIPod|isIPad() functions; to get the device version use engine.tablet.getVersion() function).
  • Added chain shader for mobile platforms.
  • It will be possible to pass Java byte arrays to/from Unigine based Android application. As byte arrays, any kind of parameters, even images, can be passed. A corresponding sample is located under source/samples/Android/Buffers directory.
  • NEON optimizations for Image sampling and Particle noise calculations have been added.
  • Added support for terrain on mobile devices (it supports 3 detail materials without normal maps, similar to mesh_terrain_base material).

Tools

  • ImageDDS tool is now case insensitive to the image format and type.
  • Access to Field nodes have been added into the Tracker.
  • A configurable ambient and light colors for MeshViewer tab in the ResourceEditor have been added.
  • Export Mesh function in UnigineEditor saves currently generated ObjectMeshClutter data as well.
  • Material texture wrapping and anisotropy parameters can now be changed inside the UnigineEditor (by pressing Edit button next to the texture tab). The modifications will be saved inside the material file. This option allows to use decals in a more flexible way.
  • All engine resource managers will check file modification time for resource creating when the editor is loaded. Thus there will be no problems with loading outdated meshes if they were changed after the start of the engine.

Other

  • Xml::clearUnusedData() function can stop printing warnings on unused data in XML files.
  • Migrated to DirectX runtime libraries version 43.
  • Property::isParent() and Material::isParent() functions have been added.