Unreal Engine 4.5 Release Notes

The 4.5 release includes eagerly-awaited features such as animation retargeting, automatic C++ hot reload, light map UV generation and streaming video textures. New real-time ray traced soft shadows allow for beautifully lit dynamic scenes, and screen-space subsurface scattering enables very realistic skin materials. Support for mobile platforms and consoles is better than ever, and hundreds of targeted improvements in this release allow complex online games to pass console certification tests. Finally, creating user interfaces has never been easier now that Unreal Motion Graphics is ready to use!

This release also contains a huge number of usability and learning enhancements, an all new tutorial system, and new game templates for Advanced Vehicles and Twin Stick Shooters.

In this release, more than 40 features and improvements were contributed by our amazing community of developers. We would like to extend our gratitude the contributors below.

We would also like to extend a special thanks to Lee Perry-Smith and Infinite Realities (http://ir-ltd.net) for providing the head model and assistance with Screen Space Subsurface Scattering.

Major New Features

Rendering

Ray Traced Distance Field Soft Shadows

There is a new dynamic shadowing method which works by tracing a ray through mesh distance fields to the light. This allows for soft area shadows with sharp contacts!

Here is a directional light with ray traced soft shadows. Long shadows get softer and self-shadowing in the distance is still detailed.

Point and spot lights work too. 'Source Radius' is used to control how large the light source is and therefore how large the shadow penumbras are.

Ray traced shadows can be efficiently computed for longer view distances than traditional cascaded shadow maps (CSM). Distant shadows can be ray traced while nearby shadows are computed with CSM to get the best of both approaches.

These distance fields are the same data used by the Distance Field Ambient Occlusion feature. You can enable it with 'Use RayTraced DistanceField Shadows' on a light, in projects which have the 'Generate Mesh Distance Fields' project setting enabled.

Distance Field Ambient Occlusion Improvements

The project rendering setting is now called bGenerateMeshDistanceFields, check that box and restart the editor to use any distance field lighting features.

Generation

The distance field generation has been made asynchronous. It will use most of the CPU's cores but leave a few available for using the editor in the meantime.

Meshes no longer need to be closed to support a distance field.

Specular Occlusion

We now have some approximate specular occlusion for the sky. The Distance Field AO computation produces a bent normal, which is a cone indicating sky visibility at that point. Intersecting this cone with the reflection cone gives a shadowing term for the sky specular. This prevents leaking near occluders and works best on somewhat rough materials or wherever SSR is not valid due to screen space limitations.

Screen-space Subsurface Scattering

A new "Subsurface Profile" shading model has been added! You can use subsurface scattering to create realistic skin materials and other awesome effects.

Left: no subsurface scattering, Right: realistic settings

Dynamic Shadows on Mobile

Dynamic shadows for movable directional lights are now supported on mobile platforms! Shadows are rendered using cascaded shadow maps with up to two cascades.

Unreal Motion Graphics (GUI Designer)

Unreal Motion Graphics is now ready to use and available by default! Simply create a new "Widget Blueprint" and start designing your UI. Of course, new features and improvements are still being added daily.

UI Render Transforms

Widgets in UMG and Slate can now be translated, rotated, scaled, and sheared!

UI Styles

We now allow styling to be done completely inline for a widget's definition. This allows users a much greater control over how widgets look without needing to clutter up their project with several dozen style variations. Styles can now be changed in game, allowing dynamic material instances to be used on any UI!

UI Animation

UMG now includes more robust animation support.

Multiple animations can be created for each widget

Animations can be controlled at runtime in your widget's blueprint graph

Keys can now be added to animations automatically via the details panel

UI animations can be controlled in the widget blueprint graph. This is an example of playing an animation when a widget is hovered.

DPI Scaling

Unreal Motion Graphics now supports automatic scaling for resolution-independent UI. We now provide default DPI scaling rules for all games. You can configure this in your project's Rendering settings.

Video Textures (Media Framework)

OpenEXR Frame Capture

You can now save rich frame data including HDR colors and 16-bit pixel depth into an OpenEXR file. This is really useful for offline compositing work.

Project Creation

New Project Creation Window

The New Project window has been redesigned to simplify the process of creating new projects!

Target Hardware Selection

You can now select the type of hardware and devices you want to support, and the engine will choose optimal settings for the best player experience! This can be set when creating your project in the New Project window or in the Project Settings under Target Hardware.

Learning Resources

In addition to new videos and new written documentation, there are major updates to how you can learn about how to use the editor and access documentation right when you need it!

New Tutorial System

The tutorial system has been completely overhauled in order to provide a more immersive experience!

There are no more popup windows. (Yay!) Unobtrusive text bubbles overlaid on the editor now walk you through interface elements and various features. The editor will alert you about tutorials you haven't tried, but it never forces you to view anything.

Once you have decided to take a tutorial, you can right-click to see other navigation options (or click the combo arrow in the top-right of the content bubble)

Tutorials Browser

There is a fancy new Tutorials Browser that provides easy access to all of the tutorials

Tutorials can be accessed from either the Help menu or by clicking the new Tutorials icon in the top-right of the editor.

Tutorials Blueprints

Tutorials are actually now built as Blueprint assets. This means you can create your own in-editor tutorials to include with content published to the Marketplace!

Tutorials you create will automatically be visible in the new Tutorial Browser UI.

Improved In-Editor Help

Instant Online Help

You can type into the new Online Help box and the editor will gather as many helpful resources as we can find from the internet.

Tutorials, documentation, community wiki, and AnswerHub pages are now all accessible from here! Note: We've moved the in-editor debug console. You can now press the tilde (~) key to summon the console anywhere within the editor!.

New Help Buttons

With lots of new documentation anchors, it's easier to jump directly to reference documentation as you need it in the editor!

Documentation Actors

New documentation Actors have been added to sample content that links you to helpful documentation pages. Check out the updated Content Examples project that includes lots of new help links!

Documentation Nodes

Documentation nodes provide the ability to display documentation snippets in Blueprint graphs. This means you can embed text and images in your graphs to provide information that goes above and beyond the usual comment blocks!

New Help Tool-tips

Lots of detailed tool-tips have been added all over the editor. Material nodes, placeable Actors and blueprintable classes now all have rich help when you hover over them with Ctrl+Alt held down.

Documentation

The Unreal Engine documentation
now features an updated look which improves readability! In addition, we added search term suggestions to the front page to help you quickly find the topics you are looking for.

Video Tutorial System

The documentation now includes a video system
for finding and viewing all of our video tutorial series! Everything is organized into categories and videos can easily be viewed as an entire series.

New Additions

Learning Resources

The Getting Started
page has been overhauled to make the most important resources for those just starting out easily accessible.

We added a whole new section over developing for Virtual Reality
platforms.

Video Series: Vehicle Time Attack
- This tutorial series covers the basics needed to create a simple Time Attack style race completely through Blueprints, using a Canvas HUD and showing how to save game data.

Editor and Tools

New: Unreal Editor can be now built and run on Linux (experimental, not supported yet.)

New: The editor no longer forces capitalization for asset and object names

New: Levels (.umap files) are now visible in the Content Browser, and you can perform many of the same actions that you would on other assets.

New: Documentation link ('?' icon) next to classes in Place mode.

New: Folder Rename can now be done in the Content Browser Path View.

New: Smaller allowable thumbnail size in the Content Browser.

New: Greatly improved the look and feel of the Message Log window.

New: Replaced UI for FBX importing with a simpler, more intuitive interface.

New: Classes added via the C++ class dialog in user projects now apply the copyright notice specified in project settings, and the default notice string has been changed to 'fill this out in project settings'

New: UBlueprintFunctionLibrary is now listed in the short-list for the new C++ class dialog.

New: Added a new feature to support morph targets for clothing.

New: Target Hardware can now be picked when creating a new project, which controls the default values for various rendering and engine settings.

The target hardware choice can be changed at any time in Project Settings, and individual settings can be modified in their respective homes as well.

The designer now allows you to move widgets in Layout Transform or Render Transform mode.

A new SetInputMode() API on the player controller allows more control over how input is routed. Modal UI's and so on will be easier to setup.

Added grid snapping to the translation layout mode.

When creating a widget you should use the new Create Widget node. It works similarly to the Spawn Actor node and allows variables marked as exposed on spawn to be set.

We now provide default DPI scaling rules for all Slate/UMG UI in games. They can be found in your projects Rendering settings, the default setup performs a linear scaling of the UI based on the shortest side's resolution.

Drag & Drop now has some limited support, though there are still some issues to iron out so that it doesn't create another window to house the dragged content.

In order to implement it, you'll need at least two different user widgets, a draggable widget, and a widget that will act as the drop target.

"Aspect Ratio" menu in designer view renamed to "Resolutions."

All resolutions that match the currently selected one are checked in the Resolutions menu. The current resolution is also displayed in bottom left of designer view.

Added GetText() to TextBlock.

Lots of stability improvements. Bindings are no longer run at design time to prevent many of the crashes witnessed in UMG.

Low level input handling is now possible in UMG widgets, you'll need to override the mouse/controller/keyboard functions and handle the input there.

The game viewport now disables throttling when it contains focus so that Slate UI in the game doesn't trigger throttling in the editor, meaning interacting with Slate or UMG UI in your game will no longer cause the editor to stop updating.

Changing all BlueprintImplementableEvents to BlupeprintNativeEvent on the UUserWidget so that native implementations can handle those events as well.

Palette now properly displays all other Widget Blueprints in the project.

The progress bar now has clean clipping lines when displaying the progress image. It no longer scales the paint geometry, it instead scales the clipping rect, it does this for everything except for FillFromCenter, where the only reasonable thing to do is scale the paint geometry, otherwise a sphere image would be filled using a square. Additionally, I've added Fill directions for TopToBottom and BottomToTop.

Slate color details customization now has a way to toggle the 'Use Foreground' flag using the new 'Iinherit' checkbox.

TextBlocks now have text justification.

Improving the anchors drop down menu to show a preview of the effect it has.

Anchor points can now be animated.

Fixed a few cases where widget functions did not appear in the graph when "Context Sensitive" was enabled.

Paper 2D

New: Added debug rendering for pawn/visibility collision on sprites.

Added support for VMI_CollisionVisibility and VMI_CollisionPawn view modes to FPaperRenderSceneProxy

New: Support for defining or querying sockets on flipbook assets and components.

Current implementation passes thru sockets defined on each source frame and does not allow authoring directly in the flipbook editor, but it is otherwise fully functional

New: Improved material support on UPaperFlipbook assets and components.

Converted UPaperFlipbookComponent to derive from UMeshComponent, allowing materials to overridden at runtime or via Blueprints.

Added a default material to UPaperFlipbook assets and changed the Material override in UPaperFlipbookComponent to default to null.

This should have no impact on existing content, but allows flipbooks to have a material set once and show up correctly inside of the flipbook editor, rather than requiring it to be set on each instance.

New: Added support for a negative play rate on flipbook components.

New: Added support for choosing project-wide default materials that will be applied to newly created sprites.

Combine various InitSprite variants into one function that takes an init parameters object.

New: Moved Paper2D plugin out of Experimental folder, as only a few parts of it are still experimental.

New: Expose RenderComponent to Blueprints in APaperFlipbookActor and APaperSpriteActor, and add 'pass-thru' metadata so various functions can be called on the component from an Actor reference.

New: Added DLL export to UPaperSpriteComponent and APaperCharacter

New: Added support for manually creating sprites with holes in render geometry.

Blank blueprint graphs now show passive instruction text to help guide new users to use the context menu.

New: Can now select World Settings game mode classes from Blueprints drop down on the main editor toolbar.

New: Camera Actors can now be ticked, and can utilize the blueprint tick event.

Compiling Blueprints, PIE'ing, and SIE'ing no longer flush the undo buffer, so you can undo across PIE/SIE sessions.

Category sorting for components was enabled in My Blueprint panel and some information to track the user sorting was added to blueprints.

Script max loop iteration was exposed to the user through editor settings, located in Project->Engine->Blueprints - Maximum Loop Iteration Count.

Added a documentation node to the Blueprint interface. These Nodes have the ability to display UDN documentation inside the blueprint editor utilising the details panel to set the link and excerpt name.

The Blueprint compiler was modified to identify and cull disconnected/inactive timeline nodes so Actor instances do not have redundant timeline components that require resources to check if they require a tick.

New: Added warning to renderer settings when a property is not found or set to read-only (read-only isn't always an error since it still gets written to the ini file, it just won't take effect until the next run)

Distance Field Ambient Occlusion Improvements

Asynchronous generation, meshes no longer have to be closed.

Resulting bent normal is also used to occlude skylight specular using an approximate cone-cone intersection.

Animation

New: Animation Retargeting between different spaces.

You can retarget animations between different skeletons using "Retarget" feature in engine via multiple options. This feature allows you to create a copy of animation asset to retarget for different skeleton using copy and/or modifying animation itself. If the bone name matches, you don't have to use rig system. If bone names don't match, you'll have to use new "rig" system. If it's humanoid, please use engine Humanoid Rig. If it is not possible, you can create rig from any skeleton, and make sure both skeleton shares the same rig. Then you'll be able to retarget correctly. Check more for documentation.

Extended GameplayDebugger to collect EQS data from Pawn and AIController simultaneously (some queries can be executed on pawn and some on controller)

Extended Visual Logger and UObjects can log data directly. There is no need to log only from Actors any more but there is a catch - object has to redirect his logs to Actor and this Actor will own logs.

Extended GameplayDebugger data view for Simulate in editor. Properties from GameplayDebuggingReplicator Actor (Actor visible only during Simulate) can be used to switch debug views.

Added IsUsingDefaultBounds to ALevelBounds to indicate that because there are no Actors in the level that contribute to the bounds, the default bounds are being used.

Added a slow task for adding sublevels to a persistent map.

Added CulturePointer.h, which typedefs ThreadSafe TSharedRef and TSharePtr for FCulture. These should be used instead of the manual template instantiations for consistency.

Added a command line option (-nosharedpchs) to UBT to disable shared precompiled headers.

Added Cultures-to-Stage list to Project Packaging Settings. Default value includes only English. Packaging now only stages specified localization data as per the previous comment or by passing "-CookCultures=".

APlayerController::DeprojectMousePositionToWorld and DeprojectScreenPositionToWorld both now return false when unable to deproject, due lack of mouse cursor, valid scene view, etc.

APlayerController::GetMousePosition now returns false when a mouse is not attached.

Removed deprecated editor mode API that was marked for deprecation in 4.3.

Removed the built in shaders option from the material editor.

Removed unnecessary game thread task from FRecastRenderingSceneProxy.

Removed circular dependency between AIModule and GameplayDebugger.

Removed logic in PO import/export that failed to read/write from culture directories if only one culture was specified.

Reduced UE_VLOG overhead when recording with disabled visual logs.

Refined text rendering on content browser thumbnails.

Switch Node Polish

Name and String have + Add Pin button.

Enum doesn't display Remove Execution Pin on right click.

All types have proper default in selection box.

AActor::EndPlay fixes.

Add call to EndPlay for quit in standalone game.

Move logic for when to dispatch EndPlay in to a non-virtual RouteEndPlay function.

Only call EndPlay if the Actor has been initialized and the world has begun play.

The physics scenes for a world are now destroyed after cooking a package containing the world. If multiple worlds are in memory at cook time, too many scenes were being allocated and causing a deadlock when locking a scene for read/write

Moved asset thumbnail dirtying code out of ContentBrowserSingleton and into AssetThumbnail.cpp. Updating thumbnails is not the responsibility of the Content Browser since many systems use thumbnails now.

Path pickers that allow context menus will once again allow the creation of a new folder. This also fixes the bug where pickers configured to the extend the menu actually never get a chance to extend anything.

Made the default level streaming class an editor user setting.

Reduced the number of GetTimeStamp calls when checking for DDC files by 1, which reduces I/O burden on the shared DDC a little bit.

Worlds with no Actors in them no longer crash in PostLoad.

Added null checking for missing expressions and comments when fixing up materials on load.

Expanded the particle system audit commandlet to find particle systems with a high spawn rate or far lod distance.

Fixed escaping of double quotes when storing manifest/archive strings from their data structures into a JSON object. The manifest/archive JSON serializers already properly escape text consistently before writing to file.

Fixed FUProjectDictionary incorrectly treating projects as foreign when non-foreign projects are specified with a relative path.

Fixed it so scalability settings are correctly written to the user config file when saving settings, and are properly reset to in memory values when reset.

Fixed several issues that occurred when reattaching components while changing graphics quality settings.

Fixed a bug where FText could become corrupted while editing assets.

Core

New: FName case preservation in the editor.

Previously, built-in names would prevent users from using the same name with different case

FName is now case-preserving when WITH_CASE_PRESERVING_NAME is true.

You can no longer assume that sizeof(FName) is 8-bytes (you can use FMinimalName if you have code that requires an 8-byte name, however this should only be used if the code cannot otherwise be updated).

FName no longer has GetIndex(), it has GetComparisonIndex() and GetDisplayIndex() instead.

Added "-WaitForDebugger" command-line option.

When specified, non-shipping UE4 programs will pause at startup until a debugger becomes attached.

Very useful for remote debugging code that executes at startup time (such as a plugin's StartupModule function).

Added an ensure >0 to FBlueprintCoreDelegates::SetScriptMaximumLoopIterations

DataAgeThreshold=N can now optionally be supplied as a command line argument to BuildPatchTool.exe, where N is a number of days.

If specified during a patch generation operation, only existing data aged less than the supplied parameter (in days) will be considered for reuse

If specified during a compactify operation, only data aged more than the supplied parameter (in days) will be eligible for deletion

These changes have been made to allow for concurrent patch generation and compactify operations on the same cloud directory, during which patch generation should have a lower threshold than compactify.

Exposed UNavigationSystem::OnNavigationBoundsUpdated for BP use and changed the param to a more specific ANavMeshBoundsVolume type.

FName is now case-preserving in the editor and UHT.

This addresses a number of issues where asset, Actor, blueprint component, or variable names could not have mistyped names corrected when they differed only by case, or could cause UHT to generate code that would not compile.

Implemented a generic BTTask for making AI face given BB entry.

Improved error message when GGameName (derived from the .uproject name) mismatches the GameName key in the [URL] section of DefaultGame.ini

IGenericTeamAgentInterface can be used to query team's attitude towards another team.

Made ARecastNavMesh::GetRecastNavMeshImpl protected to that it can be used by derived classes.

Made navmesh query filters virtual by default.

There is still a way to have non-virtual filters, configurable via ARecastNavMesh::bUseVirtualFilters.

Can be controller per filter instance as well.

Made navigation generators public and expandable in external modules.

Made Build Patch Services and BuiltPatchTool public again.

Added BuildPatchTool command line options to add custom fields to the manifests it generates. These new options are: -custom="field=value", -customint="field=value" & -customfloat="field=value"

Minor fixes related to using the FCString.

ScriptPlugin: Added helper project and instructions how to set up LUA to work with UE4.

Fixed an issue with the FPSChart functionality.

Fixed missing property names in 'obj refs' output.

Fixed parsing enum default values in UHT.

Fixed crashes on long compilation command lines.

Fixed TMap move semantics.

Fixed failure when packaging for WindowsNoEditor in UnrealFrontend.

Added the OnlineFriendsInterface.h to Online.h so that UE4 code projects can access online social features.

Changed default label of BTDecorator_Blackboard to more explanatory "Blackboard Based Condition"

Compile time improvements - headers in Engine module include only what they need.

FDateTime and FTimespan can now be edited in the Property Editor and were also exposed to Blueprints.

Optimized invocation list compaction in multicast delegates.

Crash fixes to some NavigationSystem's extreme use cases like enormous navmesh bounds or zero-extent bounds.

UnrealBuildTool now gets the cl.exe from the executable itself rather than the registry, for better compatibility with non-Professional editions of Visual Studio.

Now it deletes old and unnecessary hot-reload PDBs.

RPC UFunctions will now generate virtual X_Validate() functions so they can be overloaded if the function itself is virtual.

Fixed detection of hot-reload compilation if other UE4Editor process was running in the system.

Project Versions

Solution files created for GitHub builds of the engine now set the game to as the active project by default.

New VS2012 projects now include default command line arguments for all projects.

UnrealVersionSelector now prompts to browse for an engine installation if an existing one is not found.

Registering shell extensions now fixes up any stale user overrides for file associations.

UnrealBuildTool now correctly handles user-supplied resource files, and will ignore PCLaunch.rc when they are present.

UnrealVersionSelector now warns when trying to generate projects for content-only games.

Stats

New: There is a new stats page for Cooker Statistics in StatsViewer

StatsViewer: Now shows hyperlinked arrays of objects

Added a command 'stat display' which may be used to change various stats display settings

Updated comment regarding stats commands exec.

Fixed minor memory leak.

Profiler

Fixed FPS Chart not working in the previous version.

Crash Report (probably not very useful for licenses or rocket users)

Crash report receiver is now more reliable, requires less maintenance work.

Crash report client

Added analytics to the crash report client

Crash report website

Added an option to filter buggs by the build version/ or by the crash type

Added displaying the MachineID/EpicID

Added ErrorMessage to the website, error message can contain following values: description from asserts, description from ensures, description from fatal errors or can be empty for unhandled exceptions

Hot-Reload

Hot-Reload now supports structural changes to UObject-derived classes. It's no longer disallowed to add/remove new properties and classes for hot-reload.

Hot-Reload from IDE: when compiling game target that's currently open in the editor from Visual Studio, the editor will automatically perform hot-reload after compilation has finished.

After hot-reload all default class object will be re-created to match the changes made to the default values.

When performing Hot-reload when the target project is up-to-date, no new DLLs will be produced, thus reducing iteration times.

Slate UI System

New: Multitouch is now supported for mouse capture in Slate and UMG. Actions like pressing and holding a button, while pressing a different button now functions correctly

New: 2D render transforms have been added to Slate. Render transforms allow short, transitional effects for a widget without affecting how it is laid out. They support a complete set of 2D affine transforms (translation, rotation, shear, scale, mirroring).

New: Added image support to rich text editing.

MultiLineEditableText can now be used to edit rich-text (there's a demo in SlateViewer)

TextBlock and SpinBox now support a minimum desired width for layout.
Added a SerializeFromMismatchedTag to FSlateColor that can convert an FColor or FLinearColor property to an FSlateColor.
Implemented scrolling for SMultiLineEditableText.
STextBlock can now specify a justification, margin, and line height percentage.
SRichTextBlock now takes its text and highlight text as an attribute.
SEditableText, SEditableTextBox, SMultiLineEditableText, and SMultilineEditableTextBox now automatically work with virtual keyboards on mobile devices. Currently only single-line entry is supported.

Also added IsUnderLocation() and ToBoundingRect() for overlap testing.

Slate now uses Round instead of Trunc to snap to integer pixel coordinates. Snapping only occurs on final vertex creation now.

Added a ScissorRectBox widget that ensures child widgets are clipped even under render transforms by using hardware scissor rect.

Scissor Rects can be nested. A widget is clipped by scissor of the most recent predecessor.

Expect a performance impact beyond the hardware overhead as this affects batching similar to painting to different layers.

Fixed SScrubWidget::OnPaint drawing the draggable bars with an incorrect offset.

Fixed crash when using SLATE_TEXT_ATTRIBUTE with a delegate that had become invalid.

Fixed crash when pressing return in a read-only text box.

Fixed some wrapping issues when using multi-line text with an STextBlock.

Fixed issue where the bar of a Slider widget did not appear on mobile devices.

Fixed crash when re-styling zero-length text runs

Audio

New: Sound Class for VOIP audio component can now be specified via the audio project settings.

Enabled Audio Streaming options behind a new setting in the 'Experimental' section of preferences

Added Audio setting to restrict the amount of streaming sounds that can play concurrently.

Ensured that additional channels for multichannel sounds can be imported correctly.

Ensured that new sounds started via 'Play Sound Attached' would be audible before playing.

Fixed problem with Parameter controlled Crossfade SoundNode.

Exposed Audio Component for the Buggy engine in the Vehicle sample.

Added search capability to key selection boxes.

Moved Streaming Manager update out of the expensive tasks section.

Platforms

Mac

Improved drag and drop between windows on Mac. Inactive window will not activate on mouse down if the cursor is over a draggable item.

Added pragma to treat deprecation attribute as warning, not error, on Mac.

For the benefit of OS X implement support for APPLE_client_storage & APPLE_texture_range and use them for non-renderable textures to eliminate the cost of Lock/Unlock and RHIAsyncReallocateTexture2D.

This only works with uncompressed textures, but helps avoid very slow, synchronous calls to glGetTexImage despite using PBOs. This does not increase memory overhead as client-storage textures use the backing store we provide for the GL engine copy.

Wrap OpenGL texture deletion calls so that on OS X DeleteTextures pools the texture names into one of three buffers so that textures are deleted at least two frames after their last use, this amortises the cost of deleting the textures.

The texture deletion occurs after flushBuffer in BlitToViewport and the min/max number of textures to delete in a single invocation can be overidden by the r.Mac.MinTexturesToDeletePerFrame & r.Mac.MaxTexturesToDeletePerFrame.

Wrap glFlush so that on OS X we always call glFlushRenderAPPLE which is faster, while still sufficient for these calls.

Warn Mac users that attempt to run on Macs with OpenGL 3.3 GPUs as they aren't fully supported also warn Mac users whose GPUs are below the recommended minimums that they may encounter low performance.

Added warnings for running with less than the recommended amount of memory or on a dual-core rather than quad-core processor as they also make a big difference.

Initial work to fix fullscreen mode on OS X properly - these changes make it possible to use 'proper' fullscreen mode which respects the chosen resolution for games where the mouse cursor is hidden.

The default remains as WindowedFullcreen as these changes don't address the difference in mouse & display coordinate systems that results from using OS X's scaled fullscreen mode.

Implemented support for saving open documents in Xcode via the XcodeSourceAccessor using Applescript & fixed the XcodeSourceAccessor's display name.

Rewrote Mac OS X crash reporting to output the minidump information in Apple Crash Report format, which is then parsed by the new code in CrashDebugHelper into our diagnostic display format.

Symbolisation is now implemented using CoreSymbolication, atos is no longer required meaning we don't require Xcode be installed.

Symbolisation now only happens within the CrashReportClient, not the crashed app, so the crash handling is async. handler safe.

More useful information is now provided in the logs.

Used a pre-configured malloc zone allocator instead of the current allocator once execution enters the async. signal handler on Mac OS X so that UE4 doesn't become unkillable if it crashes.

Fixed various crashes and other Mac specific issues.

On OS X detach the game thread from the 'blessed' Cocoa main thread.

Cocoa isn't an event-polling API as UE4 expects, so we separate the threads to emulate that behaviour.

This means less spinning-beachball-of-doom when loading levels or cooking, etc. which made some windows unusable on OS X.

It also allows us to take steps to ensure the event ordering Slate demands, but OS X doesn't always provide.

Implemented support for Distcc + DMUCs as an alternative to XGE on Mac OS X.

By either manually configuring distcc & DMUCS as per their documentation, or using the DistCode Xcode plugin compilation can be distributed amongst networked Macs.

All Macs must have the same developer tools installed & the same distcc/DMUCS/DistCode and be on the same local network.

This works for compiling for Mac & iOS and it should be possible to configure distcc & DMUCS manually for use on build farms for remote building from Windows.

Implemented optional & off-by-default support for automatic graphics switching on OS X, rather than just relying on the OS, with a GUI plugin for the editor.

Adds DisplayMask for setting an explicit display mask, RendererID for the initially preferred rendering device, bUseMultipleRenderers to allow desktops to use multiple GPUs for blitting to the screen and bAllowAutomaticGraphicsSwitching to allow laptops with automatic graphics switching support to switch between discrete & integrated GPUs which provide the same OpenGL version.

The plugin provides an editor preferences panel & for laptops using bAllowAutomaticGraphicsSwitching a live drop-down in the LevelEditor window to select the current GPU.

Android

Experimental support for OpenGL ES 3.1 + Android Extension Pack as seen in the "Rivalry" demo at this year's Google I/O.

Added HTTP support for Android with libcurl with option to allow self-signed certificates in project settings network panel.

Added x86 Android support, but currently only for full source games, as we don't supply x86 binaries for non-GitHub/Licensee builds yet. You can package separate or fat apks. If using separate, Launch On will query the connected device for the best match. This is pretty early, so we are interested in feedback!

Added Xbox One implementation of RHICalcTexture2DPlatformSize(), for more accurate memory usage statistics.

Added a new delegate to to IOnlineIdentity, OnControllerPairingChanged, which fires when the Xbox event fires.

ShooterGame now handles controller disconnections to comply with XRs.

Shader PDB generation is now supported for better debugging in PIX. To activate this, add the following text to your game's DefaultEngine.ini file, substituting the path for where you want the shader PDB files to be placed. The directory must be one that can be written to from non-administrator level processes. You may need to change the GUID in ShaderVersion.usf to force a rebuild of the shaders.

[DevOptions.Shaders]
ShaderPDBRoot=D:\DirectoryOfChoice

SSE math functions added (from the Windows implementation).

Xbox now fires FCoreDelegates::OnControllerConnectionChange when a controller connection changes.

Xbox One MP4 movie player plugin has been added.

Added /ZW compiler option for libraries, so that plugins can use the entire XDK.

Changed thread affinities so that worker threads never share the core that the main game thread is on.

Shootergame - has many changes that were made to allow it to go through a certification pass on both XB1/PS4.

Fixes needed to get online splitscreen functional.

Fixed crash that can happen when splitscreen players leave.

Fixed issue where Controller property wasn't replicating to non owners, but needs to when the value is NULL.

Fix for the network GUIDissue during seamless travel when we flush guids on the server. The quick fix is to not even send this property to the server, since we don't need to. This has the added benefit of not only fixing the issue, but saves bandwidth. We still need to look into letting guids persist on the server for a bit longer to rully resolve any future conflicts that could happen.

Lower verbosity on rejected RPC's. This really isn't an error, and more by design.

Fixed issue where we see splitscreen artifact while loading levels (don't show splitscreen panes until in game).

Used dialog box which is more appropriate for showing a message when staying in the current menu, and fixes a bug where we can't use the message menu to leave the welcome screen due to priorities.

Improved and consolidate checks that verify user is online.

Cleaned up and consolidated session shutdown code. This is so we can call this when we don't yet have a GameState (haven't fully connected to a server, but need to shut session down). This fixes the issue where if you fail to join a server once, it will keep failing after that.

Detected and display generic errors from server (so we show full lobby when splitscreen player joins)

Added support for a load screen on the main thread. We can now call this during seamless travel, and before the level starts loading to cover session calls, etc.

Made sure to disable load screen anytime we enter the main menu.

Show net version, date, and time on hud (non shipping only).

Handle users that sign in, but previously accepted "continue without saving" (punt them back to welcome screen in this case).

Fix for the number of teams in the HUD not updating correctly when there are no players left in a team.

Scoreboard is now more compact to fit in more players

Splitscreen Lobby now says 'find match' when not hosting

If either splitscreen player disconnects during on online game, kick back to the main menu

Fix for invalid index accessing userid when creating save data for player 2

If the user quits the match, either through the menu or by signing out of their profile, when they are winning - label them as a quiter so they don't get rewarded with the win.

Rename players which share the login for offline play.

Fixed a bug where the second controller couldn't join a game.

Fixed a bug where trying to search for LAN games would lock you out of searching for any games until you restarted.

Set up join game flow to handle/process arbitrary errors.

Cable pull handling.

Fixed issue where the map's navmesh wasn't being registered during seamless travel, because ANavigationData::PostInitializeComponents would MarkPendingKill itself if the world didn't have a navigation system yet.

Fixed a case where two in-game menus could appear on top of each other.

Voice chat implementation/UI is now being displayed in the Scoreboard UI in-game. Also added speaker icon to display via slate.

Fix that allows local accounts to play offline matches.

Fixed issue where a player got into a bad state if the in-game menu was open when the round transitioned.

End of round scoreboard is now interactive and can be used to bring up players gamercards.

Don't call HostGame when hosting a quick match, the session has already been created.

Added/removed local users to/from the party (required for Xbox One) in Shooter online games.

OSS - Introduced FPlatformUserId, which is similar to FUniqueNetID, but can live in core engine code.

OSS - Added an Identity interface function to get an FPlatformUserId from an FUniqueNetId.

OSS - Added new delegate for invites that takes a FUniqueNetId. No longer require you to register delegates for each user. Fixes several invite issues.

Fixed an issue where FPointerEvent::CursorDelta was calculated backwards for touch events. Any user created widgets that use this constructor and negated CursorDelta to get proper behavior will now scroll/slide backwards. Fix this by removing the negation to FPointerEvent::CursorDelta where necessary.

FGeometry Breaking Changes

To support Render Transforms for widgets, some breaking changes were made to FGeometry:

Made all public members const to prevent mutating uses of them.

Instead of mutating FGeometry, prepare the necessary values in advance and call FGeometry::MakeChild().

Removed FGeometry::CenteredPaintGeometryBelow() and GetRect().

Direct member access to FGeometry will eventually be going away.

Replace direct member access with calls to appropriate member functions instead.

FPaintGeometry should no longer be constructed directly to properly support render transforms.

Instead call FGeometry::ToPaintGeometry().

Existing usages will not break, but they will not support render transforms.

Removed FPaintGeometry::ToSlateRect() and Identity().

Unreal Motion Graphics

Button Click Bindings from 4.4 won't work out of the box in 4.5! Due to a design change, the UMG Button no longer uses a function binding to register the click events. It now uses a standard Blueprint Multicast Event for performing the click Broadcast. You will need to setup a new handler for this event, then call your old function, or move the logic into the event graph. NOTE: There was another bug associated with function bindings, they were all accidentally generated as pure, so you will need to uncheck the pure checkbox in order to invoke your function.

We now provide a DPI Scaling system for all Slate Game UI. If you already have one you should remove it or configure this one to have a scale of 1 so that they don't both add to the scale of the UI. See New Features for more details on the system.

If you were using the low level overridable input functions that expected the FSReply (now called FEventReply), the way that structure is built has changed a lot to mirror much more closely what is possible with Slate. For example, if you want to have a widget that captured the mouse on mouse down, you could do it like so now:

The old Drag/Drop panels have been removed in favor of a different approach to drag/drop.

To create widgets in the past you had to use the "Create Widget" function. This has been replaced by a new custom node with the same name, Create Widget has many more capabilities, and it always returns the type specified, so you no longer need to Cast a widget you just created! Your old usage should continue to work, but you're encouraged to change over to this new node.

Several unfinished experimental widgets have been hidden until their time comes. Viewport, List View, Tile View, ComboBox, ScrollBar are no longer creatable in the designer.

The Slate Widget Style assets no longer apply to UMG. You can use them in a few places in blueprint scripts, but they are no longer the means by which you style widgets. Existing styles will be copied over, however we now store a copy of all style data directly on the widgets. We do this so that you can freely mutate the style of any widget at runtime, giving them dynamic material instances and just generally changing their look and feel based on user input.

Added To Viewport - Modal, Show Cursor and Absolute Layout flags have been removed! Absolute Layout is now automatically determined if you manually attempt to position/size it after placing it in the viewport. Cursor and Modal options are now controlled through the Player Controller with the new function "Set Input Mode".

Rendering

DrawDynamicElements in subclasses of FPrimitiveSceneProxy will be deprecated soon and replaced with GetDynamicMeshElements.

Progress on parallel rendering, mostly focused on consoles. For non-consoles, r.RHICmdBypass 0 enables the parallel prototype. That also works on consoles, but togglerhithread enables the full set of parallel optimizations. This remains experimental work in progress, but show promising gains.

Post processing lens flare defaults have been changed (off by default as project setting) and your existing projects might have lens flares that formerly have been switched off by post process settings. The post process setting can be fixed or the new project setting can be used.

ERHIFeatureLevel::Type enumeration entry SM3 was removed, and ES3_1 was added

Any tests for ERHIFeatureLevel::SM3 should be changed to ERHIFeatureLevel::SM4

Any tests for ERHIFeatureLevel::ES2 should be changed to ERHIFeatureLevel::ES3_1

Blueprints

Evaluate Curve Table Row Blueprint node: Added a drop down box for selecting row name, but you may have to delete and recreate any existing nodes to see this change. New nodes should work fine.

Kismet library headers are no longer globally included.

Prevented GetPlayerController, GetPlayerPawn, GetPlayerCharacter, GetPlayerCameraManager, CreatePlayer being called in ConstructionScript.

Users should port their own K2Node GetMenuEntries() implementations over into UK2Node::GetMenuActions() (in preparation for 4.6)

We've been refactoring the blueprint menuing system, which is slated to go live in 4.6. To circumvent hiccups when this happens, please duplicate any GetMenuEntries() logic you may have, and move it over into a UK2Node::GetMenuActions() override.

The ui portion of these menu items will be almost exclusively defined through overrides to UK2Node's GetNodeTitle(ENodeTitleType::MenuTitle)/GetMenuCategory()/GetTooltipText()/GetKeywords()/GetPaletteIcon() functions.

You can preview the experimental menu system by switching on the "Use New Blueprint Menuing System" option in the editor's experimental preferences.

Deprecated the old UEdGraphNode::CanPasteHere(), the replacement version just takes a UEdGraph pointer (and utilizes the new UEdGraphNode ::IsCompatibleWithGraph() function)