Renderer Access via C++ API, Better UnigineScript Debugging, End of the DX9 Era
We are working hard on the user interface improvements, and first of all representing expanded tooltips for the UnigineEditor's panel and nodes creation dialog windows. You no longer need to look through documentation to find info on all nodes and their parameters.
There are much more UnigineEditor enhancements on their way to deliver streamlined user experience in the next SDK updates!
Renderer Access and Graphics Utilities
- Added access to Direct3D9 and Direct3D11 shaders to the Unigine::Shader class.
- Added access to the Unigine::RenderRenderer class. It controls all internal rendering callbacks for any number of rendering interfaces, which includes tracking of opacity groups and changing transformation matrices.
- Added access to Unigine::Material and Unigine::Property classes along with their managing classes. Their usage samples can be found in the source/samples/Api/Systems directory.
- Added a cubemap texture mode (MODE_CUBE) to Unigine::Ffp class.
- Added a createMipmaps() function to the Unigine::Texture class. It creates a mipmaps stack.
- Added bilinear and anisotropy flags to the Unigine::Texture class.
- Screenshots and splash screens callbacks now work via Unigine::RenderRenderer class.
- Added access to light textures for Unigine::LightOmni and Unigine::LightProj classes.
- Added sample on dynamic external texture usage (source/samples/Api/Render/Textures).
- Updated D3D9AppQt, D3D11AppQt, GLAppQt and GLAppSDL App samples (source/samples/App).
- Updated ViewportQt sample (source/samples/Api/Render): added a batch file launcher.
- MFC Windows libraries have been added into the D3D9AppMFC (see the source/samples/App/D3D9AppMFC sample).
- Added access to all Widget classes.
- Added new samples onWidgetCanvas,WidgetDialog, WidgetExtern and WidgetWindow (source/samples/Api/Widgets/).
- Added support for horizontal mouse wheels. BUTTON_UP and BUTTON_DOWN variables have been deleted from the Unigine::App class, AXIS_X and AXIS_Y variables, controlling mouse axes values, can be used instead. A sample on their usage can be found in the data/samples/controls/app_00 directory.
- Added a KEY_CMD variable for Windows key to the Unigine::App class.
- Added read/writeInt2/UInt2/String2 functions into the Unigine::Stream class. They read/write signed integers, unsigned integers and strings from/to the stream. Using these functions allows you to safe memory space.
- Added sample on the WorldTrigger object, demonstrating how to work with C++ callbacks (source/samples/Api/Nodes/WorldTrigger).
- The old Unigine::CallbackBase() class has been renamed intoUnigine::FunctionBase(). A class named Unigine::CallbackBase() is now used to call C++ functions with the different amount of arguments. All dedicated callbacks for Gui,Node, Physics and Console classes have been moved to this class.
- Added shift and division operations for Unigine::ivec2/ivec3/ivec4 classes.
- Added automatic conversion from vec2/dvec2 data types to Variable vec2/dvec2 and vice versa.
- Unigine::vec3 functions have an unused forth w component.
- Added access to an Unigine::Plugin class.
- Added access toUnigine::NodeTrigger,Unigine::WorldTrigger,Unigine::NodeLayer, Unigine::NodePivot,Unigine::WorldLayer,Unigine::WorldSector, Unigine::WorldPortal and Unigine::WorldSwitcher classes.
- Added a Ptr::destroy() method. It destroys the pointer object even when the reference counter is not empty.
- Added a Ptr::getCounter() function returning the reference counter.
- Added new Unigine::WorldExtern and Unigine::WidgetExtern classes. The first class belongs to the world spatial tree and has update() and flush() methods which are called only when the node is visible. It allows you to create external user widgets or integrate different GUI systems inside the engine via the Unigine::Plugin interface. The second class is used just as simple scene graph grouping elements without calling update() and flush() functions. Their samples can be found in source/samples/Api/Widgets and source/samples/Api/Nodes directories.
- Enabled,handled,immovable,collider,clutter, spatial , query and latest flags have been added to the Unigine::Node class.
- Unigine::Plugin class now have additional callbacks for better world management:updateWorld(), renderWorld(),flushWorld().
- Updated Unigine::Interpreter class. The destructor is called automatically without specifying a "delete" function.
- Fixed NavigationMesh::inside2D|3D() functions.
- Material and property managers can now create empty libraries.
- Added support for half-precision floating data.
- System, editor and world script functions first argument type has been changed from the const char* to Variable. Their second argument is now integer, so get() and run() methods can be executed by the integer ID.
Added a small airport demo, showcasing point lights (they are visible even from very large distance) and directional sector lights (used in PAPI, precision approach path indicators). The demo also contains some reusable objects which can be useful for airfield simulation.
- Added a Renderer plugin, which allows you to fire world script callbacks on API Renderer callbacks.
- Added a detection of NVIDIA Maxwell and AMD RX Series GPUs.
- Renderer buffers visualizer now shows cubemap textures as well.
- Added a 2560x2048 video mode.
- Engine will skip system gamma value changing on startup in case of default gamma value.
- Added a white balance parameter (ColorWhite) to the engine.render() class.
- New instances of MeshSkinned class will have default identity bone transformations.
- A new updateNormals() function has been added to the ObjectMeshDynamic class. It sets a normals smoothing angle.
- Added a shader projection matrix for Players. It can be used for oblique projection clipping planes with a correct shadows rendering. A sample can be found in the data/samples/render/oblique_00 directory.
Blurry reflections, ray traced from a material with tiny random bumps on its surface, are now available in Unigine. They are handled in the following way:
- A new "Mipmaps" state of reflection materials activates hardware mipmaps generation for blurry reflections.
- The blurry effect is achieved by switching among the mipmaps. Its power is modulated by the new Bias parameter of reflection materials.
- The specular texture alpha channel controls blurry reflections affected areas: white areas grant precise reflections, darker areas provide blurry reflections.
Now it is possible to assign procedurally generated textures to image texture slots. This feature can be implemented by the setImageTextureProcedural() function of the Material class. The example of water surface, obtained by the assigning of a procedural texture onto a simple dynamic mesh can be found in the data/samples/shaders/procedural_water directory.
Procedurally generated and dynamic textures can be also applied to Proj and Omni lights. A sample can be found in the data/samples/lights/omni_07 directory.
Controllable Translucency for Vegetation
Leafs and impostors materials translucency parameters have been updated. A new Back parameter controls translucency coefficient for texture normals, oriented against the sun. It has no influence on the sun-oriented normals. A Side parameter control the translucency coefficient for texture normals, oriented orthogonally to the sun.
- Debug builds now return the file information or the line number if a run-time script error has occurred.
- Parser will print the source line number on brace counting and preprocessor directive errors.
- system/world/editor_breakpoint console commands can work without arguments number specification.
- Fixed nested breakpoints.
- world_disassemble console command now shows script source code lines with assembler mnemonics.
- Added a virtual function keyword. In UnigineScript, all the functions are virtual by default, but a keyword could serve as a reminder for programmer that the function is virtual. In the Game Framework you must put this keyword to specify that the function is virtual.
- All expressions can treat their root namespace as a global root. An optional argument has been added to expression constructor in order to control this behavior.
- External constants are now treated as internal script constants for better performance.
- Correct function recursion calls will work even for script entry functions.
- Added direct base constants declaration (NULL, true, false).
- Fixed inheritance from scoped external classes.
- Fixed inheritance process for scoped external classes.
- Expressions like "1 << 2" can be treated as constants.
- Fixed work with externally specified functions and class attributes.
- Interpreter cache files are more compact now because of compact integers in the Stream class.
- Updated Async class. A new lock() method locks the resource. The resource can be locked by the other thread only after the first thread have unlocked() it. The class can safely work with user defined script functions.
- Added a new wait() function to the Async class. It waits until the isRunning() command returns 0 (a thread is not active).
- Async.clearResults method has been renamed intoclear().
- The constructor of an Image class can receive the image name or another image as an argument. The last argument of Image.blend() and Image.copy() functions, set to1, provides border clipping for safe image operations.
- Math Matrix library has been updated. Addedreflect(), obliqueProjection() and symmetryProjection() functions returning a reflection, oblique projection and symmetry projection matrices correspondingly.
- Added a functionid() system function. It gets internal function identifiers without full namespace path specified. It can receive two arguments for more precise function specification.
- functionid() and get_function() can work with script engine callbacks.
- Added a compare() container function. It returns a value indicating if containers are equal.
- Added a step() function. It changes the current array iterator inside the foreachkey() construct.
- A new operator can receive integer return values from classid() functions.
- Added a Unigine::getPlayerMouseSelection() function toutils.h. It returns a part of a projection matrix based on a custom rectangular selection.
- Added a MENU_USER definition. It disables a system menu call by the ESC key.
- Updated Entity class. A new getProperty() function returns the required property. An isNodeEntity() function returns the value indicating if the entity is associated with the node.
- You can now assign the entity to any node, not only to the node reference. You can even create a dummy entity without any node or node reference assigned.
- Most of the field types now can be identified automatically.
- Added a remove() function to the Scheduler class. It removes a task from the frequency group.
- Updated Game class. A getFieldDefaultValue() function returns a default value of the field parameter. A reloadLevel() function reloads the level. A getActiveLevel() function returns the number of the active level.
- Added a real-time strategy game sample based on the Game framework with the following features:
- Buildings construction, three types of units, resources mining
- Units selection and control
- AI-controlled enemies
- Collision detection, pathfinding
- Simple HUD with minimap
- Fog of war
- 3 levels with different missions
- Fixed alpha blending: you can now make external windows transparent without causing artifacts. It also works for Oculus Rift plugin GUI.
- Updated tooltips: added support for automatic text wrapping (horizontal tooltip size is controlled by the rc file), added support for bold (<b>), italic (<i>) and bold italic (<bi>) tags for simple font changing.
- Added a setWidget() function for the InterfaceWindow class, so Interface plugin sets a size and position of the internal widget window automatically. Manual synchronization has been removed.
- An addUserInterface() method of the UserInterface class has been removed. A direct constructor should be used instead.
- Full paths to the locale files should be specified in the locales array now. The syntax is: string locales = ( "path/to/locale/my.en", "path/to/locale/my.ch" ). Optionally several multi-language locales can refer to one .locale file. The syntax is:string locales = ( "path/to/my.locale:en", "path/to/my.locale:ch" ).
- Updated C++ API/API Reference section: most of functions descriptions have been improved, descriptions of lately integrated classes have been added.
- Added a "New Project Generator" article into Programming/Development for different platforms section. It describes how to create a new project by means of Unigine SDK Browser.
- Updated UnigineScript section: added descriptions on new functions.
- Updated Game Framework documentation: added info on callbacks, updated function library.
- Added Navigation.setQuality/getQuality methods. They control the route optimization quality.
- Fixed NavigationMesh object route optimization.
- setRotation() method of Node class have an optional argument disabling node scaling.
- A new ObjectMeshSkinned::addMeshSurface() function automatically adds vertices and indices from the source ObjectMeshSkinned.
- Added a Xml::setXmlData() method. It sets an unquoted string to data stored in the node. This string can also contain xml sub-tree with rich text formating.
- Added correct dead keys handling under Windows OS for foreign languages like Spanish.
- Added a new SCons command called atomic for Android, iOS and WebGL mobile platforms. It creates a single library without additional engine libraries creation.
- Minizip UnZip library has been upgraded to the version 1.1.
- Fixed .sanim files exporting: partial bone animation exporting now works correctly.
- Fixed Valgrind initialization errors.
- Fixed incorrect WorldTrigger type filtration.
- ZIP archives now work correctly. They can be opened by their partial names and can be located in every engine's filesystem resource. A corresponding sample is located in the samples/systems/packages_01 directory.
- Added samples on Perlin noise generation: simple algorithm (samples/systems/noise_00), for one asynchronous thread (samples/systems/noise_01), for two asynchronous threads ( samples/systems/noise_02).
- Vec3 and Vec4 data types are 16-byte boundary aligned now.
- Tracker can validate nodes before parameters applying, so the engine would not crash if the node does not exist. The corresponding error message will be shown in the console.
- Tracker can save and restore current state into the Stream.
- Added a Two Sided option to NormalMapper. It enables double-sided intersections.
End of the DirectX 9 Era
We are discontinuing support for DirectX 9 in order to deliver improved technology, starting from the next SDK update. More details will be announced soon.