2016-01-07 08:17:16 -05:00
|
|
|
// Copyright 1998-2016 Epic Games, Inc. All Rights Reserved.
|
2014-03-14 14:13:41 -04:00
|
|
|
|
|
|
|
|
/*=============================================================================
|
|
|
|
|
HTML5TargetPlatform.cpp: Implements the FHTML5TargetPlatform class.
|
|
|
|
|
=============================================================================*/
|
|
|
|
|
|
|
|
|
|
#include "HTML5TargetPlatformPrivatePCH.h"
|
|
|
|
|
|
2015-03-17 09:50:32 -04:00
|
|
|
#if WITH_ENGINE
|
|
|
|
|
#include "DeviceProfiles/DeviceProfile.h"
|
2014-03-14 14:13:41 -04:00
|
|
|
#endif
|
|
|
|
|
|
2015-12-10 16:56:55 -05:00
|
|
|
DEFINE_LOG_CATEGORY_STATIC(LogHTML5TargetPlatform, Log, All);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* Static initialization
|
|
|
|
|
*****************************************************************************/
|
|
|
|
|
|
|
|
|
|
FCriticalSection FHTML5TargetPlatform::DevicesCriticalSection;
|
|
|
|
|
|
2014-03-14 14:13:41 -04:00
|
|
|
/* FHTML5TargetPlatform structors
|
|
|
|
|
*****************************************************************************/
|
|
|
|
|
|
|
|
|
|
FHTML5TargetPlatform::FHTML5TargetPlatform( )
|
|
|
|
|
{
|
2015-07-04 18:45:54 -04:00
|
|
|
RefreshHTML5Setup();
|
2014-03-14 14:13:41 -04:00
|
|
|
#if WITH_ENGINE
|
|
|
|
|
// load up texture settings from the config file
|
2015-03-17 09:50:32 -04:00
|
|
|
HTML5LODSettings = nullptr;
|
2014-03-14 14:13:41 -04:00
|
|
|
StaticMeshLODSettings.Initialize(HTML5EngineSettings);
|
|
|
|
|
#endif
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* ITargetPlatform interface
|
|
|
|
|
*****************************************************************************/
|
|
|
|
|
|
|
|
|
|
void FHTML5TargetPlatform::GetAllDevices( TArray<ITargetDevicePtr>& OutDevices ) const
|
|
|
|
|
{
|
2015-12-10 16:56:55 -05:00
|
|
|
FScopeLock Lock( &DevicesCriticalSection );
|
|
|
|
|
|
2014-03-14 14:13:41 -04:00
|
|
|
OutDevices.Reset();
|
2015-12-10 16:56:55 -05:00
|
|
|
|
|
|
|
|
for( auto Iter = Devices.CreateConstIterator(); Iter; ++Iter )
|
|
|
|
|
{
|
|
|
|
|
OutDevices.Add( Iter.Value() );
|
|
|
|
|
}
|
2014-03-14 14:13:41 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ECompressionFlags FHTML5TargetPlatform::GetBaseCompressionMethod( ) const
|
|
|
|
|
{
|
|
|
|
|
return COMPRESS_ZLIB;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ITargetDevicePtr FHTML5TargetPlatform::GetDefaultDevice( ) const
|
|
|
|
|
{
|
2015-12-10 16:56:55 -05:00
|
|
|
FScopeLock Lock( &DevicesCriticalSection );
|
|
|
|
|
|
|
|
|
|
return Devices.FindRef( DefaultDeviceName );
|
2014-03-14 14:13:41 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ITargetDevicePtr FHTML5TargetPlatform::GetDevice( const FTargetDeviceId& DeviceId )
|
|
|
|
|
{
|
2015-12-10 16:56:55 -05:00
|
|
|
if( DeviceId.GetPlatformName() == this->PlatformName() )
|
|
|
|
|
{
|
|
|
|
|
FScopeLock Lock( &DevicesCriticalSection );
|
|
|
|
|
for( auto MapIt = Devices.CreateIterator(); MapIt; ++MapIt )
|
|
|
|
|
{
|
|
|
|
|
FHTML5TargetDevicePtr& Device = MapIt->Value;
|
|
|
|
|
if( Device->GetName() == DeviceId.GetDeviceName() )
|
2014-03-14 14:13:41 -04:00
|
|
|
{
|
2014-09-02 14:36:52 -04:00
|
|
|
return Device;
|
2014-03-14 14:13:41 -04:00
|
|
|
}
|
2015-12-10 16:56:55 -05:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return nullptr;
|
2014-03-14 14:13:41 -04:00
|
|
|
}
|
|
|
|
|
|
2014-06-20 11:47:12 -04:00
|
|
|
bool FHTML5TargetPlatform::IsSdkInstalled(bool bProjectHasCode, FString& OutDocumentationPath) const
|
|
|
|
|
{
|
2014-10-31 04:31:19 -04:00
|
|
|
#if PLATFORM_WINDOWS
|
2015-07-04 18:45:54 -04:00
|
|
|
FString SDKPath = FPaths::EngineDir() / TEXT("Source") / TEXT("ThirdParty") / TEXT("HTML5") / TEXT("emsdk") / TEXT("Win64");
|
|
|
|
|
#elif PLATFORM_MAC
|
|
|
|
|
FString SDKPath = FPaths::EngineDir() / TEXT("Source") / TEXT("ThirdParty") / TEXT("HTML5") / TEXT("emsdk") / TEXT("Mac");
|
|
|
|
|
#elif PLATFORM_LINUX
|
|
|
|
|
FString SDKPath = FPaths::EngineDir() / TEXT("Source") / TEXT("ThirdParty") / TEXT("HTML5") / TEXT("emsdk") / TEXT("Linux");
|
|
|
|
|
#else
|
|
|
|
|
return;
|
2014-10-31 04:31:19 -04:00
|
|
|
#endif
|
|
|
|
|
|
2015-07-04 18:45:54 -04:00
|
|
|
FString SDKDirectory = FPaths::ConvertRelativePathToFull(SDKPath);
|
|
|
|
|
|
|
|
|
|
if (IFileManager::Get().DirectoryExists(*SDKDirectory))
|
2014-10-31 04:31:19 -04:00
|
|
|
{
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
return false;
|
2014-06-20 11:47:12 -04:00
|
|
|
}
|
|
|
|
|
|
2014-03-14 14:13:41 -04:00
|
|
|
|
|
|
|
|
bool FHTML5TargetPlatform::IsRunningPlatform( ) const
|
|
|
|
|
{
|
|
|
|
|
return false; // but this will never be called because this platform doesn't run the target platform framework
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#if WITH_ENGINE
|
|
|
|
|
|
2015-09-24 23:37:30 -04:00
|
|
|
static FName NAME_GLSL_ES2_WEBGL(TEXT("GLSL_ES2_WEBGL"));
|
2014-03-14 14:13:41 -04:00
|
|
|
|
2014-05-09 08:51:44 -04:00
|
|
|
void FHTML5TargetPlatform::GetAllPossibleShaderFormats( TArray<FName>& OutFormats ) const
|
2014-03-14 14:13:41 -04:00
|
|
|
{
|
2015-09-24 23:37:30 -04:00
|
|
|
OutFormats.AddUnique(NAME_GLSL_ES2_WEBGL);
|
2014-03-14 14:13:41 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
2014-05-09 08:51:44 -04:00
|
|
|
void FHTML5TargetPlatform::GetAllTargetedShaderFormats( TArray<FName>& OutFormats ) const
|
|
|
|
|
{
|
|
|
|
|
GetAllPossibleShaderFormats(OutFormats);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
2014-03-14 14:13:41 -04:00
|
|
|
const class FStaticMeshLODSettings& FHTML5TargetPlatform::GetStaticMeshLODSettings( ) const
|
|
|
|
|
{
|
|
|
|
|
return StaticMeshLODSettings;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void FHTML5TargetPlatform::GetTextureFormats( const UTexture* Texture, TArray<FName>& OutFormats ) const
|
|
|
|
|
{
|
|
|
|
|
FName TextureFormatName = NAME_None;
|
|
|
|
|
|
|
|
|
|
#if WITH_EDITOR
|
|
|
|
|
// Supported texture format names.
|
|
|
|
|
static FName NameDXT1(TEXT("DXT1"));
|
|
|
|
|
static FName NameDXT3(TEXT("DXT3"));
|
|
|
|
|
static FName NameDXT5(TEXT("DXT5"));
|
|
|
|
|
static FName NameDXT5n(TEXT("DXT5n"));
|
|
|
|
|
static FName NameAutoDXT(TEXT("AutoDXT"));
|
|
|
|
|
static FName NameBGRA8(TEXT("BGRA8"));
|
|
|
|
|
static FName NameG8(TEXT("G8"));
|
|
|
|
|
static FName NameRGBA16F(TEXT("RGBA16F"));
|
2014-05-22 09:13:12 -04:00
|
|
|
static FName NameRGBA8(TEXT("RGBA8"));
|
2014-03-14 14:13:41 -04:00
|
|
|
|
|
|
|
|
bool bNoCompression = Texture->CompressionNone // Code wants the texture uncompressed.
|
|
|
|
|
|| (HasEditorOnlyData() && Texture->DeferCompression) // The user wishes to defer compression, this is ok for the Editor only.
|
|
|
|
|
|| (Texture->CompressionSettings == TC_EditorIcon)
|
|
|
|
|
|| (Texture->LODGroup == TEXTUREGROUP_ColorLookupTable) // Textures in certain LOD groups should remain uncompressed.
|
|
|
|
|
|| (Texture->LODGroup == TEXTUREGROUP_Bokeh)
|
|
|
|
|
|| (Texture->LODGroup == TEXTUREGROUP_IESLightProfile)
|
|
|
|
|
|| (Texture->Source.GetSizeX() < 4) // Don't compress textures smaller than the DXT block size.
|
|
|
|
|
|| (Texture->Source.GetSizeY() < 4)
|
|
|
|
|
|| (Texture->Source.GetSizeX() % 4 != 0)
|
|
|
|
|
|| (Texture->Source.GetSizeY() % 4 != 0);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ETextureSourceFormat SourceFormat = Texture->Source.GetFormat();
|
|
|
|
|
|
|
|
|
|
// Determine the pixel format of the (un/)compressed texture
|
|
|
|
|
if (bNoCompression)
|
|
|
|
|
{
|
2014-04-23 17:30:27 -04:00
|
|
|
if (Texture->HasHDRSource())
|
|
|
|
|
{
|
|
|
|
|
TextureFormatName = NameBGRA8;
|
|
|
|
|
}
|
|
|
|
|
else if (SourceFormat == TSF_G8 || Texture->CompressionSettings == TC_Grayscale)
|
|
|
|
|
{
|
|
|
|
|
TextureFormatName = NameG8;
|
|
|
|
|
}
|
|
|
|
|
else if (Texture->LODGroup == TEXTUREGROUP_Shadowmap)
|
|
|
|
|
{
|
|
|
|
|
TextureFormatName = NameG8;
|
|
|
|
|
}
|
2014-09-12 16:47:24 -04:00
|
|
|
else
|
2014-04-23 17:30:27 -04:00
|
|
|
{
|
2015-04-08 14:51:04 -04:00
|
|
|
TextureFormatName = NameRGBA8;
|
2014-04-23 17:30:27 -04:00
|
|
|
}
|
2014-03-14 14:13:41 -04:00
|
|
|
}
|
2015-02-03 18:35:25 -05:00
|
|
|
else if (Texture->CompressionSettings == TC_HDR
|
|
|
|
|
|| Texture->CompressionSettings == TC_HDR_Compressed)
|
2014-03-14 14:13:41 -04:00
|
|
|
{
|
|
|
|
|
TextureFormatName = NameRGBA16F;
|
|
|
|
|
}
|
|
|
|
|
else if (Texture->CompressionSettings == TC_Normalmap)
|
|
|
|
|
{
|
|
|
|
|
TextureFormatName = NameDXT5;
|
|
|
|
|
}
|
|
|
|
|
else if (Texture->CompressionSettings == TC_Displacementmap)
|
|
|
|
|
{
|
|
|
|
|
TextureFormatName = NameG8;
|
|
|
|
|
}
|
|
|
|
|
else if (Texture->CompressionSettings == TC_VectorDisplacementmap)
|
|
|
|
|
{
|
2014-05-22 09:13:12 -04:00
|
|
|
TextureFormatName = NameRGBA8;
|
2014-03-14 14:13:41 -04:00
|
|
|
}
|
|
|
|
|
else if (Texture->CompressionSettings == TC_Grayscale)
|
|
|
|
|
{
|
|
|
|
|
TextureFormatName = NameG8;
|
|
|
|
|
}
|
|
|
|
|
else if( Texture->CompressionSettings == TC_Alpha)
|
|
|
|
|
{
|
|
|
|
|
TextureFormatName = NameDXT5;
|
|
|
|
|
}
|
2014-07-30 15:36:36 -04:00
|
|
|
else if (Texture->CompressionSettings == TC_DistanceFieldFont)
|
|
|
|
|
{
|
|
|
|
|
TextureFormatName = NameG8;
|
|
|
|
|
}
|
2014-03-14 14:13:41 -04:00
|
|
|
else if (Texture->CompressionNoAlpha)
|
|
|
|
|
{
|
|
|
|
|
TextureFormatName = NameDXT1;
|
|
|
|
|
}
|
|
|
|
|
else if (Texture->bDitherMipMapAlpha)
|
|
|
|
|
{
|
|
|
|
|
TextureFormatName = NameDXT5;
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
TextureFormatName = NameAutoDXT;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Some PC GPUs don't support sRGB read from G8 textures (e.g. AMD DX10 cards on ShaderModel3.0)
|
|
|
|
|
// This solution requires 4x more memory but a lot of PC HW emulate the format anyway
|
|
|
|
|
if ((TextureFormatName == NameG8) && Texture->SRGB && !SupportsFeature(ETargetPlatformFeatures::GrayscaleSRGB))
|
|
|
|
|
{
|
|
|
|
|
TextureFormatName = NameBGRA8;
|
|
|
|
|
}
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
OutFormats.Add( TextureFormatName);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
2015-03-17 09:50:32 -04:00
|
|
|
const UTextureLODSettings& FHTML5TargetPlatform::GetTextureLODSettings() const
|
2014-03-14 14:13:41 -04:00
|
|
|
{
|
2015-03-17 09:50:32 -04:00
|
|
|
return *HTML5LODSettings;
|
2014-03-14 14:13:41 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
2014-10-03 14:56:20 -04:00
|
|
|
FName FHTML5TargetPlatform::GetWaveFormat( const USoundWave* Wave ) const
|
2014-03-14 14:13:41 -04:00
|
|
|
{
|
|
|
|
|
static FName NAME_OGG(TEXT("OGG"));
|
|
|
|
|
return NAME_OGG;
|
|
|
|
|
}
|
|
|
|
|
|
2015-01-26 14:52:47 -05:00
|
|
|
#endif // WITH_ENGINE
|
|
|
|
|
|
2015-07-04 18:45:54 -04:00
|
|
|
void FHTML5TargetPlatform::RefreshHTML5Setup()
|
2015-01-26 10:22:57 -05:00
|
|
|
{
|
2015-07-04 18:45:54 -04:00
|
|
|
FString Temp;
|
|
|
|
|
if (!FHTML5TargetPlatform::IsSdkInstalled(true, Temp))
|
|
|
|
|
{
|
|
|
|
|
// nothing to do.
|
|
|
|
|
return;
|
|
|
|
|
}
|
2015-02-20 04:41:01 -05:00
|
|
|
|
2015-12-10 16:56:55 -05:00
|
|
|
// update available devices
|
|
|
|
|
TArray<FString> DeviceMaps;
|
|
|
|
|
GConfig->GetArray( TEXT("/Script/HTML5PlatformEditor.HTML5SDKSettings"), TEXT("DeviceMap"), DeviceMaps, GEngineIni );
|
|
|
|
|
if ( ! DeviceMaps.Num() )
|
2015-01-26 10:22:57 -05:00
|
|
|
{
|
2015-12-10 16:56:55 -05:00
|
|
|
// nuke everything
|
|
|
|
|
FScopeLock Lock( &DevicesCriticalSection );
|
|
|
|
|
for (auto Iter = Devices.CreateIterator(); Iter; ++Iter)
|
2015-01-26 10:22:57 -05:00
|
|
|
{
|
2015-12-10 16:56:55 -05:00
|
|
|
// UE_LOG(LogHTML5TargetPlatform, Log, TEXT("HTML5SDKSettings: count before NUKE %d"), Devices.Num());
|
|
|
|
|
FHTML5TargetDevicePtr Device = Iter->Value;
|
|
|
|
|
Iter.RemoveCurrent();
|
|
|
|
|
DeviceLostEvent.Broadcast(Device.ToSharedRef());
|
|
|
|
|
}
|
|
|
|
|
DefaultDeviceName.Empty();
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
// add or update
|
|
|
|
|
// UE_LOG(LogHTML5TargetPlatform, Log, TEXT("HTML5SDKSettings: count before ADD/UPDATNG %d"), Devices.Num());
|
|
|
|
|
for (auto It : DeviceMaps)
|
|
|
|
|
{
|
|
|
|
|
// UE_LOG(LogHTML5TargetPlatform, Log, TEXT("HTML5SDKSettings: parsing %s"),*It);
|
|
|
|
|
FString DeviceName = "";
|
|
|
|
|
if( FParse::Value( *It, TEXT( "DeviceName=" ), DeviceName ) )
|
2015-01-26 10:22:57 -05:00
|
|
|
{
|
2015-12-10 16:56:55 -05:00
|
|
|
FString DevicePath = "";
|
|
|
|
|
if( FParse::Value( *DeviceName, TEXT( "DevicePath=" ), DevicePath ) )
|
2015-01-26 10:22:57 -05:00
|
|
|
{
|
2015-12-10 16:56:55 -05:00
|
|
|
DevicePath.RemoveFromEnd(TEXT("))"));
|
|
|
|
|
FString FilePath = "";
|
|
|
|
|
if( FParse::Value( *DevicePath, TEXT( "FilePath=" ), FilePath ) )
|
|
|
|
|
{
|
|
|
|
|
if (FPlatformFileManager::Get().GetPlatformFile().FileExists(*DevicePath) ||
|
|
|
|
|
FPlatformFileManager::Get().GetPlatformFile().DirectoryExists(*DevicePath))
|
|
|
|
|
{
|
|
|
|
|
FScopeLock Lock( &DevicesCriticalSection );
|
|
|
|
|
FHTML5TargetDevicePtr& Device = Devices.FindOrAdd( DeviceName );
|
|
|
|
|
|
|
|
|
|
if( Device.IsValid() )
|
|
|
|
|
{
|
|
|
|
|
// UE_LOG(LogHTML5TargetPlatform, Log, TEXT("HTML5SDKSettings: UPDATING %s"),*It);
|
|
|
|
|
DeviceLostEvent.Broadcast(Device.ToSharedRef());
|
|
|
|
|
}
|
|
|
|
|
else
|
2015-01-26 12:02:40 -05:00
|
|
|
{
|
2015-12-10 16:56:55 -05:00
|
|
|
// UE_LOG(LogHTML5TargetPlatform, Log, TEXT("HTML5SDKSettings: ADDING %s"),*It);
|
2015-01-26 12:02:40 -05:00
|
|
|
}
|
2015-12-10 16:56:55 -05:00
|
|
|
Device = MakeShareable( new FHTML5TargetDevice( *this, DeviceName, DevicePath ) );
|
|
|
|
|
DeviceDiscoveredEvent.Broadcast( Device.ToSharedRef() );
|
|
|
|
|
if ( DefaultDeviceName.IsEmpty() )
|
2015-01-26 12:02:40 -05:00
|
|
|
{
|
2015-12-10 16:56:55 -05:00
|
|
|
DefaultDeviceName = DeviceName;
|
|
|
|
|
}
|
2015-01-26 12:02:40 -05:00
|
|
|
}
|
2015-01-26 10:22:57 -05:00
|
|
|
}
|
2015-01-26 12:02:40 -05:00
|
|
|
}
|
2015-01-26 10:22:57 -05:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2015-07-04 18:45:54 -04:00
|
|
|
struct FBrowserLocation
|
|
|
|
|
{
|
|
|
|
|
FString Name;
|
|
|
|
|
FString Path;
|
|
|
|
|
} PossibleLocations[] =
|
2015-01-26 10:22:57 -05:00
|
|
|
{
|
|
|
|
|
#if PLATFORM_WINDOWS
|
2015-07-04 18:45:54 -04:00
|
|
|
{ TEXT("Nightly(64bit)"), TEXT("C:/Program Files/Nightly/firefox.exe") },
|
|
|
|
|
{ TEXT("Nightly"), TEXT("C:/Program Files (x86)/Nightly/firefox.exe") },
|
|
|
|
|
{ TEXT("Firefox"), TEXT("C:/Program Files (x86)/Mozilla Firefox/firefox.exe") },
|
Merging //UE4/Release-4.11 to //UE4/Main (up to CL#2852902)
==========================
MAJOR FEATURES + CHANGES
==========================
Change 2835191 on 2016/01/19 by Nick.Whiting
Invert the y-axis on the SteamVR controllers to match the convention of the engine and the rest of the gamepads
#jira UE-22705
Change 2835686 on 2016/01/20 by Gareth.Martin
Fixed landscape material instances not being updated if holes are painted on a landscape that doesn't have the landscape visibility mask node in the material and then the visibility mask node is added to the material later.
#jira UE-18187
Change 2835767 on 2016/01/20 by Richard.Hinckley
#jira UE-25499 Added a cursor to TopDown template (C++ version) to match the BP version.
Change 2835772 on 2016/01/20 by Richard.Hinckley
#jira UE-25499 Adding the material asset for the C++ TopDown template's cursor.
Change 2835811 on 2016/01/20 by Taizyd.Korambayil
#jira UE-25699 Added Validity Checks in BP logic, unchecked CDO for Pixel Ship, to Fix Log Warnings
#jira UE-25704 Adjusted Matinee to happen at Box Location
#jira UE-25688 Adjusted Player Starts
#jira UE-25693 Adjusted Player Starts
Change 2835863 on 2016/01/20 by Gareth.Martin
Fixed crash in the landscape ramp and mirror tools if the streaming level containing the landscape is hidden (or possibly if the landscape actor is deleted)
#jira UE-24883
Change 2835889 on 2016/01/20 by Taizyd.Korambayil
#jira UE-25698 Enabled V-sync, also fixed up player Respawn Issue
Change 2835995 on 2016/01/20 by Jamie.Dale
The output log now hard-wraps lines to prevent long lines causing performance issues
#jira UE-24187
Change 2836052 on 2016/01/20 by Taizyd.Korambayil
#jira UE-25675 Added Blocking Volume to prevent Player from Falling off map
#jira UE-25676 Added Blocking Volumes so that the Player doesn't get stucl at awkward corners under the Bridge
Change 2836137 on 2016/01/20 by Chad.Taylor
Vehicle and VehicleAdv template content fixes for new VR camera
#jira UE-25507
Change 2836166 on 2016/01/20 by Gareth.Martin
Fixed hiding a streaming level containing a landscape causing the landscape editor to switch to the "New Landscape" tool instead of exiting
#jira UE-25093
Change 2836174 on 2016/01/20 by Chad.Taylor
IHeadMountedDisplay crash fix associated with accessing a dangling pointer.
#jira UE-25272
Change 2836179 on 2016/01/20 by Jamie.Dale
Optimized FShapedGlyphSequence reverse look-up
There's now a reverse look-up map of cluster indices to their glyph data in order to avoid brute force looping
#jira UE-24187
Change 2836286 on 2016/01/20 by Chris.Babcock
Update Qualcomm TextureConverter for OSX
#jira UE-22092
#ue4
#android
Change 2836328 on 2016/01/20 by Nick.Darnell
Fixing a problem with widget components crashing on destruction with the render commands to pre/post render for window render commands needing access to the policy, but it potentially being deleted. Inserting a NoOp command that keeps the shared ptr alive through the RHI render process.
#jira UE-25752
Change 2836342 on 2016/01/20 by Nick.Darnell
Depending on shutdown order, the Slate Renderer may go away, and then render data handles may not be collected correctly because they are trying to reference a pointer that's no longer valid and cause a crash on exit. The correct approach would be to have render handles actually have a pointer back to who owns them, in this case the RHI Resource Manager, which is still alive and well at this point in the pipeline. Then if the resource manager is collected, it forces all handles to get cleaned up correctly, or if the handles are collected first, they can be sure they've got a valid pointer back to the resource manager.
#jira UE-25753
Change 2836358 on 2016/01/20 by Taizyd.Korambayil
#jira UE-25710 Replaced Deprecated Nodes
Change 2836510 on 2016/01/20 by Taizyd.Korambayil
#jira UE-25718 Adjsuted BP to make pointer decal rotate in the direction of surface
Change 2836564 on 2016/01/20 by Taizyd.Korambayil
#jira UE-25716 Added bool to store last Moved Direction
Change 2836697 on 2016/01/20 by Taizyd.Korambayil
#jira UE-25740 Removed unused VR Nodes to remove Log errors on Mac
Change 2836725 on 2016/01/20 by Peter.Sauerbrei
workaround for thread race when trying to release the TargetDeviceService endpoint after an unclaim message is sent
#jira UE-25123
Change 2836782 on 2016/01/20 by Jamie.Dale
Added FTextLayout::AddLines
This is similar to AddLine, however it allows you to add multiple lines in a single call, thus avoiding the re-justification cost associated with each call to AddLine.
AddLine has also been changed to take the same structure type as AddLines (which takes an array of these structures), and the existing version of AddLine has been deprecated.
#jira UE-24187
Change 2836801 on 2016/01/20 by Jeff.Campeau
[CL 2857187 by Matthew Griffin in Main branch]
2016-02-05 11:54:00 -05:00
|
|
|
{ TEXT("Chrome"), TEXT("C:/Program Files (x86)/Google/Chrome/Application/chrome.exe") },
|
2015-01-26 10:22:57 -05:00
|
|
|
#elif PLATFORM_MAC
|
2015-07-04 18:45:54 -04:00
|
|
|
{ TEXT("Safari"), TEXT("/Applications/Safari.app") },
|
|
|
|
|
{ TEXT("Firefox"), TEXT("/Applications/Firefox.app") },
|
|
|
|
|
{ TEXT("Chrome"), TEXT("/Applications/Google Chrome.app") },
|
|
|
|
|
#elif PLATFORM_LINUX
|
|
|
|
|
{ TEXT("Firefox"), TEXT("/usr/bin/firefox") },
|
|
|
|
|
#else
|
|
|
|
|
{ TEXT("Firefox"), TEXT("") },
|
|
|
|
|
#endif
|
2015-02-20 04:41:01 -05:00
|
|
|
};
|
|
|
|
|
|
2015-07-04 18:45:54 -04:00
|
|
|
// Add default devices..
|
|
|
|
|
for (const auto& Loc : PossibleLocations)
|
|
|
|
|
{
|
|
|
|
|
if (FPlatformFileManager::Get().GetPlatformFile().FileExists(*Loc.Path) || FPlatformFileManager::Get().GetPlatformFile().DirectoryExists(*Loc.Path))
|
|
|
|
|
{
|
2015-12-10 16:56:55 -05:00
|
|
|
FScopeLock Lock( &DevicesCriticalSection );
|
|
|
|
|
|
|
|
|
|
FHTML5TargetDevicePtr& Device = Devices.FindOrAdd( *Loc.Name );
|
|
|
|
|
|
|
|
|
|
if( !Device.IsValid() )
|
|
|
|
|
{
|
|
|
|
|
Device = MakeShareable( new FHTML5TargetDevice( *this, *Loc.Name, *Loc.Path ) );
|
2015-07-04 18:45:54 -04:00
|
|
|
DeviceDiscoveredEvent.Broadcast(Device.ToSharedRef());
|
2015-12-10 16:56:55 -05:00
|
|
|
}
|
2015-07-04 18:45:54 -04:00
|
|
|
}
|
|
|
|
|
}
|
2015-02-20 04:41:01 -05:00
|
|
|
}
|