Unreal Engine 4.9 Release Notes

Choose your OS:

This release brings hundreds of updates for Unreal Engine 4, including 129 improvements submitted by the community of Unreal Engine developers on GitHub! Thanks to all of these contributors to Unreal Engine 4.9:

Major Features

Enhanced Support for Mobile Devices

We've been working to greatly improve support for mobile platforms in UE4, and this release contains many exciting rendering features to help you create leading-edge mobile titles. These include efficient dynamic shadows, movable lights and decals. Expect to see continued improvements to mobile and HTML5 rendering quality in the future. In this release, IOS In-App Purchases has been improved and we've added Remote Push Notifications and support for CloudKit. For Android, we've added OpenGL ES 3.1, Immersive Mode support, asynchronous audio decompression, and better orientation features. And we now include NVIDIA AndroidWorks to make it easy to get up and running on your device. UE4 now includes a Flurry analytics plugin for iOS out of the box, also! Many of the new features for mobile devices are also available in your HTML5 games, too.

New: Dynamic Character Shadows for Mobile

Dynamic modulated character shadows from directional lights are now supported on mobile devices!

You can use dynamic modulated shadows even if your scene is statically lit

To enable this feature, turn on the "Cast Modulated Shadows" option on a directional light!

New: Dynamic Point Lights for Mobile

Dynamic point lights are now supported on mobile devices and HTML5!

These can be used to enhance short lived visual effects such as explosions, projectiles, particle effects etc.

Up to four dynamic point lights are supported on each object being illuminated.

Note: Dynamic shadows cast from point lights are not yet supported

New: Decals on Mobile

Decals are now supported by the mobile renderer!

Translucent, additive and modulated blend modes are supported

Note: Only unlit decals are supported on mobile and web, currently.

New: Major VR Updates

Steam VR (HTC Vive)

Unreal Engine's SteamVR plugin includes many major fixes to make it easier to use, and more performant.

SteamVR improvements include:

Fix for latency issues that appeared in 4.8 Preview 2+

Support for the standard Motion Controller abstraction, so both Vive controllers can route to the same player

C++ projects are now cleanly supported by the plugin API

Various improvements and bug fixes

Gear VR Updated to Mobile SDK 0.6.0

This revision fixes several major Gear VR rendering bugs and issues present in the 0.5.0 release, as well as some hardware compatibility issues.

New: VR Motion Controller Support

Motion Controllers are now supported through a common abstraction layer in UE4!

This means that motion controller devices will now all be available through a common interface. The HTC Vive controller is currently supported, with more (such as the PlayStation Move) to come soon. Input button presses and triggers can now be routed to a single player from multiple controllers, using the Motion Controller key abstraction. Additionally, you can add motion tracking to your project by simply adding a Motion Controller component to your character, which automatically updates anything attached to it to follow the position of your controllers! We recommend that all plugins for motion controllers move over to the new system, so that they can be part of the device-agnostic interface.

New: Experimental DirectX 12 Support

DirectX 12 is now supported as an experimental feature! If you are using Windows 10, try it out by running the engine with "-DX12" on the command line.

Microsoft's engineers added support for DirectX 12 to UE4 and we have worked with them to integrate their changes into 4.9. The feature is still new and is considered experimental. DirectX 12 offers a much lower-level rendering API that is more efficient and allows for rendering commands to be submitted in parallel across many threads, a feature inspired by console rendering APIs. Going forward, we'll continue to improve support for DirectX 12 and look for ways to leverage the new API in upcoming versions of the engine.

The Collision module on GPU particle emitters has a new property called 'Collision Mode' where you can specify 'Distance Field'

In order for a particle to collide we need to have a colliding plane, and this can be extracted very efficiently from the distance field. A single sample of the distance field gives distance to the nearest colliding surface. Computing the gradient of the distance field provides the direction to that surface, and the surface's normal. Putting these together gives the collision plane.

Particle collision using this method is more reliable than the existing Scene Depth collision, which only collides against what's on your screen, restricting it to effects with short lifetimes. However, the global distance field is fairly low resolution so particles will pass through thin objects, and sharp corners are rounded.

As with all distance field features, this requires 'Generate Mesh Distance Fields' to be enabled in the Rendering Project settings. Distance field particle collision is a Shader Model 5 feature, on hardware that doesn't support SM5, the particles will fall back to scene depth collision instead.

Particle collision with distance fields is very efficient - it costs about the same as particle collision with scene depth.

New: Hierarchical LOD Fast Preview and Clustering

Hierarchical Level-of-Detail (HLOD) is a system introduced in 4.8 which allows many objects in your levels to be collapsed down to only a few objects when they are small on screen. This helps you achieve much higher quality levels when viewing objects up close, and faster overall performance for your level. We've made improvements to HLOD in 4.9 and will continue to in future releases.

Fast HLOD Preview

In order to allow for rapid iteration on Hierarchical LOD builds, you can now use the Preview HLOD option. This will create the HLOD Actors with only a visual representation of their bounds and objects without merging and creating the HLODs meshes themselves. Their bounds are rendered according to the Draw Distance setting inside the LOD System settings for the specific Hierarchical LOD Level.

The image above shows both the first and second Hierarchical LOD level clusters popping into view, this gives a clear indication how the level is clustered without having to go through the time-consuming process of merging and creating the Hierarchical LOD meshes. Be aware that this is an initial implementation of the preview system and may tend to change and improve over time.

Custom LOD Clustering (HLOD Volumes)

In order to allow for more granular control over the clustering process for the Hierarchical LODs, you can now place Hierarchical LOD Volumes which will define a cluster for the Actors it encapsulates. Use this to manually define which areas and objects within a level should be clustered together.

New: "Arch Vis" Character Controls

The new "ArchVisCharacter” plugin adds a character class that provides out-of-the-box controls appropriate for architectural visualization applications. It is intended to feel pleasant and natural to control at realistic world scales, and to enable smoother videos and live demos.

You can hook up ArchVisCharacter directly as your Pawn Class, or you can create custom blueprints from it to tweak the movement settings as you see fit.

New: Widget Depth Ordering

Widget Components in screen space now automatically sort based on distance from the viewer, ensuring the closest screen space widget component is always on top of the other components.

We now sort all widget components against one another based on distance to the camera. Previously it was based a manual Z Order, or whoever was added to the viewport first.

New: Area Shadows (for stationary lights)

You're no longer limited to sharp shadows with uniform penumbra sizes. The Lightmass ray-tracer now supports area shadows are now fully support for Stationary lights!

Turn on the "Use Area Shadows for Stationary Light" option to use this feature. The 'Light Source Angle' (or 'Source Radius' for a point light) controls how soft these shadows are.

Performance details:

Uniform penumbra shadows are still better at dealing with low lightmap resolutions, so those stay the default. Previously the uniform penumbra size was controlled with an obscure project setting, now it is controlled by the 'Light Source Angle' property, just like the area shadows are. Double the source angle to get twice as soft shadows, etc.

There's also a new optimization for areas of maps which are only affected by a single stationary light channel (eg one Stationary Directional light). Their shadow maps will be packed into a single channel texture instead of a 4 channel texture, for 1/4th the memory cost.

New: Ambient Occlusion Material Mask

The new Ambient Occlusion Material Mask feature lets you access Lightmass calculated AO in your material, which can be useful for procedural texturing, for example to add in aging effects and dirt in areas where it would accumulate.

The above screenshot uses an AO mask to blend a dirt layer automatically into corners of the environment.

To use AO mask, you'll need to enable both 'Use Ambient Occlusion' and 'Generate Ambient Occlusion Material Mask' under World Settings -> Lightmass settings, and then build lighting. The other AO controls like Max Occlusion Distance can be useful to tweak the look. (Be sure to set Direct and Indirect Occlusion Fraction to 0, so that this AO will not be applied to the actual level lighting.)

Then in your material you can access the AO as a 0-1 mask with the PrecomputedAOMask node. This node will provide 1 in occluded areas and 0 elsewhere.

Performance details:

Using the PrecomputedAOMask node is just a standard texture lookup. Enabling the feature adds half a byte per lightmap texel, where the default usage is about 4 bytes per lightmap texel.

AOMaterialMask texture memory can be inspected with the ‘ListTextures' console command.

New: Mesh Distance Field Materials

This feature allows your materials to cheaply determine the distance to the nearst solid from any point in space. There are two new nodes to access the global distance field properties within the material editor.

DistanceToNearestSurface returns signed distance in world space units. Note that the distance will always be near 0 on the surface of an opaque mesh. DistanceToNearestSurface can be used to have effects avoid occluders:

As with all distance field features, this requires 'Generate Mesh Distance Fields' to be enabled in the Rendering Project settings. Distance field material access is a Shader Model 5 feature. Use a FeatureLevelSwitch material node to provide fallbacks for Shader Model 4 hardware.

New: Improved Distance Field Ambient Occlusion

Sky occlusion gives nice soft shadows around objects lit by the sky, especially important in overcast lighting scenarios, a use case traditionally hard to render at high quality without precomputed lighting. Distance Field Ambient Occlusion solves this for fully dynamic games where both the time of day and environment can change at any time. We've put a lot of effort into improving the quality and performance of the technology for 4.9 and believe that it is now a shippable feature on medium spec PC and PlayStation 4 level hardware with a total GPU cost of under 4ms for a typical game scene!

The previous method did adaptive sampling, so flat surfaces did less work, but this also caused a lot of splotchiness in clean environments.

The AO computations are now fast enough to get rid of the adaptive sampling, so occlusion is much smoother.

The catch is that the new method requires a longer history filter, which can contribute to ghosting, especially when shadow casters are moved. Hopefully this can be improved in the future.

Performance

Distance Field AO has been made much faster such that it can run on medium spec PC and PS4. It also has a much more reliable cost now, so that it's mostly constant, with a slight dependency on object density.

In cases with a static camera and mostly flat surfaces, the new method is 1.6x faster. In complex scenes with foliage and a fast moving camera, the new method is 5.5x faster. The cost of Distance Field AO on PS4 for a full game scene is 3.7ms.

Technical details

The main optimization is the use of a global distance field, which follows the camera around. This is created by compositing all the usual per-object distance fields into a few volume textures centered around the camera, called clipmaps. Only newly visible areas or those affected by a scene modification need to be updated, so the composition doesn't cost much.

Visualization of the texel size of the clipmaps - each clipmap is a different color

The global distance field is lower resolution than the object distance fields, so it can't be used for everything. When computing cone traces for sky occlusion, the object distance fields are sampled near the point being shaded, while the much faster global distance field is sampled further away.

This is a visualization of ray tracing the global distance field vs object distance fields. Surfaces in the global distance field have become blobby and thin objects disappear.

New: Content Browser Advanced Search

The Content Browser now supports advanced search syntax. Unreal Engine 4 is used on many large projects, including some with teams comprising hundreds of developers, and content libraries with hundreds of thousands of assets! These new search features improve the workflow for finding your content on projects of any size.

This augments the existing simple search syntax by providing a way to match key->value pairs from the asset metadata, as well as the following special keys:

Name - Tests against the asset name.

Path - Tests against the asset path.

Class (alias: Type) - Tests against the asset class.

Collection (alias: Tag) - Tests against the names of any collections that contain the asset.

New: Collection Improvements

This release includes many changes to Collections that allow you to help you manage assets in your game such as collection nesting, smart collections and tagging functionality.

Nested Collections

Your collections of assets can now be organized into a hierarchy.

Child collections can be created by choosing the "New…" option from a given collections context menu. Alternatively, collections can be parented via drag-and-drop.

Dynamic Collections

Dynamic collections leverage the power of the Advanced Content Browser Search Syntax to allow you to create and share Content Browser filters.

Anything you can do with the Content Browser text search can be saved as a dynamic collection, including referencing other collections (both static and dynamic).

You can create a dynamic collection using the "Save" button to the right of the Content Browser text filter.

Quick Asset Management

You can now quickly add an asset to many collections at once using the new Quick Asset Management check boxes.

These are available within the collections view itself, or alternatively, via the context menu of any selected asset(s).

Improved Robustness

Collections will now automatically follow any redirectors that they contain, which avoids the issue of an asset seeming to vanish from a collection when it was renamed or moved. Additionally, collections are now considered when fixing up (and ultimately removing) redirectors via the Content Browser.

Improved Status Reporting

Each collection now has a little status indicator at the right hand side of its row item. This changes colour depending on the current state of the collection, with each colour meaning:

Red - The collection is in some kind of bad or read-only state. See the tooltip for how to resolve the issue.

Orange - The collection is not up-to-date with the latest version in source control.

Blue - The collection has local unsaved changes. This may happen if a save or auto-checkin fails, or if the collection had its redirectors followed.

Green - The collection is non-empty and up-to-date.

Grey - The collection is empty and up-to-date.

Improved Asset Tooltips

The static collections for a given object are now shown as part of its tooltip in the Content Browser.

New: Plugin Creation Wizard

Its now easy to create new C++ plugins for Unreal Engine 4! Check out or new plugin wizard.

The Plugins browser (accessible from the Window menu) now lets you create a new plugin!

You'll be able to give your new plugin a name and select from a few preset plugin types (Blank, Toolbar, Standalone Window).

This will create all of the initial files you need for your plugin to compile and be loaded into the editor

New: Enhanced Curve Editor

We've made many improvements to the Curve Editor to make it easier to manipulate curve keys and tangents.

Middle mouse now also moves selected keyframes or selected tangents

Added support for selecting and manipulating multiple tangents

Selection now respects control (toggle) and shift (add to existing selection)

Added tangent display options: Always show tangents, show tangents for selected points, never show tangents

Added pre-post infinity extrapolation options for curves

Make adding keys more predictable

Keys are only added under the mouse when there is only one curve to edit

When multiple curves are available clicking on a curve will add a key inline on that curve, and clicking off of the curve will add keys to all curves

Changed the text of the menu item to make it clear what's going to happen

New: Multiple Return Nodes in Blueprints

A function can now have multiple return nodes. As soon as execution reaches a return the function's execution is terminated. This can be used to return early from a Blueprint function, or to branch and return differing values.

New: Construct Custom Objects in Blueprints

In Blueprints, you can now spawn baser object types (not just actors/components). The Construct Object From Class node takes a class and creates a new object of that type, similar to Spawn Actor From Class (except for types that are not an actor).

The "Outer" input will serve as the new object's owner, which controls the lifetime of the created object.

For actor classes, you'll still use the Spawn Actor From Class node. And for widgets, you'll use the Create Widget node. In a future release we may try to combine these different features.

New: Blueprint Class Defaults

In Blueprints, it is now possible to access a class's defaults through the new "Get Class Defaults" node. This can be helpful when working with data-only Blueprints, giving you access to those Blueprints' values without having to create an instance.

To keep the output pins from growing too unwieldy, use the node's details to show/hide specific defaults

New: Level Blueprint Communication

Level Blueprints can now be communicated with through interfaces. They can adopt and implement interface functions just as Class Blueprints can. After an interface has been added to a Level Blueprint, calls can be made through interface message nodes (using a streaming level as the target).

Use the "Get Streaming Level" node to get the level to communicate with

Since you have to use "Get Streaming Level" to target a specific level, this will only work for sub-levels

New: Optimized Math Expression

We've optimized the Math Expression node so that it is more performant than regular nodes. It is now roughly twice as fast to use a Math Expression node, when compared to a series of operation/function nodes representing the same expression.

New: Blueprint Asset IDs

We've made it possible for Blueprints to load assets on-demand instead of right away. There are two new data types exposed to Blueprints: "Asset ID" and “Class Asset ID”. An Asset ID represents a loaded or unloaded asset, and can be resolved into an object using the “Resolve Asset” node. If the asset was not loaded, then the “Resolve Asset” node returns an invalid object. You can load the asset using the “Load Asset” node. Similarly, a “Class Asset ID” will resolve into a class, and can be loaded with the “Load Asset Class” node.

New: Montage Element Timing Interface

​We've added a new panel to the Montage editor to help you control the order that Montage events will fire when your animations execute at runtime.

New: Non-Linear Animation Blending

We now support many different blending functions between animation poses and transitions!

Previously, only linear or cubic blending was supported. Now you can select from many different blending functions: Linear, Cubic, Hermite Cubic, Sinusoidal, Quadratic, Circular, Exponential and Custom. For most types, you can separately control whether you want easing on either the "in" or the “out” of the curve.

The "Custom" option requires a “Curve Float” asset. After creating one, you can assign it in the details panel for the relevant nodes:

This will allow you to specify just about any blend you want to perform. The length of the curve will be normalized and scaled down to meet the specified blend time and any values that are outside of the range 0-1 are clamped back to fit (this limitation will hopefully be lifted soon, watch this space). If a custom curve is not specified the system will fall back to a linear blend.

New: Bone-driven Animation Controllers

This allows a "Driver" bone to dynamically affect the motion of one or more “Driven” bones. This is great for characters that have accessories attached! You can avoid geometry intersecting during an animation, even when a lot of blending is used.

In the above example, the attached accessory (green) has no authored animations, and is being driven in two axes as a function of the character's thigh bone. This is all calculated at runtime, so a blend of animations ends up working quite well here, even without hand-authored tweaking.

You can either set the "Driver" value directly with a multiplier, remap it into a whole new range, or just use a Curve Asset to drive the motion. Using a curve is usually the best approach as it lets you define the response naturally and interactively tweak points/tangents, seeing the changes in real-time.

Here are the new settings for bone-driven animation controllers:

New: Animation Transition Rules

Better handling of animation Asset Overrides

Nodes like Time Remaining in transition rules now correctly respond to changes in animation length due to overriden animations in Child Animation Blueprints. This means that animations referenced by transition rules no longer have to be the same length in every child Animation Blueprint.

Referencing the most relevant animation player

In order to make state machines more maintainable, you can now use a new class of getter that always picks the highest weighted animation from the source state, rather than targeting a specific animation that might change in the future. The following nodes are now available:

Custom Blend Graph Improvements

Additional information is now exposed in Custom Blend graphs to allow them to be used for more than just a one-shot custom transition animation. The following nodes that provide information about the corresponding transition node and source/destination states are now available in custom blend graphs:

You can also use getter methods that reference the asset players, just like in a transition rule.

New: Animation Curve Evaluation Change

Animation Curve Evaluation used to happen in Update phase of animation, but now it is moved to Evaluate phase. This comes with following benefits.

The curve's weight is properly is evaluated with blended weights.

Cache Nodes

Additive Nodes: Additive nodes will apply the delta of additive curve data from base to the current pose as animation bone transform does

Layered Node: This was a bit more tricky to make it work properly as you don't know which curve is influencing which part of joint. Right now it does provide option of how to blend curves.

Max Weight : It choose the max weight of curves from blended poses

Normalize by Weight : It sums up all weights of blended poses for all curves and normalize to 1

Blend by Weight: It just sums up (weights * curve value)

Curve Evaluation has moved to multi-threading if you're using parallel evaluation.

Eventually this will allow us to create a node that can drive curve from bone transform and vice versa

However, if you need a curve that hasn't been evaluated (if you're ticking but not evaluating), you won't get the up-to-date data. Curve data is treated as bone transform now as opposed to treated as notifies before.

New: Animation Asset Metadata Support

We now support Metadata that can be added to animation assets. The metadata is a Blueprintable class derived from the Anim Meta Data class. This allows you to add custom metadata to animation assets. Anim Sequence, Anim Montage, Anim Composite, and Blendspace are all supported.

You can query those data from an animation asset in C++ by calling the GetMetaData() method, or by using GetSectionMetaData() on Anim Montages.

New: Sound Quality Levels

A new feature has been added that gives sound designers the ability to manage audio memory usage and (to some extent) performance for lower end machines/devices.

The available Sound Quality Levels are defined in the Audio section of the Project Settings. Each Quality Level can currently specify the maximum number of audio channels created by the audio device (though some platforms, notably Android, can still limit that value a lower number).

In a Sound Cue you can place a Quality Level sound node that will provide an input pin for each Quality Level defined in the Project Settings and only the branch connected to the active Quality Level will be executed. This can be used to reduce the number of variations that are loaded or it could be used to specify reduced fidelity wave files.

When playing a standalone game, the Quality Level is specified via the Game User Settings and only the Sound Waves that are needed for that Quality Level will be loaded in to memory. The default value can be set per game or platform via the appropriate GameUserSettings.ini file and games can allow setting the value via their settings UI. Currently, the game will need to be restarted for the quality changes to take effect.

For Play in Editor you can specify which Quality Level to use via the Level Editor Play Settings. Changing this value will work while the Play session is active and new sounds will use the current Quality Level.

New: Custom Audio Attenuation Curves

You can now define your own custom curve for attenuating sounds rather than simply being limited to the built in algorithms.

In the attenuation settings set the Distance Algorithm to "Custom" and you will see the custom curve section appear. You can then either specify an external curve asset from the content browser or define a custom curve directly in the details panel yourself.

New: Actor Tick Intervals

You can now specify an interval at which a tick function will be executed allowing you to reduce the overhead of per-frame tick execution without the overhead or complexity of timers.

This is exposed to end users via the Actor and Component default properties and for programmers it can be set in C++ similarly to any other Tick Function property.

A few implementation details to be aware of.

All Tick functions execute the first frame they are registered, at which point they will wait the tick interval until their next tick.

Changing the tick interval of an already ticking function will not change when the next scheduled tick will occur. If you wish the change to take effect immediately you should disable the tick, change the interval, and then re-enable the tick.

Tick functions will occur as close as possible to the specified interval by providing a credit for any overrun when scheduling the next tick. For example if a function is specified to occur every 1 second and it has been 1.1 seconds since the last tick at the point the tick function is executed it will be scheduled to occur once another 0.9 seconds have passed. However, no tick function will execute more than once in a frame even if a multiple of its interval has occurred during the frame.

DeltaTime for tick functions remains the same regardless of tick interval. It is not the time since the last time this function ticked, but always the delta time of the frame in question.

An Actor's Custom Time Dilation does not apply to the Tick Interval. The frequency with which the tick is dispatched remains constant regardless of whether the individual Actor has its own Time Dilation, that Time Dilation is only applied to the DeltaTime passed in to the tick function.

New: Actor Encroachment Detection

Encroachment detection is also more robust and works in more situations. We've added new customization options for encroachment, too.

The "Spawn Even If Colliding" option ("bNoCollisionFail" in C++) when spawning an actor has extended to support four methods of handling collision at the spawn point:

Spawn it there anyway.

Spawn at suitable location nearby if possible, else just spawn it there anyway.

Spawn only if a suitable location can be found nearby, else don't spawn.

Just don't spawn it.

Existing blueprints will update automatically to choose the correct corresponding choice. Some code has been deprecated and will need to be manually updated.

Actor classes have a new blueprint-exposed member called Spawn Collision Handling Method that controls how to resolve spawn collisions by default. This can be overridden by the setting on the Spawn Actor node or function call.

For actors with a Movement Component, it is assumed the updated component is the primary collision shape and will be the only component tested for encroachment. For other actors, all components with appropriate collision settings will now be checked. Be aware this may result in some situations where actors fail to spawn after upgrading -- double check your collision settings, handling method, and spawn transform if this occurs.

New: Post Process Blending

Post process "Blendables" are used to transition post process effects between different states. We've made improvements to this system.

You can now set a blending weight value for each Blendable. This blending weight can be modified at runtime in either Blueprints or C++ code, so you can do some interesting things with post process transitions.

You're also now able to define post process settings "inline" right within the post process volume, or you can opt to create a standalone Blendables asset that you can share between many objects!

Also, we've made it easier to define your own custom blendable settings. You no longer have to modify the engine's built-in PostProcessSettings structure, but instead can define new structures with settings, such as the Light Propagation Volume Blendable settings above.

Finally, here's an example of how you'd use Blueprints to edit the blending weight value for a Blendable at runtime:

New: Runtime Asset Cache

Some games need to support storing local copies of assets that may not have shipped with the game. For example if you have a lot of procedurally created assets, or assets that come from a server (such as advertisement graphics.) The new Runtime Asset Cache is a generic asset cache system that can be used to persistently store data generated during runtime in configurable asset buckets.

When cache grows larger than specified size, oldest entries are removed from it.

New: Volume Decals (Experimental only!)

3D function field rendering is an alternative to polygons for describing geometry. It is better-suited to solving some hard rendering problems such as shadows, Boolean operations, smoothing, ambient occlusion, ray tracing, and deformation. 2D and 3D distance functions are already in use in various places in the engine, like fonts, lightmaps, and distance field shadows/ambient occlusion. The new Volume Decals feature enables a distance function to be rendered as opaque objects into the GBuffer, using all of the information normally available to deferred passes, including ambient occlusion, screen-space reflections, lighting, and depth of field. The bowl in the following image is a Volume Decal.

The object was created (see image below, from left to right)

by defining a sphere with the distance to the decal center and a texture projection

defining a sphere another sphere and taking the maximum of both (boolean intersection)

moving the spheres to adjust the shape

adding another sphere and changing the material (boolean subtraction)

adjusting the shape again

This is how the distance function for the sphere is defined:

The feature is unfinished. Shadow casting, normal map support, and indirect lighting are missing, and performance and quality optimizations have not been made. In addition, the feature will always be costly on the GPU (distance function needs to be evaluated maybe hundreds of times for each pixel). We will polish it further by adding material functions, shadow casting, documentation, etc., but it might never be fast enough for real-time use.

New: UE4 Documentation Tags, Version and Skill Level

Documentation pages now have skill level, engine version, and category tags which are displayed at the top and bottom of pages that enable you to find other pages with matching tags.

Added ability to filter the sitemap by skill level and/or engine version. The sitemap is now an expandable tree view. When filtered, the tree is expanded to show matching items while non-matching items appear grayed out

Skill Level, Engine Version, and Tags on pages also now link to the sitemap and automatically filter it. Clicking a tag opens the sitemap filtered to only show pages with that tag.

Links to tutorials (how-to's, quick starts, etc.) display the skill level and engine version of that tutorial:

New: Asynchronous Real-time Audio Decompression

Platforms that support real-time ogg-vorbis based audio decompression (PC, Xbox One, Mac, Android) now perform the decompression asynchronously when possible to avoid blocking operations on the main game thread.

New: Shared Resources for Feature Packs and Templates

We now support shared resources in templates and feature packs. This is achieved by allowing both templates and feature packs to specify other feature packs to include. This means that many assets that were common to all templates now only exist once. It also means that we no longer need to duplicate assets that are shared between the Blueprint and C++ versions of templates.

Multiple target platforms are supported, so different assets can exist in a template or feature pack for mobile and desktop targets. That's useful when you want lower detail models on one platform but not another, for example.

New: Improved HTML5 (Easy Setup, Amazon S3 Support, Networking)

You no longer need to install any third party SDKs to start development with HTML5 and package your game for a web browser! To package, simply select HTML5 in the File -> Package menu.

Other improvements include:

Emitting compressed javascript which reduce the size of the builds drastically.

A small web server is included with the game during packaging which can handle serving compressed files for local testing.

HTML5 Networking is now supported! There is now a Unreal Build Tool configuration variable which can be used to create dedicated servers that support HTML5 clients.

We now support uploading to Amazon S3 during packaging. Once the credentials for AWS are filled in, the build will be uploaded to S3 and the game can be served to browser directly from S3.

Release Notes

AI

New: A dedicated AI asset category has been created and is available in Content Browser's context menu.

New: Added log errors when EQS (Environmental Querying System) queries take longer than 0.25 seconds (cumulatively). When the query completes we also log how long each test took to perform.

Fixed crash when doing a pathfinding batch EQS Query Test when test items are not considered valid.

Fixed "On Circle" EQS generator crashing if its query owner is not an actor.

Blueprint compilation and loading are much more efficient.

Behavior Tree

New: Added dynamic subtree injection support for behavior trees.

New: Added new restart mode for behavior tree tasks, they can now ignore restart which leads back into running the same task again. Use case depends on task type and its parameters: some of them work better with restarting every time (e.g. movement), some should finish their action (e.g. animation).

Blueprint based behavior tree tasks will now ignore Finish Execute and Finish Abort calls depending on state of task, fixed latent blueprint actions not being cleared when task finishes execution.

Fixed Behavior Tree tag cooldown decorator testing the current value of the tag cooldown end time against its duration. (Duration in the Tag Cooldown decorator should only be applied when we deactivate, not used for comparison.)

EQS score for the winning item will no longer be set to 1 when picking a single item. That way, scores can be compared appropriately since none of the other scores have been normalized. They will all be on the same relative scale.

Tweaked description width for EQS debug display from 200 to 312 to allow for slightly longer descriptions without overlapping the next column. Item Description Width, Item Score Width, and Test Score Width can now be tweaked in code (they are now variables rather than in-line values).

Navigation

New: Added bUseNavAgentGoalLocation to pathfinding Reached tests for moving to Actors. (Sometimes it is useful to move towards / test against the actual actor's location, rather than its location projected into the navigation system.)

Navmesh's rendering component has been made transient and we made sure any navigation rendering component saved with old maps won't break anything.

Updated deprecation messages for Navigation System's "get random point" functions family to be more precise.

Animation

New: "Observe Bone" nodes for debugging animations.

These let you print out the current position of a bone (at that particular point in the animation tree) and have a couple of options for coordinate space and whether to display relative to the reference pose.

The observe bone nodes are meant for debugging. They don't cost much but are not currently compiled out of a shipping build, so you should probably remove them when you are done working with the graph.

New: Added turntable feature for Persona.

New: Added a "Remove this LOD" button to each LOD (after 0) in Persona's mesh mode.

New: Added an icon overlay to the 3D thumbnail for Animation Blueprint assets in the Content Browser.

New: Added new node "Bind Cloth To Master Pose Component" that makes cloth on a slaved skeletal mesh component to reuse the simulation data from the master component, rather than processing the cloth separately.

A montage can only have a single leader. A leader can have multiple followers.

Synchronization is performed once before any of the leader or followers are updated in a given frame.

Essentially, synchronization is performed one frame late, so tick order between montages is not an issue.

New: Allowed skeletal controls to specify the coordinate space that they would prefer the gizmo to be displayed in by implementing GetWidgetCoordinateSystem.

New: First pass of the dependency preloading system.

Uses asset information created during cooking to determine the dependencies for all packages and make them load BEFORE the requested package. When using pak files, the pak file will be ordered to match this load order, giving much reduced seek times.

Currently disabled by default, but can be enabled with "s.PreloadPackageDependencies 1" in the console.

New: Look At Control now supports look axis in local space.

New: Started moving animation nodes out of Engine into a new AnimGraphRuntime module.

New: Support Append Frames in the begin/end of the AnimSequence.

Also fixed to rearrange notifies and curve keys.

New: Wrapped re-entrancy checks during AnimationBlueprint node Update/Evaluate in DO_CHECK tests so that they are compiled out in shipping builds.

Animation and joint name now supports UTF-8 when importing.

Animation Record gives default path and available name.

Changed MasterPoseComponent serialization so that you can use it in a construction script.

Changed animation stat names to reflect whether they are running on the main game thread or a worker thread.

Changed new NativeNotify menu to display the localized class name.

Fix for crash in BlendSpaces when referenced AnimSequences have been deleted.

New: Particle system promotion tests are now contained in the Cascade module.

New: The geometry automation tests have been separated from the 'General Editor Tests' automation test. It is now: "System.Promotion.Editor.Geometry Validation".

New: UAT and UBT will no longer wait for the global mutex, and will fail immediately instead. Previously, each instance would wait in line serially, hiding the fact that the command was not actually running.

New: Added the ability to filter out library functions and macros from the Blueprint context menu.

New: Added various improvements related to Select node. The node doesn't return a copy of input parameter, it returns a reference to the input.

New: An "InternalUseParam" meta tag for UFUNCTION has been added to support hiding function parameters from Blueprints. The pin for that parameter will be hidden and not connectable.

New: Blueprint Timer API improvements.

Set Timer By Delegate now returns a Timer Handle to be used when interacting with the timer via other functions. Interacting with timers by handle is significantly more performant and enables the same timer delegate to be used for multiple timers simultaneously.

Set Timer By Name, and all timer manipulation functions, by name and delegate have been deprecated.

New: Blueprint Timeline UI updates:

Made individual tracks collapsable.

Added an option to turn off the view synchronization for an individual track.

General padding and layout tweaks.

New: Game/URL Options parsing nodes are now exposed to blueprints.

New: Can change a variable's type in the My Blueprint window by clicking on its type icon, or right-clicking to toggle whether or not it's an array.

New: Can drag and drop custom events from the My Blueprint window to add a call function for the event.

New: Can promote pins to local variables in Blueprint function graphs (or their child graphs).

New: Can set the Advanced Display flag on Blueprint member variables.

New: Made the boolean pin in Blueprints less subtle.

New: Fixed a crash that could occur with data-only Blueprints that explicitly called their parent's construction script.

Attaching a bool to the "Select" nodes index pin will force the node to update it's pin names even when there are only two options.

Axis mapping value getters can no longer be called from other blueprints.

Blueprint Diff Tool no longer has buttons to switch between the components, graph, and defaults views. Navigation is now done via the list of differences.

Blueprint Editor context menu filtering is much more efficient.

Blueprint member variables of type component that are not generated by SCS now have the details options normally available to exposed variables.

Breakpoint is triggered on Access None error.

C++ Functions that are tagged as BlueprintImplementableEvent and are overridden as a function graph in Blueprints will display an error when attempting to drag and drop into the graph to inform the user that the function is not Blueprint Callable.

Call Function nodes will no longer change the function reference when duplicating the node or duplicating the entire Blueprint.

Can no longer split pins on Blueprint nodes if the struct does not have any valid properties.

Can now Make and Break the DateTime struct in Blueprints.

Can right click in collapsed graphs to add local variables that are part of the outer function graph.

Can right click on any node to search for references of it. Does initial search only in current Blueprint.

Can use unicode characters in Math Expression nodes.

All unicode "letters" are now allowed for variable/input/output names.

This does not extend to symbols and only the underscore symbol is still allowed.

Cannot name Timeline tracks the same as any of the native pins on the node.

Any nodes previously broken by this functionality should work again.

Changing a pin type on a Select node will recombine all sub pins on the option and result pins before setting the new pin type.

Changing the Class of a "Spawn Actor from Class" node will no longer disconnect the result pin's links if they are still valid.

Child components in a Blueprint Class asset attached to a default scene root will no longer be lost after reparenting to a Blueprint Class that also has a default scene root.

Connecting function result node array pins to a reroute node will no longer prevent the node from compiling with all its output parameters.

Copying and pasting a K2Node_CallFunction with an interface pin for the self pin will no longer change the self pin into a normal Object Reference pin.

Deleting a custom event when there are no other events in the Blueprint will no longer disallow you to name other items placed in the Blueprint the same as the deleted custom event.

Drag and dropping a component from the SCS editor to a graph will no longer incorrectly report that the graph is outside of scope when it is a part of the same Blueprint.

Dragging and dropping variables from the My Blueprint tab will no longer default to assuming that the variable is read-only.

Duplicating function or macro graphs that contain nodes with Text pins will no longer incorrectly link the original and duplicated pins so that changes in one appear to affect the other.

Duplicating the "Add Scene Component" node while the transform pin is split will no longer make visible the transform pin on the duplicated node.

Editing a blueprint that is instanced in a hidden sub level no longer resets transforms on the hidden instances.

Ensure 'bExchangedRoles' is not set after serialization of an Actor-based Blueprint Class asset.

Examining the value of an enum array pin will show the enum value's display name.

Fixed a crash when compiling a Blueprint while intermediate graphs are open.

Fixed a crash while compiling a Blueprint with a validated Get node that is missing a property.

Fixed a crash when compiling a Blueprint while Find-in-Blueprints is searching all Blueprints.

Fixed a crash when vectors are compared in Math Expression using operator!=.

Fixed a potential crash during component registration when constructing instances of a Blueprint Class.

Fixed a bug that prevented new components from having the same name as a deleted one (prior to a compile).

Fixed a bug that was preventing copy, duplicate, and rename hotkeys from working in the Blueprint viewport.

Fixed a bug where certain keywords for Blueprint menu items were being ignored.

Fixed a bug where dirty Blueprints were not being compiled before you selected "Launch".

Fixed a bug where static functions were being hidden from Blueprints with Hide Categories metadata.

Fixed a bug with cyclic parent/child dependencies, where inherited components could be trashed when compiled.

Fixed a bug with parent/child cyclic dependencies, where the child's overridden property values would be cleared on load.

Fixed a crash after renaming local variables when other functions have local variables of the same name.

Fixed a crash that could occur when passing a default Blueprint Session Result object to the "Join Session" Blueprint node. Instead of crashing, the join will fail an execution will continue from the "On Failure" pin, as normal.

Fixed a crash that could occur when undoing, after compiling an Actor Blueprint with components.

Fixed a crash that would occur in specific cyclic dependency cases involving an Actor and Actor Component Blueprints.

Fixed a crash that would occur when hovering over the "Edit Blueprint" button, for Blueprint instances that had components added in their construction script.

Fixed a crash that would occur when loading a Blueprint that depended on a plugin that was disabled.

Fixed a crash that would occur when removing an event/function param in a Blueprint that was associated with the set GameMode.

Fixed a crash that would occur when removing a pin that had a debug watch applied to it.

Fixed a crash when deleting a map while it's level Blueprint was opened.

Fixed a crash when restarting level after streaming sublevels in.

Fixed a cyclical dependency bug involving macro libraries, where Blueprints could load with a false error.

Preventing in UK2Node::AutowireNode hidden pins from being auto-connected to passed in Wildcard pins.

This prevents issues with wildcards connecting to the "self" pin of functions when dragging off them.

Proper error is generated when incompatible Blueprint pins are connected.

Recompiling a Blueprint with a Component parent class now correctly re-registers any instances of the blueprinted component in the level. Previously existing instances could disappear.

Removed a check that was asserting when compiling a Blueprint with invalid Call Function or Call Parent Function nodes.

Renaming a component and then adding a new component of the same type in the Blueprint editor will no longer result in broken defaults editing.

Select nodes using enums with hidden values will no longer incorrectly match up the Option pin connections to the improper enum value.

Selecting a pin type for a Select node will not fail the first time.

Setting default values of Text properties in the User Defined Struct or for Local Variable properties in Blueprints will correctly assign the value and preserve the value between instances of the editor.

Splitting pins on the Function Result node will no longer attempt to compile the split pins as result pins.

The "Get" pin(s) on "Set" variable nodes will now display the name of the pin if the pin has been generated by splitting a struct pin.

The details view in Blueprints of non-member variables (either from a parent class or an external member reference) will no longer show various detail uneditable options as editable.

The eye icon appears now for marking a user created component variable as editable in the My Blueprints window.

Tooltips will display for sub-menu items in the Pin Type Selector.

Tweaked the tooltip for "Expand Nodes" menu option to better describe what the action will do.

When dragging off a pin in a function graph, local variable nodes will no longer be filtered out of the context menu for placement if they are valid for connection.

When indexing all Blueprints, hitting "No" will correctly skip checking out all un-indexed Blueprints.

When loading a blueprint pin types that don't match are no longer disconnected, instead we rely on compile errors to prevent the potentially broken blueprint from executing bad code.

When signature of a function is updated, its instances in the Event Graph are properly updated.

Core

New: A plugin with the same name but of different versions can be placed in multiple game projects. This allows studios with multiple projects to utilize the same plugin at different revisions as long as the plugin is part of the game project.

New: Added module path caching to improve editor startup times.

New: Added pre-allocated memory pool which is freed when the system runs out of memory to properly handle such crashes.

New: Added 'stat slow' console command.

Displays the game and render thread stats.

Can take two optional parameters -ms=x -depth=n that specify the minimum stat duration and the displayed hierarchy depth respectively.

Removed some redundant calls from FPaths::MakeStandardFilename to make it faster.

Rendering thread callstacks are once again correctly printed to the log for non-editor builds.

Save to default config no longer writes out duplicate entries.

Smoke test added to ensure platform consistency on opening files for append, and ability to seek said file handles.

The TAttribute no longer allows you to directly compare another TAttribute for equality.

They've been deprecated, and corrected to only allow comparison against literal values instead of comparison attributes, which was causing implicit construction of attributes when comparing against a literal.

There's a new IdenticalTo() function on TAttribute which can actually compare two attributes to see if they are really the same.

When bAutoCompleteWhenLoadingCompletes is false in the MoviePlayer, the movie correctly continues playing until prompted to stop after loading completes.

When queueing new async packages, async loading code will also look for existing packages in loaded packages to process to prevent infinite streaming times.

Editor and Tools

New: Added "Zip Up Project" button under File -> Package Project to grab necessary project files and package into a zip. For easily sending the project to other people excluding unnecessary files.

Smart Resizing for Transform Details UI:

The vector and rotator widgets now support automatically rendering in a more compact mode as the details panel shrinks, making it possible to edit properties over a wider range of widths.

Rotator UI Consistency:

Rotators now display everywhere in a consistent order as XYZ, rather than being displayed as XYZ in the level editor but as Pitch, Yaw, Roll (YZX order) in Blueprints.

In a Blueprint:

In the level editor:

All existing content is automatically updated and will work as expected, but you may notice wires crossing that didn't cross before since the order has changed.

As a refresher (this information is also displayed in the tooltips):

X is the roll value (rotation about the X axis, typically the forward vector, e.g. tilting your head sideways).

Y is the pitch value (rotation about the Y axis, typically the right vector, e.g. looking up/down).

Z is the yaw value (rotation about the Z axis, typically the up vector, e.g. turning to face left/right).

New: "Add Auto Connect To Server" option to the advanced Play In Editor options, defaulting to old value of true. If set to false it will launch multiple clients but they won't connect to each other, which is useful for UI testing.

New: Added "No to All", "Yes to All" and "Cancel" options to the "Failed to Merge Bones" dialog when importing skeletal meshes to avoid having to dismiss large a large amount of windows.

New: Added "Save All" button to Visual Logger tool.

New: Added a check to determine whether plugins are compatible when opening a content only project. This is needed because a content only project will not attempt to build incompatible plugins later, users can now choose to disable them.

New: Added a support URL to plugins so that it is easy for users to know how to contact the creators of plugins for support.

New: Added support for multi-line text in the Note actor's text field.

New: Added support for positioning and always centering standalone play windows. Fields are added under Level Editor - Play advanced settings to position the standalone play window and turn always centering on and off.

New: Added the option to display the current Unreal Engine's version number in the project badge. This feature can be enabled in the Miscellaneous category inside of the Editor Preferences.

New: All integer property types are now supported in details panels instead of only int32 properties.

New: Allows play in editor windows to always be displayed on top of other windows, enabled/disabled under Level Editor - Play advanced settings.

New: Clarified the use of Server Game Options and Command Line Options in the tooltips for the Level Editor - Play settings.

Removed the map check warning "has simple collision but is being scaled non-uniformly - collision creation will fail" as a collision shape is created regardless of the fact that an object is non-uniformly scaled.

Renamed "Tick" category in UActorComponent to "Component Tick" and Actor tick to "Actor Tick" to differentiate between the two when they are both shown in a details panel.

Textures are no longer compressed for auto-saves to reduce the time it takes to save.

The color picker no longer assumes a straight inverse gamma conversion from colors sampled on the screen using the eye dropper. This change makes it so sRGB is the assumed space all colors are sampled in, making sampling colors from Photoshop bring in the identical version of the color converted into linear space, which when transformed back into sRGB space will be the same color you saw in photoshop.

FColor and FLinearColors can now default to sRGB space using a UPROPERTY meta tag of sRGB=true (or false), you can force a specific default checking of the sRGB checkbox.

Several places in UMG now force this default since sRGB is the space UMG will be rendered in (on PC). Additional work will be needed on Mac where the final rendering space is gamma 2.2.

The editor now properly saves out array elements to the ini files.

The Far View Plane setting for level editor viewports is now saved between sessions.

The Scalability state is now saved back to the same .ini file that it was loaded from, so that launching the editor doesn't reset Scalability settings set by the game.

There is now no longer a max limit to the number of static mesh sections that can be generated when importing meshes. The previous limit was 64 sections.

Updated Material Preview Mesh properties to include Adjacency Info.

Content Browser

New: Improved the behavior of Ctrl+B in the Content Browser and Persona.

Ctrl+B in the Content Browser will now invoke the "Show in Folder View" command to allow you to easily sync to the actual location of an asset in the cases where you're viewing it via a search or a collection.

Ctrl+B in the Persona animation sequence browser will now invoke the "Find in Content Browser" command.

Ctrl+B will no longer do anything when Persona has no asset available for a given edit mode.

New: The "Move Folder Here" operation can now be aborted if there are a large number of assets within.

Auto reimporter now uses MD5 hashing to ensure that benign reimporting does not happen when only the timestamp has changed.

Can now use the "Show Developers Folder" option in the save/load dialogs.

Fixed an issue in which cancelling the attempted delete of read only files would still remove the asset from the Content Browser.

Fixed being able to rename or delete some read-only types in the Content Browser.

Fixed Content Browser drag-and-drop so that it works in all views (it only used to work in tile view).

The user is now prevent from attempting to use the World Grid Material as a landscape hole material. Overriding blend mode on the default material will cause a crash.

Undo now works correctly with "Clear Region Selection".

Material Editor

New: Added Map Check warning after loading a level in the editor that uses a material that needs one of its Usage Flags set. Unless resaved, such materials will render as the default material in cooked builds.

New: Added World<->View transforms to the TransformPosition node in the material editor.

New: The Material Editor now saves the toggle state of nodes' comment bubbles, so they are preserved when reopening the material.

Fixed a crash placing a Custom Output material node in the material editor. That node type should have been excluded from the material node list.

Fixed a material compile error generating when using a Custom material node together with a TextureObject on OpenGL platforms.

Fixed a small error which was causing some Material Functions in the library to not appear in the right click menu, despite being exposed.

Fixed issue where editing a Material Parameter Collection results in marking an unnecessarily large number of materials as dirty.

Fixed titles on math nodes to update when the pin connections change.

TextureSample material nodes now fetch the correct tooltips.

Matinee

Fix bug that could cause sounds to start not quite at the beginning during playback.

Fix matinee crash when running without audio device.

Fixed matinee sound preview playback so that it respects the loop section and correctly restarts. Improved the quality of audio playback when scrubbing.

Launching movie capture once again works when using a DebugGame binary.

Matinee can no longer be opened while there is an active Play in Editor or Simulate session as it is unsafe to change matinees during play sessions.

Switching editor modes will now warn before closing Matinee mode.

Cascade

All particle modules now reset to their distribution properties to their correct defaults instead of "None".

Fixed crash when setting the particle system Initial Velocity to defaults when configured as a Distribution Vector Uniform Curve.

Fixed a crash in reinstancing of Persona preview instances after compiling blueprints that are referenced in the Animation Blueprint event graph.

Fixed a crash when switching between edit modes with wind source actors active.

Fixed an issue in the type-in UI for blendspace sample coordinates where the Y coordinate could not be set to the same as the X coordinate.

Fixed APEX clothing files failing to import when non-ANSI characters were present in the file path.

Fixed crash in anim compression when retargeting an animation with a single key.

Fixed crash in Persona accessing stale preview instances. Now we reinitialize the animation correctly when the blueprint changes.

Fixed crash in Persona when undoing deletion or duplication of state nodes.

Fixed crash when undoing a change in custom blending graphs for state machine transitions.

Fixed deleted names in smart name managers remaining after deletion.

Fixed ordering of source and target bones in the details panel for the copy bone node to make them more intuitive.

Fixed UI refresh being triggered for any property edit event fired from any UObject. Now filtered to refresh only when notify data is changed.

PhAT

Fixed issue where changing the mesh rendering mode in PhAT would not update in the viewport until the second click.

Fixed PhAT Editor crashing due to being able to select nonexistent bones.

World Outliner

New: Changed the level name tooltip in the Levels Browser to display the full package path name.

Static Mesh Editor

New: Added the ability to push the bounds for StaticMesh objects manually.

The bounds can be altered by changing the value of the PositiveBoundsExtension and NegativeBoundsExtension properties for a StaticMesh.

New: Static mesh adjacency buffer generation is now set per-mesh. Controlled either through the mesh editor or on import.

This was previously controlled by an internal fixed triangle limit but needs to be optional to allow PN tessellation on high-poly meshes.

The flag will be auto-set for old meshes preserving existing behavior.

Source Control

New: Added make file writable button for advanced project setting pages, which allows files to be edited when non-writable and not connected to source control.

New: Once an asset is made writable (if it cannot be checked out), it will no longer continue prompting the user for check out when it is modified.

Fixed not being able to use collections with SVN or Git set as your SCC provider.

Fixed Subversion source control plugin to recognize the correct line terminator sequence depending on the platform. This was previously breaking the log output on Mac.

Subversion source control provider can now use the system default svn binary where it exists.

This addresses issues where users have repositories and checkouts that were made with different versions of SVN to the client binary we ship. We now attempt to detect a system-level svn binary, and only use the shipped binary as a fallback.

Foliage

It can directly use the Instances array passed into the new FoliageInstancedStaticMeshComponent OnInstanceTakeRadialDamage event to remove all damaged instances.

New: Added Blueprint support for Foliage instances.

The foliage component class can now be overridden in the Foliage Type.

Users can create a Blueprint subclass of FoliageInstancedStaticMeshComponent to respond to Hit or Damage events and hide or remove instances, spawn effects, spawn real Actors in place of an instance etc.

The default class is FoliageInstancedStaticMeshComponent which is a subclass of HierarchicalInstancedStaticMeshComponent but has added support for Point and Radial Damage.

Fixed various issues that were only showing up during the process of packaging a project from the editor.

Gameplay Framework

New: Actor transforms when spawning.

The process of spawning actors has changed slightly. If an actor is spawned and its template's root component has a transform (for example, a RelativeRotation), that transform, including scale, will now be respected by the spawning code.

For certain cases where you are sure you want to spawn at the exact transform given and ignore any transform on the template's root component, we have added the SpawnActorAbsolute() function.

Check out DecalActor for an example of how this works in practice.

Notes when upgrading:

If you have custom actors or blueprints with transform data on the root component that was previously ignored, you will see different results when spawning them with 4.9. In this case the best fix is likely to be simply zeroing out the transform data, since it was ignored before anyway.

If you have added code somewhere to take this transform data into account before spawning, you will likely want to remove it, or else you will end up applying the transform twice.

New: A Remove Player analogue to Create Player is now available for use in Blueprints.

New: AActor::bPendingKillPending renamed to bActorIsBeingDestroyed and made private.

Previously GroundFriction was also used as the braking friction. This new setting allows separate control from the GroundFriction that affects turning control.

Added "BrakingFrictionFactor" which controls how friction is used in ApplyVelocityBraking(). (Note: this is 2 by default for historical reasons, but a value of 1 more closely matches the actual drag equation).

Different values are easily used in different movement modes by hooking in to OnMovementModeChanged and modifying BrakingFriction.

New: Added AbilityEndedCallbacks delegate to AbilitySystemComponent that broadcasts when an ability ends.

New: Added an automated test that will attempt to all variations of a new project. (IE C++ and blueprint and target platform for both mobile and desktop).

New: Added an automated test will parse and validate all available feature packs.

New: Added debug command ("p.VisualizeMovement") for showing in-world debug drawing of CharacterMovementComponent state including current velocity and acceleration.

virtual UCharacterMovementComponent::VisualizeMovement() can be overridden in child classes to add project-specific debug drawing.

New: Added GetServerWorldTimeSeconds() to return the simulated time in seconds of the server. This is safe to call on either the server or the client.

New: Added MaxRange and a Tag (FName) to noise parameters for AI hearing.

MaxRange is only used if > 0. It is modified (multiplied) by the loudness. Sensors must still pass their own range checks as well.

New: Added new Math functions to KismetMathLibrary:

RandomUnitVectorInConeWithYawAndPitch, creates an uniformly distributed random Vector within a cone defined by the given Yaw and Pitch values.

CreateVectorFromYawPitch, creates a Vector from the given Yaw and Pitch rotation values.

GetYawPitchFromVector, retrieves the Yaw and Pitch rotation values in degrees from the given vector.

New: Added optional interpolation curve to the MoveToLocation AbilityTask to support per-axis interpolation.

This was used to implement the feature packs used for the shared resources now used in templates.

New: Smooth rotation for network corrections of simulated proxies in character movement.

New: Spawn Actor now accepts Scale properly.

Because of this, we added SpawnActor to accept FTransform as an input.

New: The class of the default physics volume can now be set via the World Settings properites.

New: When unloading a streaming level all objects are now marked pending kill to avoid any stray references to the objects that could prevent the level from being garbage collected.

New: You can now bind the Any key. This will respond to any key press/release event and follows the same rules for consumption that other keys follow.

"Always-loaded" sub-levels will now be fully loaded before gameplay begins when using seamless travel.

A graceful message for failure to load the default map is now shown followed by closing the application when travelling instead of crashing.

AActor::bPendingKillPending renamed to bActorIsBeingDestroyed and made private.

BeginPlay will no longer be called on a component that has seamlessly travelled from another level.

Broadcast PhysicsVolumeChangedDelegate even if the previous physics volume was null.

Bugfix to timers that are paused immediately after being set.

Calling TryActiveAbility will now call CanActivateAbility on the Primary Instance of the Ability Spec, if it exists. (If not we continue to do the previous implementation which will call CanActivateAbility on the CDO.)

Change FQuat tolerance within SceneComponent and PrimitiveComponent to allow smaller rotation changes to get through.

Changed KismetMathLibrary functions PointsAreCoplanar, LinePlaneIntersection, and LinePlaneIntersection_OriginNormal to be BlueprintPure.

Component attachment is now replicated correctly to clients.

Console command ServerTravel can now pass parameters to the map.

Fixed characters not rotating with a base object that is moving at a very low rotation rate in games with a high frame rate. Quat comparison tolerance was too strict.

Fixed Editor crashing due to SetMaterial getting called on a DestructibleComponent during the construction script.

Fixed crash exiting Play in Editor if you had travelled to or restarted the level being edited during the PIE session.

Fixed crash when the component specified as the player's audio listener component has been destroyed.

Fixed Sound Mix failing to be pushed if it had been popped in the same frame.

Fixed using the PIE prefixed map name when trying to seamless travel in multiplayer PIE.

Fixed a crash which occurred on PIE exit after enabling Show Collision in game.

Fixed an issue with feature packs registering for super search which could result in multiple registrations which then caused an assert.

Fixed camera jumping when trying to interpolate back to original view target. (Contributed by ArCorvus, pull request 1215.)

Interpolate simulated position faster when network character proxy is coming to a stop. Reduces visual overshoot past end location.

Keys bound via key or action events will now count as having consumed the event even if there wasn't a pressed or released event this frame preventing axes using that key in lower priority input components from being active on other frame.

SceneComponent AttachChildren array is now replicated so that it is consistent with AttachParents.

SetCullDistance on UPrimitiveComponent now accepts 0 as a legal distance. A distance of 0 means the primitive is not culled at any distance.

The data for automated line test was incorrect causing false failures.

Timeline components will no longer execute their tick function when not active.

We no longer ignore hit testing in APlayerController::GetHitResultAtScreenPosition if the mouse isn't directly over the viewport. That function can be used regardless of the state of the mouse, so that logic has been moved elsewhere.

When transitioning levels EndPlay will no longer attempt to be executed for an Actor that was destroyed by another Actor's EndPlay call.

You can now set the GameMode HUD class to be none.

Learning Resources

Documentation

Improved docs for Add Yaw Input and Add Controller Yaw Input etc., to point to the scaling values that are applied.

Improved docs on Movement Component and Floating Pawn Movement to indicate that collision is wholly dependent on the Updated Component (normally the root component).

Sample Content

Fixed UI icons not being present in sample content.

Localization

New: Added game native culture setting to control which culture's localization data the editor loads for game assets. Game assets now display the specified culture's localization data when in the editor.

New: Added initial support for working directly with Localization Services in the editor. Allows you to upload and download translations to online services for localization. Allows plugins for specific localization service providers (OneSky, etc). Also created first localization service plugin for OneSky.

New: Added the source location information of a localization archive entry as an "extracted comment" in PO files when exporting.

New: Culture names now consistently use hyphens rather than underscores. Culture names with underscores are still accepted.

New: First pass of the OneSky plugin: Extend Localization Dashboard toolbar with OneSky buttons for "Import all cultures/targets from OneSky" and "Export all cultures/targets to OneSky".

New: Fixed live culture swapping when in certain configurations such as shipping. Enabled use of "-culture=" switch on command-line in all configurations.

New: Foreign archives now generate entries for the native translation of the native source as though it were the native source - the result is that the native translation will also be translated in the foreign culture. Localization resources now use the native translation of the native source as though it were the native source, specifically when looking up the foreign translation to use from archives - the result is that the native source will use the foreign translation of its native translation.

Retrieving localized metadata will prefer local changes to the metadata if they do not match what is expected by localization.

The Category Names of Components in blueprints are no longer gathered for localization when the "ShouldGatherEditorOnlyData" setting is false.

Updated logic in commandlet for gathering text from assets which was falsely reporting that nothing was gathered because no files were loaded. Now properly reports whether there were any packages found to be processed, rather than if any need to be loaded and processed in a deferred manner.

Marketplace Content

Infiltrator Demo - Various maps have been cleaned up to remove NULL referenced scene assets.

Networking

New: A warning will now be printed to the output log if an actor tries to send a non-multicast remote function but has no owning connection.

New: Added a check to see if the character is pending kill before calling TickCharacterPose() as the character can be marked for destroy after PerformMovement.

New: Added a file NetConstants.h which holds MAX_PACKET_SIZE which can be changed to update the MTU. Changed the MTU from 512 to 1000.

New: Added a macro CLOSE_CONNECTION_DUE_TO_SECURITY_VIOLATION to AssertionMacros.h which closes a connection, logs it, and provides a debug string to the client.

New: Added a scale component to PackageMapClient and now use a 1 bit check whether Location, Rotation, Scale, and Velocity have been serialized.

New: Added ability to save json in condensed format.

New: Added ability to search for replays by meta tag.

New: Added ability to track which users were in replays.

New: Added ability to view recently viewed replays.

New: Added LogRep and LogRepTraffic to EngineLogs.h and changed over some UE_LOG calls to use the new logs.

New: Added NMT_SecurityViolation where servers pass a debug string to clients to inform them of a disconnect.

New: Added support for the engine to notify the replay streaming service when players join in progress.

New: Added the ability to find replays that you participated in.

New: Added the Packet Handler Framework which allows for transformation of packets, including Encryption, Compression, Reliability.

New: Added Third Party Library CryptoPP to the Third Party Source directory.

New: Encryption Handler components that use the CryptoPP library and Packet Handler system to encrypt packets.

New: Reduced bandwidth usage by up to 15% or more by compressing replicated location, velocity, and rotation values more aggressively.

The amount of bandwidth savings you see in your project will vary depending on how much of it consisted of actor movement replication.

This does reduce the precision of these values slightly, but it should not cause noticeable artifacts in most cases. The level of compression is now configurable in the "Replication" section of the Class Defaults, in case higher precision is needed.

Using "Round Two Decimals" for the location and velocity, and "Short Components" for rotation will be equivalent to the precision that was used in 4.8.

New: UNetConnection has a new GetWorld function. It will try to get the world from the owning net driver and failing that the owning actor.

Added #IF_WITH_EDITOR code guard to remove code that derives GetNetMode if in PIE.

Fixed an issue where the engine was generating corrupted network profiler files if the URL of the loaded map contained more than about 255 characters.

Fixed potential crash if a demo net driver is left idling for too long.

Fixed the reported size of replicated functions in network profiles. Some bits that were incorrectly reported as being in the parameter section are now correctly reported as being in the header section.

Live replay timeouts when first connecting are handled correctly.

Multiple running instances of the same project can now record network profiles simultaneously.

Replay streamer now generates error messaging and stops demo recording when it fails.

Special cased PIE dedicated server or client without server in World.cpp.

The demo net driver for replays is destroyed when a seamless travel copies the world data to ensure it always gets destroyed.

We no longer spawn particle system components on dedicated servers, reducing both memory and performance overhead.

When viewing replays, character smoothing between updates should be much smoother.

When scrubbing replays, camera will continue to follow the original view target.

Online

New in BuildPatchServices:

Improved logic for detecting existing installations when running an installer.

Added support for SHA1 verification of chunk match so that generation does not need to load existing chunks.

Exposing list of files in the build via the manifest interface.

Patch generation now makes use of available CPU cores to improve processing speed.

Fixed a variety of issues with BuildPatchServices:

Detecting previous move when resuming a patch.

Resuming an installation on some platforms where the file API would not allow seeking on the file handle.

Verification stage not being capable of cancelling.

Incorrect error string generation.

Potential cloud enumeration deadlock for patch generation.

Optimising installer attribute setting logic, as well as improving reported progress information for this stage.

Removed uses of helper function FPaths::FileExists which is not robust on all platforms.

Fixed XMPP MUC room members populated correctly.

Fixed player's presence status on Steam so that it now shows their actual status instead of the string needed to connect to their game.

Fixed a rare issue where attempting to save out Steam achievements multiple times in the same frame could prevent further Steam tasks from executing.

Other

New: Added a generic motion controller key abstraction

This allows multiple physical devices (e.g. left and and right hand controllers) to be routed to a single player in the engine.

New: Added a render array to texture maxscript which can be used to bake textures out of unreal's blueprints given a certain data format.

New: Added entitlement checking for Gear VR, which lets developers verify that their app has been purchased through the Oculus store.

New: Added functions to get and set the World to Meters scale from Blueprints.

New: Added in Motion Controller Component, which you can add to any actor, and will set its location and orientation to that of the player's motion controller.

New: Created a Flurry analytics plugin for iOS.

New: Improvements to the console:

Console commands are now searchable. To search, begin with a "?" followed by your search terms separated by spaces. For example, to search for commands that contain both foo and bar you would type "? foo bar".

The autocomplete feature has been updated so it will continue to display an exact match while you enter parameters to the command.

Fixed: Rendering corruption when using a fully rough material on some Android devices (eg: Nexus7, Nexus4).

Fixed compiling problems with non-unity builds for Android.

Improved Android ARMv7 debug flags.

Invalidates cached resolution when application returns from background to handle receiving new window.

Keep the last export of each Android NDK/SDK path from .bash_profile instead of of the first one if not set in ini (Mac).

Make sure the UE4Game and UE4Game/[GameName] directories are created so save games and logs work properly.

Only use -fno-function-sections on Clang 3.6 or later on Android to correct issue with backward compatibility to older toolchains.

OpenWrite does not use O_APPEND but preserves seek to end of file behavior if append requested on Android.

Pass correct event for onDestroy so application terminating delegate called, but do NOT depend on this; there is no guarantee onDestroy will be called by the system. Any state you want to save should instead be handled by ApplicationWillEnterBackgroundDelegate.

Fix a crash when launching an external process on Mac OS X caused by over-releasing the path to the executable.

Fix reflections on translucent surfaces for OpenGL by moving the ReverseBits32 function from MonteCarlo.usf to Common.usf and using it on platforms that don't natively support the reverse bits intrinsic.

Fix transition from WindowedFullscreen to regular FullScreen and back again on Mac OS X.

Fixed a problem with windows not rendering on OS X 10.11 beta.

Fixed emitting the callstack of the crashed thread to the log on Mac OS X.

Fixed a crash on auto-importing movies.

Fixed issues with playing multiple movies in a row.

Fixed Rename option in various context-menus on Mac OS X by ensuring that the correct window deactivation message is sent when closing the active window.

Fixed setting of the current working dir on Mac for paths that contain non-ANSI characters.

Fixed splash screen rendering on OS X 10.11 beta.

Fixed tooltips rendering on OS X 10.11 beta.

Fixed window activation in a case where mouse-down event changes focus to a new widget.

Made the Xcode source accessor more robust on OS X by ensuring that the Xcode project required exists and allowing the user to switch to a different application while waiting for Xcode.

Playstation 4

New: Added RE_Z feature to shader definitions.

New: Added saving of Crash Context during coredump.

New: Added support for conservative depth optimization to PS4.

New: Added support for the FirstInstance draw optimization. Reduces the number of RHI commands generated for instanced drawing.

New: Added support for the new Wave shader compiler. Enabled by default. Controlled by console variable r.PS4UseWaveShaderCompiler.

New: Added support for the shader complexity view mode to PS4.

New: Added the option to strip PS4 shaders of optional debug data. Enabled by default. Saves approximately 75% of the memory cost of shaders. CVAR is r.PS4StripExtraShaderBinaryData and is enabled by default.

Windows

Changing OS Version for minimum supported OS on windows, no longer requires an editor restart.

All Mobile

New: Changed how non-power-of-two textures work on platforms that don't support them. Instead of silently failing, it will replace contents with an "error texture" so you can see on device what to do, instead of seeing nothing.

New: Games now have more control over the login process in Game Center on iOS and Google Play on Android.

The login UI no longer appears automatically during engine startup if the iOS or Google Play online subsystems are enabled. This was causing various timing issues, and games had no way to control when it appeared.

Games must now explicitly invoke the system's login UI by calling either "IOnlineExternalUI::ShowLoginUI" from C++ or "Show External Login UI" from Blueprints. These are asynchronous operations that allow the game to defer any other online operations, such as achievement or leaderboard queries, until after a user has successfully logged in.

Added a new Blueprint node "Is Logged In" to get the login status of a user.

Implemented the C++ function IOnlineIdentity::Logout and added a new Blueprint node "Logout" for the Google Play online subsystem.

This feature, along with the external login UI support, should allow games to implement a login/logout button.

Note that this functionality is not supported on iOS as Game Center itself does not support explicit logout from within a game.

Remove redundant checks for Pixel-Buffer-Object support from the OpenGL RHIUpdateTexture2D & RHIUpdateTexture3D functions to allow them to be called on mobile. (Contributed by deM-on, pull request 1086.)

Rendering

New: Added a material function that can convert RGB colors to HSV.

New: Added ability to create a texture UAV to a specific mip and create UAVs for additional texture types.

FX

Fix for bug in SkelVert/Surf location cascade module in which skeletal mesh vertices would not be accessed correctly for some meshes.

Fix for rare crash in SkelVert/Surf Location Cascade module.

Fixed a bug that caused exporting emitters to a particle system with a higher number of LODs in the first emitter to crash the editor if the emitter to export was set to solo mode.

Fixed a problem with unclamped alpha during building of lookup tables for distribution values, that could cause unpredictable behavior.

Mesh particle collisions now consider the particle size by default. This should produce more accurate collisions for mesh particles with regular shapes. This can be disabled via the MeshTypeData property bCollisionsConsiderParticleSize.

Removed "Particle" options from Beam Source and Target options as these features are not implemented in UE4.

Materials

New: A few material functions have been added for generating and combining Shapes. These are mostly useful for the "Volumetric Decal" material type, but they may be useful in other situations as well.

Shapes: Sphere, Box, Capsule.

Combiners: Intersection, Subtraction, Union.

New: A few new material functions have been added for creating Shapes in the material editor.

DrawLine-2D and Drawline-3D: Specify a line in either 2D or 3D space. Has the option to behave as either capsules or transformed boxes.

BoxMask-2D and BoxMask-3D: Allow you to create 2D or 3D gradients similar to the "SphereMask" node but in the shape of a box.

New: A material function for generating a BullCurve has been added.

This is a simple bell curve aka "Normal Distribution" that has been re-scaled so that that inputs of -1 and 1 on X return 0. No control params. Uses the simplest form of the distribution: f(x) = e^(-0.5*x^2)

New: Added a Blueprint macro to convert Blueprint arrays into HLSL code that can be copied.

To use, you simply need to specify what type of input array you want (float through float4), a variable name and then pipe the results to an editable String variable. Then you use the editable text field to copy the result into the place where it is needed (for example inside of a Custom node in a material).

Note: In general using large arrays in HLSL will be slow. Often this is something more useful when you are trying to do something 'offline rendering-ish' inside of UE4, such as pre-computing a bunch of random ray directions for some kind of raytracing experiment.

New: Many of our VFX materials require HDR (high dynamic range) pixel values (Values above 1) in order to properly generate bloom and other engine effects, however multiplying an LDR (low dynamic range) texture into a high range often looks awful. This material function takes an LDR texture as an input, and remaps it to an HDR range defined by the user, This maintains the look and preserves the chroma of the input image and remaps it into HDR.

New: New material function 'CalcLightSourceAngle' can be useful to figure out the light source angle of a light as seen from any position in the world.

New: New material function 'Sphere_AO' returns an ambient occlusion value for any point in the world based on a sphere occluder of a given position and radius. Useful for blob shadows that fade in and out realistically.

New: New material functions for Sampling the Shadowing of a sphere based on lookup textures.

Sphere-ConeShadow-Texture: Returns the shadow response from a sphere in the world given a position and radius.

Ellipsoid-ConeShadow-Texture: Same as the above Sphere shadow but stretched along a specified axis. NOTE: This version is currently experimental and has a few issues. These issues will be fixed in the next release.

Both functions use the following default lookup texture: Texture2D'/Engine/EngineMaterials/T_SphereShadow_RGBA_5-15-30-60deg.T_SphereShadow_RGBA_5-15-30-60deg'

The texture is channel packed such that each of the channels has a different light source angle encoded. R=5, G=15, B=30, A=60 degrees.

New: Scalar material parameters can specify the slider min and max for the material instance editor.

New: Spherical-Cap-Intersection. This material function calculates the area of a spherical cap intersection given a light source angle and angle of visibility. Has option to use cheaper 'SmoothStep' calculation. In general this function is useful for pre-baking lookup textures but it can also be used in realtime when using the SmoothStep approximation.

Custom UV pins on Make/Break material attributes nodes now hide and show under the same conditions as their counterparts on the material result node.

Fixed rare crash in material editor when using custom UVs.

Fixed a crash that occurred when overriding a distortion material to be opaque in a material instance.

Fixed crash sometimes caused when reparenting a material instance.

Fixed issue in which all materials referencing a texture that is re-imported would turn black.

Fixed issue in which the tangent space normal property of materials would not function correctly when using material attributes.

Fixed issue where some parameters would not appear in material instances.

Fixed many transform nodes being broken in decal materials

Fixed materials that use Pixel Depth Offset not using the pixel shader during the prepass causing depths not to match up during the base pass.

Fixed wireframe materials to be considered "not writing every pixel". This fixes a few rare interactions causing corruption in shadow casting.

Modified the camera offset material function node to reference vertex world position instead of actor position to remove z-depth scaling.

New: Indirect lighting cache point samples don't use the texture layout anymore, since they don't use the volume texture anyway.

New: r.ReflectionEnvironment is now usable in shipping builds.

New: Reflection environment console variables are now another scalability option.

Fixed the initialization of the texture streaming system so that it's initialized early enough to stream in textures at startup. Before this change, it would kick in a little bit later which could temporarily overload texture memory at startup.

Updated distortion pass to use a stencil mask which improves performance with lower screen coverage.

Mobile Rendering

New: Enabled limited post process support for devices that do not support full HDR rendering, meaning those which lack float16 render target support (e.g. Galaxy S6).

This replaces "mosaic" rendering when the color_buffer_half_float extension is not available but a framebuffer fetch gl extension is.

Bloom is supported.

Unlike "mosaic" mode, there are no resolution limitations.

New: Modulated shadow rendering for forward rendering (mobile path).

To use enable 'Cast modulated shadow' on a stationary directional light.

Dynamic shadows will then be rendered by modulating the light's 'Modulated Shadow Color' against the scene color.

Fixed stencil buffer rendering when using the Metal RHI.

UI

New: In game objects Mouse Enter and Leave Events no longer fire if UI (Slate/UMG) is over it.

New: Materials designed for UI now have a new material domain that can be set in the material editor. This replaces the "Used with UI" checkbox on materials. All existing materials using this checkbox will be automatically updated.

Slate

New: Editable text widgets in Slate now allow the context menu to be override or disabled.

New: Empty lines in a multi-line editable text now draw a little highlight so that you can tell that the line itself is selected.

New: Several improvements to the way sRGB is treated in the engine. Trying to standardize on the sRGB standard instead of pow(2.2). The key take away is - your textures should look like they do in Photoshop when rendered by Slate.

Now using a more accurate Gamma -> Linear space conversion function for converting FColor to FLinearColor.

Changing the way all FColors are converted into FLinearColor by default. Previously, we used pow(color, 1/DisplayGamma) for gamma correct. We now use the IEC 61966-2-1 standard.

Fixed a problem with Slate quantizing the lower range of black colors.

In Slate, you should now see an image matching Photoshop instead of being slightly darker in the lower ranges. However, because we don't want to invalidate all existing textures that users have authored, all existing UTextures have a UseLegacyGamma flag set to true, all new textures will be set to false.

New: Simplified Raw Texture Update function by using FSlateTextureData to pass the texture data and size to the render thread.

Activating a window now sets input focus for all users.

Clicking on the bottom/right most pixel of a slate widget now registers the click.

Fixed "Delete" on an empty line in a multi-line editable text being handled like a "Backspace".

Fixed an intermittent crash when using Ctrl+Arrow to move the cursor in an editable text control.

Fixed problem with menus not closing when clicking in another window on Mac.

Fixing a few issues with memory leaking in the Slate RHI resource manager. There was never a pass to remove stale entries in the dynamic resource map, so now we occasionally purge it of stale entries.

Fixing several issues involving multi-touch. Data stored involving widgets under cursor are now bucketed based on user and cursor index so that multiple pointer devices, as well as index can independently hold separate widget under cursor data.

Improved functionality for getting first chance access to key down events in SEditableText, SEditableTextBox, SMultiLineEditableText, and SMultiLineEditableTextBox.

Menus created from menu anchors no longer auto-dismiss when a parent (in the menu stack) receives focus.

Multiple causes to the often seen early clipping in Slate have been fixed. You might have sometimes noticed a column or two of pixels on the bottom or right of a widget getting cut off, those issues are now fixed.

Fixing the incorrect calculation of the clip rectangle which resulted due to pixel snapping along the extents of the box, instead of pixel snapping the corners of the clip box.

Disabling the float16 precision version of the slate shader on all platforms. Since the clip values are all in window space, it's terribly easy on modern monitors to exceed single digit precision (2048), causing multiple columns worth of additional pixel clipping erroneously.

Optimized the Slate Draw element batcher to perform fewer memory allocations per frame and pass off some processing to the render thread earlier to avoid additional memory copies.

Platforms using a virtual keyboard no longer attempt to show it when focus is received by a read-only text box.

Slate windows now take into account required border/tiitle bar sizes when resizing the window. This ensures that the client area stays at the requested size.

Text margins are now consistently calculated at all zoom levels and no longer do an immediate calculation, they instead just invalidate layout like all other operations do.

Additionally there is now a step in the UpdateLayout pass after justification and flow have been calculated, not doing it last leads to a lot of bugs and inconsistency.

This fixes the issue with zoom negatively affecting margins as well as the double application of margins to the justification of text, additional offsets were being calculated into the offset location of the text.

The SButton no longer attempts to handle MouseUp, if the button wasn't pressed. Previously pressing outside the button, and then releasing the mouse inside the button would cause the button to attempt to handle it, even though the down never originated on the button.

The STableViewBase now properly handles touch events when under editor conditions and sets up the callback to handle the inertial scrolling.

UE-18600 - Custom Draw elements no longer are attempted to be early clipped using the known scissor rect before going through the element batcher, since their clip rect info isn't valid we just ignore doing this step for those elements.

When we update the RHI data, we now also update what the slate render proxy thinks is the actual size of the texture, which might change due to a reimport.

UMG

New: Add features to allow for better in-timeline editing of animations.

Add buttons for navigating to previous and next keys, and for adding a key at the current time to the animation outliner.

New: Added some new methods to help convert positions inside a widget to pixel positions in the viewport. LocalToViewport & AbsoluteToViewport, they take the geometry data for a widget and a given location, and can give you both the Pixel and Viewport (Slate Unit) Position.

New: Added support for dragging multiple widgets to reparent them in the UMG Hierarchy view.

New: Adding a few extra scaling modes to the scale box, allowing it to Scale to Fit X, and Scale to Fix Y.

New: Adding the blueprint function CancelDragDrop, to allow you to programmatically cancel any drag/drop operation.

New: Adding the Highly New & Experimental SInvalidationPanel in Slate and the corresponding Invalidation Box in UMG.

Allows widget geometry to be cached to speed up Slate rendering. Widgets that are cached by an Invalidation Box are not Prepassed, Ticked or Painted. It's up to the user to call Invalidate (C++) or InvalidateLayoutAndVolatility (BP) on a child widget to force invalidation. Some core widgets do this automatically when certain properties are changed, more will do it over time.

You can force an invalidation directly on the panel too, by calling InvalidateCache, usually this is not required, but can be in certain situations - such as before child widgets have a chance to learn about their parent invalidation panel next tick.

Hit testing has not been tested heavily. You'll find more success caching widgets that are not hit testable, like in a HUD.

You may notice odd draw ordering issues in this version in heavy nesting of invalidation panels.

Currently caching only on the CPU. Additional improvements coming in the future to include caching on the GPU to make the panel even faster.

Any widget can be set to be Volatile. Volatile widgets act like normal Slate widgets pre-invalidation. They're redrawn every frame, including all their children. When combined with the invalidation panel, it allows you to only need to care about redrawing only the most dynamic bits of the UI, as invalidating a whole panel could be far more costly.

You can debug your invalidation panels using the widget reflector, with the [Invalidation Debugging] toggle.

New: The WidgetComponent has been reworked to use the new IGameLayer system to create a single shared canvas layer that all the components add themselves to when they're displaying their information in screen space, instead of world space. They now properly sort based on depth/distance from the camera.

Additionally, the layer widget now updates the positions for the widgets. Thereby solving the problem of tick groups causing weird update orders for objects touching the WidgetComponent's Actor as a base. The WidgetComponent now has a normal tick group.

New: Tooltips when moving widgets in the UMG Hierarchy view now match the style of those in the World Outliner.

New: Widget Components in World Space, now support for 3 blend modes, Opaque, Transparent, Masked (new). Masked allows you to have the transparency you need on edges, but writes to the depth buffer, so that it sorts correctly. There is also now an option for ticking when the in world widget is off-screen to continue to allow animations to play and tick to be called on the widget.

New: Widget Components now have a parabolic distortion option to give them a sort of curved glass appearance, this only works if they're rendered in World Space.

New: You can now use the arrow keys in the designer to nudge widgets in the canvas by the grid snap amount. If grid snap is enabled it will actually keep it snapped to the grid, otherwise it will just move by the current snap amount absolutely.

A WidgetComponent with Space set to World, will no longer crash if the draw size is set to 0.

AddChildVerticalBox renamed to AddChildToVerticalBox.

Drag/Drop now properly maps the cursor to a user widget and no longer shows the native cursor in addition to the custom cursor if any.

Also fixed a crash on mobile where the platform doesn't have a cursor object but we still attempted to interact with it on drag/drop operations.

DrawLines, DrawFormattedText added to the set of low level painting methods for UMG.

Fixing a bug in SObjectWidget that was preventing handled key presses from being returned as handled to the rest of slate.

Fixing a bug that was showing the category field in the details panel when nothing is selected.

Fixing a bug where the modifier keys and additional base class data were never passed to new copies for mouse pointer events. Preventing users from checking modifier key state in mouse events on UserWidgets. Only affected UMG and not Slate, as the VM makes copies of the struct.

Fixing animation and tick rates for widgets living in the world, they should now correctly be controlled by time dilation as they no longer are getting ticked twice, and the second tick using the wrong delta time. This broke when we introduced tick folding, which ticks again inside of paint, but continued to use the global slate delta time, as well as tick before hand.

Fixing several issues with brush and material utility functions not working correctly with the pins for input being displayed in the blueprint as output pins.

Fonts and other appearance properties on editable text widgets are now updated in real-time in the UMG editor.

If the owner player changes on a widget component, we now remove the widget from the screen if it's currently already on a user's screen to move it to the other users screen.

Keep animation outliner selection consistent across undos.

Making some improvements to the way the SScaleBox handles fill justification so that it actually fills the entire contents of the scalebox, and handles additional scale being applied to it.

Moving widgets in the UMG Designer no longer makes them move to the last slot in their parent.

Removing Thickness from the line painting function. It wasn't actually hooked up to anything, and there's no support in slate for it currently, only when rendering splines. Will add back once we've added support for it in Slate.

Rounding the projected location when calculating screen position from world position before applying inverse DPI scale, this produces a much more stable location with no half-pixel offsets due to later applied scale, since we do it before the inverse we more or less end up at the whole number we expect. This makes things like widgets above characters heads much more stable.

SConstraintCanvas no longer attempts to draw elements outside its view, and now draws them in the correct order.

Making a lot fewer calls to the enabled delegate when painting, prefiltering arranging children that are not visible and avoiding the math for them.

Now consistently drawing children in the correct order. Previously we only sorted based on ZOrder, and assumed a stable sort for equal elements, but this was not the case. So occasionally the order just appeared wrong, unless you manually set the ZOrder, that's no longer required.

The cursor property on widgets now works as it should. You can also call SetCursor and ResetCursor to set it at runtime on any UWidget, or clear your overridden cursor.

The Multiline Editable Text widgets should now properly notify when text is committed or changed.

The slatebrush's ResourceObject property is no longer directly accessible in a blueprint. You'll need to use the functions, GetBrushResource, SetBrushResourceToTexture, and SetBrushResourceToMaterial to change the value. This is to prevent the wrong types from being associated with the resource object.

The STooltipPresenter now calculates a post transformed, rounded layout position to ensure that tooltips do not start on a half pixel. This reduces a lot of the inner jittering of a tooltip as you move your mouse across the surface of a widget.

The Widget compiler now warns if you have events that return EventReplys that are unconnected to anything.

UE-17226 - The assignment operator for the FPaintContext wasn't copying the MaxLayerId, painting into layers and not telling slate they exist causes the graphics corruptions seen by several people.

UE-18029 - Making the SlotAs functions more robust against crashing when called at the wrong time from blueprints.

Updating the 3D rendering path in Slate the properly set the RT and clear at the same time it to fix a bug on iOS when using a transparent Widget Component.

Widgets removed by replacing them in the UMG editor hierarchy are moved to the transient package to stop name clashes.

Working on several general fixes to the navigation system.

Widgets other than the focused widget can respond to navigation requests with explicit or delegate based handling. Adding a new function to allow querying the if descendants of a widget are focused by a specific user.

Implementing controller support for the SScrollBox; it has custom logic for handling navigation inside of it scrolling the next element into view for the focuser and moving focus to the next logical child.

Programming Release Notes

AI

New: Added InvalidOrientation constant to AISystem.

New: AIController class now derives from IGenericTeamAgentInterface which will make team-handling easier in the near future

New: FAIResourceLocks now have the ability to count the number of locks for each LockPriority. (Default behavior remains the same, this functionality is an additional feature.)

FEnvQueryInstance::ItemIterator's "operator bool()" is now explicit. That prevents accidental (implicit) conversion to an int32 when you intend to get the index.

Fixed pawn action sequence not responding correctly to abort event.

Replaced EQS skip item mechanic with forcing item status.

Behavior Tree

Added support for behavior tree's action task losing its PawnAction due to some external events.

Fixed multiple default subobjects with the same names created for behavior tree's blackboard filters.

Unified behavior tree's StopTree & StopLogic functions.

Navigation

New: Added pruning for crowd agent's corridor when close enough to next intermediate point (corner vertex). Depends on angle between first 2 segments of path, should reduce twitching when large group is moving through narrow corridor.

Changed FNavMeshPath::DoesIntersectBox to ignore agent location, as it's not relevant to function's result.

Fixed Navmesh generation failing after hot-reloading

Fixed early out condition in navigation tile generator using async data gathering.

Fixed invalid pointer to owner of crowd agent's custom filter.

Fixed rare case of infinite loop in navmesh pathfinding.

Navigation system will store weak object pointers to all custom navlinks to ensure their validity.

Animation

New: Added DLL export to some skeletal control classes and methods, making them extensible in another module.

New: Allowed skeletal controls to specify the coordinate space that they would prefer the gizmo to be displayed in by implementing GetWidgetCoordinateSystem

Replaced BlendRotationOffset with AccumulateMeshSpaceRotationAdditiveToLocalPose. No pose copy, removed one pose allocation, fast path for weight == 1, and mesh space transform done only on rotation part and not full FTransform.

Added ConvertMeshRotationPoseToLocalSpace.

Blueprints

New: BlueprintCallable functions can now specify the metadata HideSelfPin to indicate that the node should not show the Target pin, nor should it be connectable, thus filtering it from the context menu when dragging off a pin and ensuring it can only be used in the self context.

New: External modules can now append toolbar buttons to the Blueprint editor, using the BlueprintEditorModule's MenuExtensibilityManager.

New: External modules can now extend the Blueprint context menu by adding their own filtering through FBlueprintGraphModule::GetExtendedActionMenuFilters().

New: Graph Editor: Allowed graph nodes a chance to create a custom SGraphNode visual representation without having to manually register a factory (override the new method CreateVisualWidget).

Fixed a bug that caused instanced properties to be cleared on Blueprint compile.

Fixed a bug where functions with inaccurate WorldContext metadata were not accessible.

Fixed a bug where globally declared delegates could be mismatched with Blueprint nodes originally using a like named delegate, belonging to a specific class.

Fixed runtime blueprint use of atmospheric component.

Core

New: Add ForEachObjectWithOuter and ForEachObjectOfClass utility functions that will call a TFunctionRef for each object instead of using GetObjectsWithOuter/OfClass which requires copying each object in to a (potentially very large) array.

New: Added a console command, "abtest" to asses the impact of changing a console variable on performance in a dynamic, noisy gameplay session.

New: Added a console variable to control TimeBetweenPurgingPendingKillObjects at runtime.

New: Added basic support for flushing async loading of a specific package only.

New: Added command line param to dump commandlet stats to log file.

-LoadTimeStatsForCommandlet dumps all load time stats (LinkerLoad and AsyncLoad groups).

New: UnrealBuildTool Makefiles are now also enabled on the Mac to speed up UnrealBuildTool startup times on this platform.

Fixed Makefile serialization when using Mono.

Fixed inaccurate calculation of non-frame stats on pooled threads.

Added UEngine::bForceDisableFrameRateSmoothing to enable external systems to force smoothing off without overwriting the desired base engine setting. Various HMD modules now use this to disable smoothing during stereo rendering. Fixes issue where framerate smoothing was disabled whenever a HMD was detected.

Added code to fixup command line if project path is incorrect.

Added code to make sure all objects that are being streamed in are referenced for Garbage Collector until loading has finished.

Added IsValidIndex to FString and had the [] operators use this to verify the index they were given was valid.

Added missing implementation for FLinkerLoad::FlushCache.

Changed UnrealBuildTool to generate UnrealHeaderTool's manifest using the same modules' order during hot-reload as during normal build.

Corrected config section used to save config values for PerObjectConfig objects that are contained in the transient package.

This brings the code in line with what is used in UObject::LoadConfig.

Directory watcher no longer reports reads when the watch is being shutdown

Made sure UAT builds content-only projects as well to avoid issues with missing/outdated UE4Game binaries.

Made the message about failure to route PostInitProperties more clear.

Made UnrealHeaderTool throw an error when it encounters bad UENUM() specifiers.

More accurate InvSqrt() and InvSqrtEst() on some platforms.

Matches results for SSE platforms with other platforms that perform 2 Newton-Raphson iterations on the hardware estimate (iOS), or non-SSE that uses the fully accurate sqrt.

Scalar functions now match the vectorized versions (VectorReciprocalSqrtAccurate) so that comparisons within 1e-8f are possible for normalizing normalized values (important for FQuat which uses both scalar and vector).

Allows normalize vector (1,0,0) to return the same vector rather than (0.9999998xx, 0, 0).

Removed "VectorBitwiseAND" defined only for UnrealMathSSE. There is already "VectorBitwiseAnd" defined for all platforms.

Removed deprecated delegate and timer functions.

Removed USE_MATRIX_ROTATOR from FQuat. It's not maintained and makes the code less readable.

Stats from other threads like task graph or pool thread should now be synced with the game thread.

UnrealHeaderTool will now be able to parse TSubclassOf& parameters without reporting errors.

Editor and Tools

New: You can now help the blueprint utility functions create the correct blueprint for you. Previously, all classes created a standard blueprint. Now, the compiler module is asked Engine/Content/Types/Textures/SupportAndSettings/index.html if there is any registered IBlueprintCompiler with a special blueprint class for a particular UObject class. This fixes the problem of the new asset buttons creating UBlueprints for UUserWidget subclasses, instead of UWidgetBlueprints.

AutomationTool now correctly handles command line arguments that end with slashes.

The new FFastXml class has a single static method ParseXmlFile() for loading XML files. The parser is designed to load files efficiently, but may not support all XML features or be resilient to malformed data.

Unlike the FXmlFile class, FFastXml does not generate an XML node tree. Instead, you must supply a callback class using IFastXmlCallback and respond to elements and attributes as they are parsed. Call the ParseXmlFile() function and pass in either the full path to the XML file to parse (XmlFilePath parameter), or load the file yourself and pass the contents using the XmlFileContents parameter.

One of either XmlFilePath or XmlFileContents must be valid for ParseXmlFile() to work.

To process the XML data:

Create your own class that implements the IFastXmlCallback interface. This class will be responsible for processing the XML elements as they are loaded by FFastXml::ParseXmlFile().

You'll receive a ProcessElement() call for every XML element that is encountered, along with a corresponding ProcessClose() when that element's scope has ended. ProcessAttribute() will be called for any attributes found within the scope of the current element.

Remember to add a module dependency on "XmlParser" in order to be able to call FFastXml::ParserXmlFile().

This XML parser is based on John W. Ratcliff's "FastXml".

New: It is now possible to use <select> menus in html content rendered by the Web Browser widget

New: The Web Browser widget now supports changing the mouse cursor based on css properties.

New: Tweaked the policy for choosing how many parallel compiles to do. If the number of physical cores is greater than 4 and not equal to the number of logical cores, then use the average of the two core counts for the number of parallel compiles.

New: Unreal Build Tool support for Visual Studio 2015 (Beta)

VS 2015 support is disabled by default in this release (not all code and libraries have been ported.)

Use the new "-2015" option when generating project files to enable VS 2015 support

Windows SDK 8.1 is used by default. To use Windows SDK 10 instead, enable WindowsPlatform.bUseWindowsSDK10.

Rendering

New: Added miscellaneous parallel rendering tweaks and options. Balance deferred contexts after the fact, cvar can control occlusion latency, and a framework for Get Dynamic Mesh Elements tasks. These are all disabled by default.

New: Added Parallel Frustum Culling.

New: Added r.CompositionGraphOrder for post processing, changed default order to be node creation order to give more control, which will be useful for AsyncCompute.

New: Added several performance tweaks. Compact cloth buffers. Option to defer uniform buffer creation until it is visible. Option to defer skeletal components until visible and handle them on the RHI thread. Added the ability for tasks to be considered high priority. Added high priority ticks.

Postprocessing

New: Changed all direct access to PassOutputs to GetInput() to allow internal restructuring.

UI

Slate

New: Added a way for UI actions to be repeated if the chord used to perform them is being held down.

New: Added a way to query Slate whether it is currently sleeping by calling FSlateApplication::Get().IsSlateAsleep().

New: Added a way to specify the header padding for an SExpandableArea.

New: Converted FUIAction to use ECheckBoxState when reporting its check state.

There are now overloads to FUIAction that take an FGetActionCheckState delegate which is able to return any of the entries from ECheckBoxState.

FIsActionChecked still exists for backwards compatibility, and converts the returned bool into a ECheckBoxState via a passthrough function.

New: Slate menu refactor means all menus can be used in windowed and full screen games.

Previous menu API returned menus as windows, but menus in full screen applications must not be windows.

Menus now all respect the QueryPopupMethod of the widget that summons them.

New API creates menus and returns them as IMenus.

New: UpdatableTexture now has a method for updating the texture based on raw texture data from 3rd party APIs instead of having to copy it to a TArray first.

New: Viewport implementations now have a way to specify that the backing texture should not be scaled if it doesn't match the viewport size by overriding ISlateViewport::AllowScaling().

Fixed a bug in the standalone renderer on OS X that could cause crashes by accessing the rendering context from multiple threads.

Fixed STableRow::SetContent() from removing the extra UI added by STableRow::ConstructChildren().

Fixed path comparisons when checking a brush against a file.

UMG

New: Adding the concept of shared layers to the Game Layer Manager. Rather than a widget added directly for a player, the layer manager allows you to add a layer by name at a specific ZOrder.

The new IGameLayer interface is what you implement and allows itself to be turned into a Widget. You can later request a layer by name, cast it to your needed type and then interact with whatever functions you exposed on your layer class.

Moving the SConstraintCanvas out of the UMG Module and into Slate proper. This will allow usage in more core engine modules and not just in UMG.

UE-16247 - We now correctly call SynchronizeProperties on all core widgets. Additionally there's now an ensure to prevent future mistakes due to forgetting to call Super::SynchronizeProperties().

Upgrade Notes

C++ API Changes

SetRenderTargetsAndClear no longer takes clear values per target. The value bound at creation will be used.

FUniqueNetId now derives from TSharedFromThis so that AsShared can be called on const references that are passed around from the OSS. All references have been marked as const as well.

For TSharedFromThis to be valid, the memory must come from the heap rather than the stack. It is possible that there are instances of FUniqueNetId that have been missed. An assert will trigger immediately on first use of AsShared in these cases. Please report any issues you find. No existing code will break, only new uses of AsShared.

Removed package type parameter from LoadPackageAsync as it was not used for anything. Deprecated the overload with that parameter.

Set method will switch movement modes if currently a different ground walking mode.

Cleaned up constants in Pack/UnpackNetworkMovementMode() and made sure we only have a valid ground mode (Walking or NavWalking).

Other Upgrade Notes

AI

If your game-specific AI controller class already derives from IGenericTeamAgentInterface, you probably should remove it from your controller's parent classes

Animation

Games with duplicate, stale ActiveClassRedirect entries in their DefaultEngine.ini may have broken animation graphs until the duplicate stale redirectors are removed.

Started moving animation nodes out of Engine into a new AnimGraphRuntime module. Modules containing custom animation nodes will need to have a dependency on the new "AnimGraphRuntime" module added to their Build.cs file.

Core

Note: If you get this error on start up, please check your [ProjectDir]\Config\DefaultEngine.ini file for a large block of ActiveClassRedirects, K2FieldRedirects, etc... and remove any that are not game specific (for most games this is all of them).

Any code that uses UEnum::GetNameByIndex, GetValueByIndex, GetNameByValue, GetValueByName and GetMaxEnumValue needs to be modified to handle the new param/return types.

The "ensure" family has been changed so that the default behavior is to log/break only on the first failure, replacing the “ensureOnce” family. The old functionality is available under the “ensureAlways” family.

ensure() should be replaced with ensureAlways().

ensureMsgf() should be replaced with ensureAlwaysMsgf().

ensureOnce() should be replaced with ensure().

ensureOnceMsgf should be replaced with ensureMsgf().

Modules must be listed in either DynamicallyLoadedModuleNames or Public/PrivateDependencyModuleNames, not both. If in doubt, remove the duplicate from DynamicallyLoadedModuleNames.

Editor and Tools

If the ensure in FMainFrameModule::StartupModule() is hit in your game, you need to guard code that is editor-only via either the Editor module type, or checking IsRunningGame().

Localization

Make sure to set your game's native culture setting in the Region & Language page of the Editor Preferences, so that assets load up that culture's localization for display.

Paper2D

Blueprints or C++ code that programmatically modifies the color of a Paper2D component will need to be updated, otherwise the color being applied may be darker than expected.

Physics

Note that constraint projection being turned on by default may slightly change the behavior of existing ragdolls. In general we are seeing much better stability as this is coupled with projection fixes inside PhysX.

The increase in default max angular velocity from 400 degrees per second to 3600 degrees per second can have a slight impact on existing simulated objects that were rotating at the previous max speed. You can use the physics project settings to change it back to the old behavior.

Platforms

Playstation 4

Your project must upgrade to SDK 2.5 to compile successfully

Project should see a small GPU performance benefit. Up to ~5% over the old compiler.

Projects must upgrade to SDK 2.5 and obtain 120hz Morpheus kits.

Mac

Using the WebBrowser module no longer requires creating a subclass of NSApplication.

All Mobile

If you use either the iOS or Google Play online subsystems, the system login UI will no longer appear automatically during engine startup.

You must now explicitly invoke the system login UI by calling either "IOnlineExternalUI::ShowLoginUI" from C++ or "Show External Login UI" from Blueprints.

The "Connect to Service" Blueprint node has been deprecated. The "Show External Login UI" node should be used instead.

The "Connect to Service" Blueprint node has been deprecated. The "Show External Login UI" node should be used instead.

You must now explicitly invoke the system login UI by calling either "IOnlineExternalUI::ShowLoginUI" from C++ or "Show External Login UI" from Blueprints.

Programming

The previously required boilerplate code can now be removed, but should still work.