UNIGINE Sim and C++ API improvements
Introducing UNIGINE Sim
Over the years it became evident that UNIGINE is being used in two main industries: game development (about 15-20% of the customers) and "serious games" (simulation, visualization and VR). A lot of engine features are used in both directions, while some of them are purely simulation-specific. So we decided to split the product into UNIGINE Sim and UNIGINE Game: based on the same engine, these products have different sets of features and pricing schemes.
There is a new website dedicated to UNIGINE Sim: sim.unigine.com (available in English, Russian and Chinese).
Main differences between the SDK editions are listed in the table:
|Binaries with double precision of coordinates||+||-|
|Syncker multi-channel rendering system||+||-|
Existing users have access to both editions, so they can decide which one is more convinent to use for them.
Rescue Helicopter Demo
We have completed second iteration of the UNIGINE-powered rescue helicopter demo:
The demo is available to customers for download, but it is not planned to publish it in the open access due to its significant size (about 60 GB). It was demonstrated as a part of a 6-channel simulator at I/ITSEC 2013 expo (some details below).
- Added NodeExtern andObjectExtern, special types of custom nodes and objects created via API.
- Added access toLight,LightOmni,LightProb,LightProj, LightSpot,LightWorld,ObjectBillboard, ObjectDummy and ObjectMeshCluster classes.
- Added new Unigine::BoundSphere/Box/Frustum classes. All bounds-related functions have been added to these classes instead of the center/radius/min/max accessors in theNode, Object and World classes.
- Added access to an Unigine::Physics class.
- Added an Unigine::Visualizer class, providing access to visualizer functions.
- Unigine::Light, Unigine::Object and Unigine::Player classes can now be passed via API.
- Added a getID() static function to the Unigine::Thread class. It returns the unique cross-platform thread identifier (zero value means the main working thread).
- Added a virtual get_data() function to Unigine::Plugin class. It is used for user-defined structures and data interchange between plugins.
- Added a virtual get_name() function to Unigine::Plugin class. It is used to set a user-defined name for a plugin.
- It is possible to inherit Unigine::Plugin inside the application to get access to engine callbacks without putting this object into a separate dynamic library.
- An isOwner() function added to API smart pointers. If the pointer is the owner, on its deletion the object also will be deleted. Use grab() and release() functions to change ownership.
- Vectors now have a set() function with support for multiple scalar arguments initialization.
- Added access to the list of loaded engine plugins from scripts and C++ API.
- An Unigine::Object base class supports surface-related functions now.
- Improved Unigine::State class: getter functions have been added to each rendering state (getPolygonBias(), getPolygonSlope() and getShader() functions).
- Refactored samples.
- Added a set_file/get_file field type for entities, which adds an icon opening a file selection window.
- "system_script", "extern_define", "extern_plugin" widgets moved from Editor settings to Game settings, so they are saved in the *.game file and are launched right on game initialization.
- Added getIntersetcionObjectsEntity() and getIntersetcionNodesEntity() functions to the Level class. They provide fast and easy search for required entities within the specified area.
- Added Shooter sample with the following features:
- First person camera and controls
- Simple HUD
- AI-controlled enemies
- Multiple levels
- Data transfer across levels
- Different weapons: pistol and grenades
- Pickable items: med kits, ammo, additional lives, keys
- Unlockable doors
- Different levels of difficulty
- Added support for Oculus Rift HD.
- Fixed volume_shaft_base material.
- Added access to ObjectMeshSkinned skinned coordinate vertices and indices.
- Added a getSpawnCount() function for ObjectMeshClutter and ObjectGrass objects. It returns the number of cells to be generated. If the function returns zero, the scene generation is completed.
- Added an -extern_directory command line option for accessing resources outside the data folder.
- Added a setID() function toNode,Body, Shape and Joint classes for manual ID control.
- A world.addWorld() function would not clear the current world even if loading was unsuccessful.
- Added functions which return the number of queued file system resources: engine.filesystem.getNumQueuedData/Files/Images/Meshes/Resources.
- world.saveNode/saveNodes() functions can optionally save nodes in the binary format (disabled by default).
- Improved pathfinding: a depth parameter added to the NavigationMesh class for better control over accuracy/speed of path calculation.
- Added world thread counters into profiler.
- Added access to world threaded resources information:engine.world.getNumQueuedNodes/Resources.
- Fixed crash on the incorrect variable name in toggle and switch console commands.
- Fixed bounding sphere calculation on double precision builds.
- Added a NodeReference.releaseNode() method which releases the internal node of ownership so it is no longer owned by the node reference (made orphan). After being released the node should be appended to one of the scripts not to cause a memory leak.
- Increased precision of the Bezier function on double precision builds.
- Added support for double/float precision build configuration into Visual Studio projects.
- Added support for Microsoft Visual Studio Express 2013.
- Added a new id() container function to Vectors and Maps. It returns the internal integer ID of the array which can be used inside a call() function for array passing.
- Fixed namespace reflection.
- Fixed nested ternary operators.
- A classid() system function can now accept string type values as an argument.
- A class_cast() system function can now accept classid() integer values as a target class argument. It provides better performance.
- Recursive functions will work inside the ASync class safely.
- Fixed recursive calls of functions with reference arguments.
- Added a debugging get_memory_usage function to system functions.
- Added a key() member function to all user-defined arrays to get a key by the element index. It can be used for both vectors and maps: for vectors it returns the index itself, for maps it returns the key (similar to the get() function returning data).
- Added an instanceid() function, which returns unique ID of the user-defined or external class instance.
- Added an instanceinfo() function.
- HBox and GridBox widgets now modulate the color of their children.
- Added a setFixed() function to VPaned and HPaned widgets. setFixed(1) means that the top (or left) split has a fixed height (or width), setFixed(2) means a fixed size for the bottom (or right) split.
- Added background, stencil and color accessors to the high-level Unigine::Widgets::VBox/HBox/GroupBox/GridBox/EditLine/EditText classes.
- Added a "Last update" date tag at the bottom of every page in the documentation.
- Updated a Programming/GUI section: added info on localization, added more examples, updated info on all widgets and containers, added description of reference and include tags.
- Updated UnigineScript function library.
- Updated C++ API function library.
- Updated a Content Creation/Materials section: added examples of materials inheritance and custom materials creation.
- Added a Programming/Material File Format article, providing an info on .mat file structure.
- Updated a Tools/ImageDDS article: added documentation on types of the image formats, updated list of CLIs and batch operations.
- Updated a Development for Different Platforms section: added documentation on project compilation via Xcode, updated list of options for manual and semi-automatic compilation.
- Updated Game Framework documentation.
- Updated a Principles of Operation/File System article: added info on .ulist files.
- Added a Tools/Launcher article.
- Android version is now compatible with data streaming and can load assets and resources from multiple threads.
- iOS application can work in portrait mode (it must be compiled with the set APP_PORTRAIT definition).
- Fixed OpenAL sound cone parameters.
- Changed default names of the sound library to libopenal.so (Linux) and libopenal.dylib (Mac OS X).
- Added a missed Collision flag to ObjectMeshClutter in UnigineEditor.
- Fixed billboards orientation in impostor grabbing tool.
- Fixed Interface plugin on Mac OS X: no more black window problems.
- Fixed incorrect behavior of Interface plugin in the fullscreen mode.
- getTransformScale() and decomposeTransform() functions from utils.h are now compatible with double precision of coordinates.
- Benchmarks and content-heavy demos (Crypt, Character, Passage, GI, Tessellation, Sanctuary, Tropics, Heaven, Valley, Urban Driving) are excluded from SDK installers, they are available for download as separate .ung data packages in order to reduce amount of data to download on each update.
In the beginning of December UNIGINE Corp. has participated in I/ITSEC 2013 (the world's largest modeling, simulation and training conference) in Orlando, USA.
The main feature of our booth was Bell 206 rescue helicopter simulator, which was built in cooperation with CogSim Technologies. It had a cockpit from a real Bell 206 helicopter, instruments simulation and 6 visual channels (4 front ones and 2 for lower windows), synchronized by means of CIGI network protocol. As a content database we showcased our 262x262 km landscape demo.
The same content project was also demonstrated at 3D perception booth during the whole show at a 150 degree curved screen (3 visual channels, 6 projectors):
It was a great show, we had enormous traffic in our booth. A lot of attendies claimed that our simulator was the best image generation technology at the expo floor. Great thanks to the UNIGINE team and our partners!