UNIGINE 2.0 Beta: Editor Usability and Performance, Overall Stabilization
Main Changes
UNIGINE 2 has successfully reached the beta stage.
- Usability improvements for UnigineEditor.
- Performance optimization for complex scenes.
- Oculus Rift DK2 support.
- Extended C++ and C# APIs.
- Added more usage examples and tutorials.
- Overall stabilization.
UnigineEditor
Performance Optimizations
The diagram below demonstrates UnigineEditor performance boost from UNIGINE 1 to UNIGINE 2 in everyday operations with objects (selection, movement, rotation, undo/redo) on complex scenes. The amazing x120-x5000 speedup has been achieved for test scenes consisting of thousands of objects (3375-9261 static meshes).
The speed of other actions in the editor has been also improved, so now editing performance is on par with runtime capabilities of handling very complex scenes.
Scene Navigation Usability
- Added the ViewCube providing the following functionality:
- Displaying of the current camera position.
- Quick switch of camera positions based on axes.
- Quick switch between orthogonal and perspective projections.
- The mouse cursor smartly sticks to the object while moving.
- Added support for fractional values to camera speeds.
- The moving speed in the track (crab) mode now depends on the distance from the camera to object.
- Added camera tilts to the right and left (right and left arrow keys by default).
- Fixed focusing on objects with multiple selected surfaces.
- The flag indicating if the editor camera position has been saved will be written to the .world file.
- Camera rotations are now based on quaternions that solves the gimbal lock problem.
Objects Selection
- Added a Rectangle select hotkey (Ctrl + Left Click for the UNIGINE 1 preset).
- Selected surfaces can be deselected by clicking them while holding Ctrl.
- Fixed material detecting when clicking the object.
- Added a flashing selection: a wireframe of the object will be shown on the selection and then will gradually fade (if Helpers -> Object wireframe option is disabled).
File Dialog
- Added support for Home and End hot keys.
- Added a dynamic update of the files.
- Directories specified in the -extern_path command line option will be shown in the Bookmarks field.
- File names are limited to 100 symbols.
- Operations with files now work in the following way: a single click after 0.3 seconds enables renaming; double-click opens / saves the file.
- Fixed engine crash when clicking a bookmark addressing to the nonexistent folder.
- Fixed repeated opening of the dialog window when saving world via Ctrl+N.
- Fixed scrolling when the mouse cursor is out of the file dialog area: it won't influence the camera.
- Preview improvements:
- Added info on meshes vertices, triangles and surfaces in the Preview section.
- Previews are available for nodes that are less than 5MB, for meshes that are less than 50MB, for textures each side of which is less than 16384 pixels.
- Fixed preview display after file renaming.
- Added previews for all supported texture formats.
- Added previews for .node files.
Other Editor Improvements
- Added cylinder and capsule mesh primitives to the Create -> Primitive section of the main menu.
- Fixed camera locking for all viewports.
- Added a Screenshot button to viewports for fast screenshots.
- Added a resolution selector to viewports (fixed resolution or fixed aspect ratio).
- Added a Target node field to the Persecutor tab of the PlayerPersecutor node that allows you to specify the players target from the editor.
- Disabled surfaces and nodes are now displayed in gray.
- After removing the materials library from the list all its materials in the scene will be removed.
- Removed the Hide panel option.
- Added a Decal Grabber plugin that serves for optimization of content located at the large terrain distances. It replaces distant objects with a deferred orthographic decal thereby baking all of them into a texture. A plugin is opened in the Decals tab of ObjectTerrain in the Nodes window.
- Nodes hierarchy will be saved after grouping.
- Fixed support of double-precision floating values in the node Position field.
-
Fixed undo / redo operations for:
- Mesh Combiner plugin.
- Randomizer plugin.
- ObjectMeshCluster and WorldCluster (Collect, Create, Expand options).
- ObjectBillboards (correct saving of the parameters).
- NodeReference.
- Material and property systems.
- Sound, physics and renderer systems.
- Position, rotation and scale widgets.
- Texture arrays of a terrain.
- Added .plugin files for editor plugins containing metadata.
- Fixed editor reloading with the closed Plugins window.
- Fixed editor panels overlapping when combining into groups.
- Fixed manipulators calculations when editor camera parameters are changed manually via the world script.
- Fixed bugs in the Node Export plugin.
- Added grabbing of spot and omni lights to Terrain Grabber.
- Fixed import of the terrain masks from RGB and RGBA files.
- Terrain brushes:
- Fixed crash when choosing 2D array, cube and 3D textures as sprites for brushes.
- Fixed crash when using brushes on a non-square terrain.
- Fixed saving of changes made by a brush when the mouse hold has been released beyond the terrain.
- Fixed saving of changes made by a brush after quitting the engine without saving the world.
- Added the Helpers panel providing:
- Quick access to frequently used helpers.
- Enabling visualization of nodes icons and gizmos.
- Enabling visualization of shapes, joints and contacts.
Other Tools
- Added a missed time value for 3ds Max export plugin.
- Added an alphabetical sorting of surfaces and animations for 3ds Max and Maya export plugins.
- Fixed FBX files loading in ResourceEditor.
- Added a basic support for PLY ASCII format (it is principally designed to store three-dimensional data from 3D scanners) into ResourceEditor.
Renderer
Please note that a lot of rendering improvements (PBR, new shadows, etc.) are in the R&D stage right now, so it will be integrated into the SDK only after further stabilization.
- Added support for Oculus Rift DK2 virtual reality headset.
- Added a sample for a mesh_shadow_base material: materials / shadow_00.
- Added a sample which demonstrates conversion into the world coordinates from orthographic projection mode: shaders / post_coordinate_01.
- All "projection" material parameters in the .mat files must be renamed "perspective". This parameter has same fields and should be used only for perspective projection mode. For orthographic projections the "orthographic" keyword should be used.
- Fixed fade distances calculations for child asymmetrical LODs.
- Resulting LOD mesh of ObjectMeshCluster is now work correctly with the rendering Distance scale parameter.
- Fixed minimum and maximum expanding values for wall configurations.
- Deferred, orthographic and mesh decals are now displayed correctly in the orthographic projection mode.
- Fixed morph targets weight calculations during batch-skinning.
- Fixed changing of cluster and clutter virtual camera offset parameters that caused rendering artifacts with random switching of texture coordinates.
- Fixed the Offset parameter of noise particles and physicals. Now it is possible to create huge scaling factors for noise fields.
- Added setNumTexCoords0() and setNumTexCoords1() functions for static and skinned objects, which allow you to specify the custom number of texture coordinates (the corresponding getter functions are getNumTexCoords0() and getNumTexCoords1()).
- Added support for internal resolutions like 4K in small windows for the AppGrabber plugin.
Introducing AppBorder Plugin
The AppBorder plugin is used to hide the SSAO / SSDO shading artifacts at the screen edges. The functions of the plugin are stored in the engine.border class.
The plugin is launched on the application startup by adding -extern_plugin AppBorder to the command line.
GUI
- Added an isPermanentlyFocused() method to the InterfaceWindow class. It returns a value indicating if the window is in a permanent focus, meaning that it remains in focus even when its children window is in focus.
- Added a getVisiblePositionX / Y() function to the engine.interface class. It checks if the window of the given width is visible on a screen with the specified border at the given coordinate. If the window is visible, its position will remain the same. Otherwise, it will be updated in order to make the window visible (taking into account the size of the vertical border).
- The getCenterPositionX / Y() function of the engine.interface class would not return a value in the following cases: if the parent flag of the interface window is set to 0; if the window is hidden; if the window is not in focus; if the window is not an instance of the WidgetWindow class.
- Added a setBorder() function to WidgetGroupBox interfaces. It sets a flag indicating if the one-pixel border is rendered around the widget content (in a shape of a box).
- Added a new <image> tag allowing you to insert the image.
- Added dx and dy arguments to the <xy> tag.
- Added a new widgets / splash_04 sample.
- Added addLineIndex() and addPolygonIndex() functions to WidgetCanvas interfaces. They add an index for the point of the line segment / polygon to the canvas widget. The corresponding sample is widgets / canvas_03.
- Added a setItemSelectable function to WidgetMenuBox interfaces. It sets a value indicating if a given item can be selected (i.e. the item is highlighted when you point to it). The corresponding checking function is getItemSelectable().
- Added an ability to use other widgets as menu items to the WidgetMenuBox class.
- A MenuBox will be rendered as external window if the Interface plugin is loaded. It also will follow the main window while window movements.
- A MenuBox will be always visible on screen borders.
- Added trilinear filtering of GUI textures with mipmaps instead of bilinear (DDS format only).
- Added support for all font parameters including spacing, offsets, rich and wrap options for the font <text> tag.
- Added setMinExpand / setMaxExpand() functions to WidgetSlider and WidgetSpinBox interfaces. They set the minimum / maximum value, up to which the lower/ upper limit of the range of the slider / spinbox values can be expanded. The corresponding getter functions are getMinExpand / getMaxExpand().
C# and C++ API
- Added findParameter(), findState() and findTexture() (only to Unigine::Material) functions with the fast_id argument to the Unigine::Material and Unigine::Property classes. Searching by a fast identifier provides better performance.
- Added an Unigine::EnginePtr unique smart pointer for the Engine interface. It performs automatic calling of the Engine::shutdown() function in the destructor.
- Added a setEnabled() method to the Unigine::Object class. It enables/disables the node. The corresponding checking function is isEnabled()).
- Added access to PlayerSpectator, PlayerActor and PlayerPersecutor interfaces.
- Added access to the Splash interface that controls the settings of splash screens.
- Added a clearChilds() function to the Unigine::Xml class.
- Added a decomposeProjection() Unigine namespace function. It decomposes the projection matrix.
- Added access to ObjectWater and ObjectWaterMesh interfaces.
- Added functions for setting mouse buttons and keyboard keys event callbacks to the Unigine::App class: setButtonPressFunc(), setButtonReleaseFunc(), setKeyPressFunc(), setKeyReleaseFunc(), setKeyPressUnicodeFunc().
- Added functions controlling post-process materials rendering to the Unigine::Render class: setRenderMaterials(), getRenderMaterials(), setCompositeMaterial(), getCompositeMaterial(), setPostMaterials(), getPostMaterials(), setFadeColor(), getFadeColor().
- The selectFile / readFile() functions of the Unigine::Package class can work with files inside. Technically is possible to create run-time conversion of user file formats into our formats inside the Unigine::Package class. So the Unigine::Package class can be user as a file format translator. The systems / stream_00 sample demonstrates this feature.
- Added a type() method to all classes. It returns the class type identifier.
- C# samples on Windows use shared UnigineSharp_*.dll libraries from the /lib folder now, copying them to the sample folder is no longer required.
UnigineScript
- Added a new Json class used to parse and create JSON formatted strings.
- Restored a getNormal() function of the ObjectMeshStatic / Skinned / Dynamic classes.
- Added a removeFast() container function (for vectors only). It deletes the specified element and puts the last array element instead of the specified element. Thereby the array length is reduced by one.
- Added a copy() function to the Xml class. It copies all data (including the hierarchy) from the source class to the current one.
- Added a set_hidden() file system function (for Windows). It sets the given file or directory as hidden. The corresponding checking function is is_hidden().
- Added a getQueue() function to the Async class. It returns the number of queued asynchronous threads.
- Added getFileSize() and getSize() functions to the Dir class. They return the size of file or directory correspondingly.
- Added a setDistance() function to the WorldExpression class. It sets the distance starting with which the expression is not executed. The corresponding getter function is getDistance().
- Fixed parsing of complex preprocessor expressions like "#if a > 0 || b > 2".
- Fixed crashes on the stack overflow.
Engine
- Added a setData() function to all editor, game, physics, render and sound modules. It updates user data associated with the class. This string is written directly into a *.world file.
- Fixed collisions with objects for clusters and clutters.
- Added a force flag to all stateSettings() and saveWorld() functions of render, physics and sound modules. It forces the saving of all parameters.
- Added a force flag to saveWorld(), saveState() and restoreState() functions of the material and property interfaces.
- Added replaceMaterial() / replaceProperty() functions to the material and property interfaces. They replace the specified material / property with the new one.
- Added a setEnabled() function to editor interfaces. It sets a value of the Enabled parameter that controls all internal additional engine processing (for example, reloading of textures when their recording time is changed and so on). For example, you can set the Enabled parameter to 0 when using Syncker in order to increase engine performance (as Syncker operates inside the editor environment and can reduce engine performance).
- Added setForceEnabled(), setDeflectorEnabled() and setNoiseEnabled() functions to particles. They enable / disable the particle system. The corresponding checking functions are: getForceEnabled(), getDeflectorEnabled() and getNoiseEnabled().
- Added removeVertex() and removeIndices() functions to the ObjectDynamic and ObjectMeshDynamic interfaces. They remove the specified number of vertices / indices starting with a given vertex / index. The removeVertex() function can optionally fix the index buffer after removal of vertices.
- Added a setSurfaceName() function to ObjectDynamic and ObjectMeshDynamic interfaces. It sets a new name for the specified surface if it was added via addSurface().
- A setViewDirection() function of player interfaces renamed setView() and moved to the Player base class.
- Increased precision of world transformation matrices inside the .world files.
- Added an objects / skinned_07 sample showing usage of multiple morph targets.
- Fixed keyboard autorepeat under Linux and Mac OS X.
- Now is possible to use archives without password protection at the same time with using archives with a password protection.
- Fixed saving of texture arrays for DDS containers.
Documentation
- Added a new Usage Examples section to UnigineScript. It provides basic information and frequently requested use cases for UnigineScript classes. For now, the following articles are available:
- Added a Double Precision Coordinates article describing a difference between using of a single and double precision of coordinates.
- Added a Port Angeles Workflow article describing the basic workflow of the Port Angeles demo.
- Added articles on the following physicals:
- Added articles on the following obstacles:
- Added an article on the AppGrabber plugin.
- Added an article on the AppBorder plugin.
- Added an article on the Mesh Combiner plugin.
- Added a Programming Overview article containing basic programming samples for all platforms and languages.
- Added a Project Workflow article.
- Added an Importing Cars to Driving Simulator tutorial.
- Added an Adding Morph Targets tutorial.
P.S.: UNIGINE 2.0 stable release is virtually there!