Development log: June 14, 2012
Improved Clouds, Flash and Mobiles Support, New Editor Plugin System
- Added billboards_cloud_base material for ObjectBillboards to create scattered clouds that interact with the environment and lighting (see a picture below).
- Improved volumetric clouds turbulence and added a Z-axis noise mask transformation to create higher-detailed, swirly volumetric clouds.
- Added hardware support of a custom mouse cursor for Windows, Linux and Mac OS X.
- Improved performance of DirectX 11 shaders.
- Removed Direct3D10 support.
- Added DirectX 11 renderer of DirectX 9 feature level (Direct3D119). This mode is set by engine if a graphics card is compatible only with DirectX 9. It will be mostly used for next-generation mobile devices, i.e. with Windows 8 on ARM processors. Shadows are not supported due to hardware limitations.
- OpenGL ES is no longer supported for default shaders (it's still supported for simplified shaders though).
- Simple shaders are automatically loaded if OpenGL ES or Direct3D119 renderers are used.
- Impostors were completely removed.
- Added separate Scale parameters for all HDR flares to avoid overexposure.
- Added render_manager_create_dummy_textures/meshes console commands. If set to 1 (by default), downsized textures and dummy meshes (without any vertex data, only surfaces are listed) are pre-loaded first at high speed. Full-sized textures and meshes with all geometry data are loaded only on demand, when they get into the view. This makes the world start-up much faster.
- Console command render_manager_list now prints a texture format name (it's useful for debugging).
- Added orthographic projection support for Widget manipulators.
- ObjectMeshClutter and ObjectMeshCluster are even faster for meshes with multiple surfaces.
ObjectBillboards with billboards_cloud_base material can be used to create foggy clouds that interact with environment and hide mountain peaks. As the sun changes it position, clouds are lit differently.
- Added full support of more mobile GPUs:
- Qualcomm Adreno 220 and 225
- Imagination Technologies SGX530, SGX531, SGX535, SGX540, SGX545
- ARM Mali 400
- Added access to the hardware depth buffer and screen buffers.
- Added full support of Qualcomm compressed image formats: ATC1, ATC3 and ATC5.
- Added support of GL_NV_depth_nonlinear extension (a depth texture format supported on NVIDIA Tegra).
- Added a simple and fast water material into a set of simplified shaders for mobile devices.
- Improved Android application lifecycle: when Home button is pressed and the application goes into the sleep state, there is no battery consumption.
- Added support of Android lifetime functions into the system script: you can call resume(), pause() and stop() to control application when activity state changes.
- Added gles_render_flush_transparent console command for OpenGL ES renderer. It forces to flush GPU depth buffer between rendering opaque and transparent objects for synchronization purposes. For example, it is used to render water on some mobile devices.
- The system script sets filesystem modifiers for hardware-specific texture compression formats (PVR, ETC or ATC) based on the detected mobile GPU. It means the engine will automatically select a texture with hardware-supported compression, if appropriate files are found. For example, on Qualcomm devices, texture.atc.dds will be used rather than texture.dds (with regular DXT compression); while on Imagination Technologies devices, it will be texture.pvr.dds.
- Added Horizontal and Vertical stereo modes used for glass-free MasterImage 3D displays on mobile devices. They are enabled via extern defines RENDER_STEREO_HORIZONTAL and RENDER_STEREO_VERTICAL without any performance decrease. The same mode is selected in the graphics chip driver.
- Engine controls are now cleared on every world reload.
- Keyword using is now in the global namespace.
- Added save/restore state functions for Materials and Properties.
- Added a function to set a namespace name for Expression, making it possible to call Expression methods from the outside.
- Splash screens can use an image instance, making it possible to create and change splashes dynamically.
- Added full access to Unigine::Widgets font parameters.
- Added functions to get information on ObjectMeshSkinned vertices and indices.
- Added functions to preallocate vertex and index buffers for ObjectMeshDynamic and ObjectBillboards (see allocateVertex() and allocateIndices functions), which make object creation faster.
- Added color clamping for visualizer primitives (see engine.visualizer.render*() functions with color argument).
- New parser option: it is possible to use assignment operator for #define (DEFINE1=DEFINE2) and set it via include directive (#include DEFINE1, by which DEFINE2 will be actually used).
- Fixed a compilation bug in C++ API samples.
- Added Unigine::ObjectBillboards interface.
- Added an option to force reload of filesystem packages via FileSystem::reloadPackage().
- Added Stars generator based on ObjectBillboards (ObjectBillboards node -> Stars tab). It uses FK5 stars catalog format; see a new billboards_03 sample.
- Fixed a bug with canceling of NodeReference changes in the editing mode.
- Added an option to change the root of the NodeReference.
- Added ObjectSky tracks into Tracker.
- Added shadow map size and translucent map size tracks for light sources into Tracker.
- Added a new track that allows for modifying a NodeReference root node in Tracker.
- Fixed issues with nested tracks in Tracker.
- Added an option to grab a screenshot of the scene only (no GUI, messages or the profiler) via F11 button.
- Removed SpeedTree plugin support.
- The application main window position is saved and restored after relaunching.
- Fixed an issue with restored Interface plugin windows on the engine startup.
- Fixed an issue with environment cube map calculation. Environment lighting coefficients are now normalized. Because of this, LightProb sources need to be re-baked (you can use Tools -> Batch option for that). If environment cubemaps are used in Tracker, they need to be reopened.
- Added seamless filtering for cube images in Tools -> Grabber.
New stars generator in action:
- ImageDDS utilizes all available CPUs in a batch mode for faster texture compression (when multiple images are specified or imagedds.py is used).
- ImageDDS can scale images while preserving the minimum possible texture size (-ms option). It can be used for batch processing of images.
- Removed OpenCL and alpha-tested textures support from ImageDDS.
- FileServer can receive directory names as arguments to work only with selected folders (-d option).
- TerrainMesh generates a correct hight map even if there are overlapping polygons.
- Added support of Visual Studio version 11.0.
- Added a fast batch mode for Visual Studio (it is enabled by default; to disable it use scons batch=0 option).
- All console log messages are now shown in the VisualStudio debugger.
- Improved stability of file queries (archived and non-archived files are read in the same order).
- Much faster loading of resources over the network.
- File system modifiers can be used for directories. For example, you can create textures.atc and textures.pvr folders to store textures for different mobile devices (depending on the hardware-supported compression); or localization.en and localization.fr folders to store English and French localized files. After that, in scripts a directory can be specified simply as textures or localization and the engine will automatically select the one with an appropriate modifier.
- Added systems/socket_00 sample to test Socket class functionality: an HTTP request is sent to google.com and an answer is received.
- Fixed a bug with parsing of command line parameters in AppWall plugin.
- ObjectGrass, ObjectMeshClutter and WorldClutter can now intersect with a root node of the parent NodeReference.
- It's easy to add custom shaders now: every base vertex shader can include an external file set via VERTEX_SHADER definition.
- Added a separate article on Class Inheritance (UnigineScript -> Class System -> Class Inheritance).
- Added an article on post_filter_wet post-process material (Materials -> Postprocess Materials -> post_filter_wet).
- Added an article on Stars generator for Billboards (Principles of Operation -> Objects -> Billboards -> Stars Generator for Billboards).
- Updated information on Network plugin (C++ API -> C++ Plugins -> Network Plugin).
- Updated an article on ImageDDS tool (Tools -> ImageDDS).
- Updated an article on Using ActionScript (Programming -> Using ActionScript).
Flash implementation is now at least two times faster! As tested on Oil Rush, the engine can easily handle even complex interfaces at higher speed. Moreover, you will find:
- Massive memory management refactoring for optimized performance.
- Extended support of ActionScript 2.0 functionality (see below).
- Built-in garbage collector for Flash objects: if unused, objects will be removed automatically.
- New function for WidgetFlash to set/get bitmap images to/from a Flash file.
- Fixed incorrect mouse intersection with movie clips.
- Added 9-slice grid scaling support for MovieClips and buttons. (See widgets/flash_03 sample.)
In detail, ActionScript 2.0 support has been extended to access:
- Stage object and its width and height properties.
- MovieClip methods loadMovie(), createEmptyMovieClip(), duplicateMovieClip(), removeMovieClip(), attachMovie(), hitTest(), getNextHighestDepth().
- Array method splice() and property length.
- String property length.
- Engine functions systemSet(), worldSet(), editorSet().
An example of Flash-based GUI:
Editor plugin system:
From now on, customizing the Unigine editor for project-specific needs is very easy. After a script with custom functionality is coded, adding new tabs into the default windows or new editor modules, as well as changing a set of editor features for different projects is just a few clicks away.
Editor plugins are loaded via Tools -> Plugins -> Add option. They are saved and automatically loaded on the next application start-up.
- A plugin is any *.cpp file in UnigineScript language.
- It should contain getName() function that returns a namespace name for the plugin (use this namespace for created GUI elements and callbacks).
- If necessary, you can also implement init(), shutdown() and update() functions for your editor plugin.
PS: Wow, that was quite an impressive list of changes. Stay tuned, there are a couple of big announcements to come later this summer!