You've already forked UnrealEngineUWP
mirror of
https://github.com/izzy2lost/UnrealEngineUWP.git
synced 2026-03-26 18:15:20 -07:00
#lockdown Nick.Penwarden
#rb None
==========================
MAJOR FEATURES + CHANGES
==========================
Change 3156770 on 2016/10/10 by Allan.Bentham
Fix VULKAN_ENABLE_API_DUMP build on android.
Change 3157838 on 2016/10/11 by Allan.Bentham
Fix Vulkan API tracing on android.
Change 3170713 on 2016/10/21 by Steve.Cano
Adding the "Optional Mobile Features BP Library" plugin to explose Blueprint functions for Sound Volume, Battery level, system temperature (only available on android), and Headphones being plugged in
#jira UE-30896
#android
#ios
#ue4
Change 3171064 on 2016/10/21 by Steve.Cano
Plugins to provide a common interface and Android implemenation for providing access to GPS / Location data from Blueprints
#ue4
#android
#jira UE-35917
Change 3171065 on 2016/10/21 by Steve.Cano
IOS implementation of LocationServices plugin to provide access to location data in Blueprints
#ue4
#ios
#jira UE-35917
Change 3181802 on 2016/11/01 by Steve.Cano
Fix an issue introduced in CL 3170713 - Adding new config section to RequiredSections list so that we can generate projects successfully.
#jira UE-30896
#ios
Change 3181807 on 2016/11/01 by Steve.Cano
Make sure to clear out references to our eglSurface when we destroy it, else we will try to set our context with an invalid surface.
#jira UE-35004
#android
#ue4
Change 3184827 on 2016/11/03 by Allan.Bentham
Do not HDR32 encode for views without view family.
TranslucentAlphaOnly blend mode now works with encoding.
#jira UE-37951
Change 3186684 on 2016/11/04 by Jack.Porter
Merging //UE4/Dev-Main to Dev-Mobile (//UE4/Dev-Mobile)
Change 3188693 on 2016/11/07 by Chris.Babcock
Corrections to memory stats for Android
#jira WEX-3760
#ue4
#android
Change 3191538 on 2016/11/09 by Allan.Bentham
Mobile tonemapper can use CVarTonemapperOverride
Change 3192575 on 2016/11/09 by Chris.Babcock
Support placing UE4Game files in ExternalFilesDir for automatic cleanup on uninstall for distribution packages
#jira UEPLAT-1422
#ue4
#android
Change 3196231 on 2016/11/13 by Jack.Porter
Merging //UE4/Dev-Main to Dev-Mobile (//UE4/Dev-Mobile)
Change 3196538 on 2016/11/14 by Jack.Porter
Fix issue where lighting would not build for the first editor session of projects defaulting to MobileHDR=false as HardwareTargetingModule didn't set cvars
#jira UE-38507
Change 3198068 on 2016/11/15 by Dmitriy.Dyomin
Fixed android console command sender to work with ADB version 1.0.36
#jira UE-35171
Change 3200230 on 2016/11/16 by Jack.Porter
Remove mosaic resolution limitation on ES3 devices
#jira WEX-3119
Change 3201251 on 2016/11/16 by Chris.Babcock
Fix Android compile error
Change 3203542 on 2016/11/18 by Jack.Porter
Merging //UE4/Dev-Main to Dev-Mobile (//UE4/Dev-Mobile)
Change 3205598 on 2016/11/21 by Dmitriy.Dyomin
Fixed: Missing selection outline in editor ES2 preview
#jira UE-6458
Change 3205622 on 2016/11/21 by Dmitriy.Dyomin
Fix ES2 build error from CL# 3205598
Change 3207232 on 2016/11/22 by Dmitriy.Dyomin
ES2 GLSL generated shader simplifications
Change 3208608 on 2016/11/23 by Dmitriy.Dyomin
Fixed: Landscape Grasstype warning causes log spam when landscape is streamed in or out
#jira UE-38694
Change 3209135 on 2016/11/23 by Alicia.Cano
Packaging for iOS fails due to several invalid object type errors
#jira UE-38431
#ios
Change 3209822 on 2016/11/24 by Jack.Porter
IWYU changes for LocationServicesBPLibrary
Change 3209824 on 2016/11/24 by Jack.Porter
Merging //UE4/Dev-Main to Dev-Mobile (//UE4/Dev-Mobile)
Change 3210264 on 2016/11/25 by Jack.Porter
Fix unicode compile issue on Korean windows
Change 3210268 on 2016/11/25 by Jack.Porter
IWYU and unicode fixes to Dev-Mobile
Change 3211800 on 2016/11/28 by Allan.Bentham
Create and set PrimitiveSceneProxy->PrimitiveSceneInfo before SetTransform render thread command is enqueued. Avoids race condition with FPrimitiveSceneInfo's constructor which can occur on out-of-order CPUs.
Change 3212621 on 2016/11/28 by Jack.Porter
More IWYU fixes.
Change 3213080 on 2016/11/29 by Allan.Bentham
enable UseSingleSampleShadowFromStationaryLights on mobile.
PR #2990: Fixes single sample shadows for mobile. (Contributed by kallehamalainen)
Change 3213164 on 2016/11/29 by Jack.Porter
Win32 IWYU fix
Change 3213932 on 2016/11/29 by Chris.Babcock
Fix handling of ETC2 filtering by Google Play Store (if only ETC2, require ES3.0+ but don't use texture filtering in manifest)
#jira UE-39120
#ue4
#android
Change 3214563 on 2016/11/29 by Dmitriy.Dyomin
Disable dynamic buffer discarding on Adreno330 (was casuing 10ms stalls on slate buffers update)
Change 3214571 on 2016/11/29 by Dmitriy.Dyomin
Custom stencil on Mobile
#jira UEMOB-183
Change 3214641 on 2016/11/30 by Dmitriy.Dyomin
Disable distance culling when rendering image for world composition
#jira UE-37754
Change 3214656 on 2016/11/30 by Jack.Porter
Merging //UE4/Dev-Main to Dev-Mobile (//UE4/Dev-Mobile)
Change 3218479 on 2016/12/01 by Jack.Porter
Fix for Vulkan build error when using AutoSDK
Change 3218596 on 2016/12/02 by Dmitriy.Dyomin
Fixed: Android split screen multiplayer does not function or render correctly
#jira UE-35204
Change 3218874 on 2016/12/02 by Allan.Bentham
Fix CSM shadow bug when ES3.1 + mobileHDR == false.
Fix inverted culling when rendering shadow depths with mobilehdr == false
#jira UE-39111
Change 3220911 on 2016/12/04 by Jack.Porter
Fixed landscape duplicated GUID detection and crash when one of the landscapes is in a hidden streaming level
Change 3220935 on 2016/12/04 by Jack.Porter
Merging //UE4/Dev-Main to Dev-Mobile (//UE4/Dev-Mobile)
Change 3222831 on 2016/12/05 by Dmitriy.Dyomin
Added support for MGD and Andreno profilers
#jira UEMOB-184
Change 3222843 on 2016/12/05 by Jack.Porter
Fixed bug caused by CL 3196538 causing r.MobileHDR to toggle and crash when opening render settings
#jira UE-38507
Change 3222934 on 2016/12/06 by Jack.Porter
Android graphics debugger text changes
Change 3223042 on 2016/12/06 by Dmitriy.Dyomin
Fixed: missing GPU particles in LDR mode on device
#jira UE-39363
Change 3223043 on 2016/12/06 by Jack.Porter
Fixed logspam warnings from TcpMessaging launching on Android
#jira UE-37895
Change 3223046 on 2016/12/06 by Allan.Bentham
Move ES3.1 preview mode out of experimental.
Add per device quality level preview to ES3.1 preview sub menu when project settings allow.
#jira UEMOB-178
Change 3223113 on 2016/12/06 by Allan.Bentham
changed MOBILE_EMULATION define for METAL_PROFILE on mac. fixes issues with editor primitive rendering with ES3.1 feature level preview.
added -featureleveles2/31 commandline support to metalrhi.
Change 3223117 on 2016/12/06 by Allan.Bentham
Initialise FPrimitiveSceneInfo::CachedReflectionCaptureProxies
Change 3223131 on 2016/12/06 by Allan.Bentham
Fix translucency rendering when mobilehdr == false. (Disable mod shadows when mobilehdr == false.)
#jira UE-38343
Change 3223162 on 2016/12/06 by Jack.Porter
Disallow Absolute World Position with "excluding shader offset" on ES2
#jra UE-25555
Change 3223204 on 2016/12/06 by Jack.Porter
Fix for unable to save levels when landscape components with tessellation moved to another level
#jira UE-39372
Change 3223677 on 2016/12/06 by Chris.Babcock
Fix tabs
Change 3224139 on 2016/12/06 by Chris.Babcock
Support modification of build.xml and add post import additions to GameActivity
#jira UE-31372
#PR #2440
#ue4
#android
Change 3224152 on 2016/12/06 by Chris.Babcock
Add support for MadCatz C.T.R.L.R Android controller models
#ue4
#android
Change 3224162 on 2016/12/06 by Chris.Babcock
Driver bug fix and using separate context for MediaPlayer14 (contributed by BrianHarris)
#jira UE-35825
#PR #2787
#ue4
#android
Change 3224581 on 2016/12/07 by Dmitriy.Dyomin
Fixed black screen regression on iOS OpenGL
Also now reporting shader compiler errors in iOS
Change 3224589 on 2016/12/07 by Allan.Bentham
Increase mobile renderer's maximum CSM cascade limit to 4 and introduce max shadow cascade cvar for mobile which defaults to 2 retaining existing behaviour.
#jira UEMOB-187
Change 3224774 on 2016/12/07 by Jack.Porter
Added flags for mobile shader permutation reduction
Renamed mobile lighting policies to better describe them
Set flags to remove policies not used by SunTemple - saves 22MB package size on Android
#jira: UEMOB-179
Change 3224782 on 2016/12/07 by Allan.Bentham
Add project option to set maximum supported CSM cascades to mobile renderer.
#jira UEMOB-187
Change 3224943 on 2016/12/07 by Dmitriy.Dyomin
Metal iOS will use sRGB textures
#jira UEMOB-189
Change 3225098 on 2016/12/07 by Dmitriy.Dyomin
fix for compile error from 3224943
Change 3225188 on 2016/12/07 by Chris.Babcock
Fix #includes in deferred Android OpenGL
#jira UE-39440
#ue4
#android
Change 3226402 on 2016/12/07 by Dmitriy.Dyomin
Fixed: wrong condition for r8 srgb on mac
#jira UE-39471
Change 3226485 on 2016/12/08 by Dmitriy.Dyomin
Fixed: Rendering Artifacts and invisible objects in Fortnite
regression from nobile custom stencil changes
#jira UE-39452, UE-39455
Change 3226637 on 2016/12/08 by Dmitriy.Dyomin
Fixed: Odin Ensure Texture passed to ClearDepthStencil is not what is currently set as RenderTarget
#jira UE-39482
Change 3226922 on 2016/12/08 by Jack.Porter
Merging //UE4/Dev-Main to Dev-Mobile (//UE4/Dev-Mobile)
Change 3227353 on 2016/12/08 by Chris.Babcock
Remove CopyVisualizers batch call again
Change 3228013 on 2016/12/08 By Chris.Babcock
Merging //UE4/Dev-Main to Dev-Mobile (//UE4/Dev-Mobile)
[CL 3228374 by Jack Porter in Main branch]
324 lines
13 KiB
C++
324 lines
13 KiB
C++
// Copyright 1998-2017 Epic Games, Inc. All Rights Reserved.
|
|
|
|
#include "HardwareTargetingModule.h"
|
|
#include "HAL/FileManager.h"
|
|
#include "Modules/ModuleManager.h"
|
|
#include "UObject/UnrealType.h"
|
|
#include "GameMapsSettings.h"
|
|
#include "GameFramework/InputSettings.h"
|
|
#include "Widgets/DeclarativeSyntaxSupport.h"
|
|
#include "Textures/SlateIcon.h"
|
|
#include "EditorStyleSet.h"
|
|
#include "ISettingsModule.h"
|
|
#include "Widgets/SWidget.h"
|
|
#include "SDecoratedEnumCombo.h"
|
|
|
|
#include "Engine/RendererSettings.h"
|
|
#include "Widgets/SToolTip.h"
|
|
#include "IDocumentation.h"
|
|
#include "Settings/EditorProjectSettings.h"
|
|
|
|
#define LOCTEXT_NAMESPACE "HardwareTargeting"
|
|
|
|
|
|
//////////////////////////////////////////////////////////////////////////
|
|
// FMetaSettingGatherer
|
|
|
|
struct FMetaSettingGatherer
|
|
{
|
|
FTextBuilder DescriptionBuffer;
|
|
|
|
TMap<UObject*, FTextBuilder> DescriptionBuffers;
|
|
TMap<UObject*, FText> CategoryNames;
|
|
|
|
// Are we just displaying what would change, or actually changing things?
|
|
bool bReadOnly;
|
|
|
|
bool bIncludeUnmodifiedProperties;
|
|
|
|
FMetaSettingGatherer()
|
|
: bReadOnly(false)
|
|
, bIncludeUnmodifiedProperties(false)
|
|
{
|
|
}
|
|
|
|
void AddEntry(UObject* SettingsObject, UProperty* Property, FText NewValue, bool bModified)
|
|
{
|
|
if (bModified || bIncludeUnmodifiedProperties)
|
|
{
|
|
FTextBuilder& SettingsDescriptionBuffer = DescriptionBuffers.FindOrAdd(SettingsObject);
|
|
|
|
if (!bReadOnly)
|
|
{
|
|
FPropertyChangedEvent ChangeEvent(Property, EPropertyChangeType::ValueSet);
|
|
SettingsObject->PostEditChangeProperty(ChangeEvent);
|
|
}
|
|
else
|
|
{
|
|
FText SettingDisplayName = Property->GetDisplayNameText();
|
|
|
|
FFormatNamedArguments Args;
|
|
Args.Add(TEXT("SettingName"), SettingDisplayName);
|
|
Args.Add(TEXT("SettingValue"), NewValue);
|
|
|
|
FText FormatString = bModified ?
|
|
LOCTEXT("MetaSettingDisplayStringModified", "{SettingName} is {SettingValue} <HardwareTargets.Strong>(modified)</>") :
|
|
LOCTEXT("MetaSettingDisplayStringUnmodified", "{SettingName} is {SettingValue}");
|
|
|
|
SettingsDescriptionBuffer.AppendLine(FText::Format(FormatString, Args));
|
|
}
|
|
}
|
|
}
|
|
|
|
template <typename ValueType>
|
|
static FText ValueToString(ValueType Value);
|
|
|
|
bool Finalize()
|
|
{
|
|
check(!bReadOnly);
|
|
|
|
bool bSuccess = true;
|
|
for (auto& Pair : DescriptionBuffers)
|
|
{
|
|
const FString Filename = Pair.Key->GetDefaultConfigFilename();
|
|
const FDateTime BeforeTime = IFileManager::Get().GetTimeStamp(*Filename);
|
|
|
|
Pair.Key->UpdateDefaultConfigFile();
|
|
|
|
const FDateTime AfterTime = IFileManager::Get().GetTimeStamp(*Filename);
|
|
bSuccess = BeforeTime != AfterTime && bSuccess;
|
|
}
|
|
|
|
return bSuccess;
|
|
}
|
|
};
|
|
|
|
|
|
template <>
|
|
FText FMetaSettingGatherer::ValueToString(bool Value)
|
|
{
|
|
return Value ? LOCTEXT("BoolEnabled", "enabled") : LOCTEXT("BoolDisabled", "disabled");
|
|
}
|
|
|
|
template <>
|
|
FText FMetaSettingGatherer::ValueToString(EAntiAliasingMethod Value)
|
|
{
|
|
switch (Value)
|
|
{
|
|
case AAM_None:
|
|
return LOCTEXT("AA_None", "None");
|
|
case AAM_FXAA:
|
|
return LOCTEXT("AA_FXAA", "FXAA");
|
|
case AAM_TemporalAA:
|
|
return LOCTEXT("AA_TemporalAA", "Temporal AA");
|
|
case AAM_MSAA:
|
|
return LOCTEXT("AA_MSAA", "MSAA");
|
|
default:
|
|
return FText::AsNumber((int32)Value);
|
|
}
|
|
}
|
|
|
|
static FName HardwareTargetingConsoleVariableMetaFName(TEXT("ConsoleVariable"));
|
|
|
|
#define UE_META_SETTING_ENTRY(Builder, Class, PropertyName, TargetValue) \
|
|
{ \
|
|
Class* SettingsObject = GetMutableDefault<Class>(); \
|
|
bool bModified = SettingsObject->PropertyName != (TargetValue); \
|
|
UProperty* Property = FindFieldChecked<UProperty>(Class::StaticClass(), GET_MEMBER_NAME_CHECKED(Class, PropertyName)); \
|
|
if (!Builder.bReadOnly) { \
|
|
FString CVarName = Property->GetMetaData(HardwareTargetingConsoleVariableMetaFName); \
|
|
if (!CVarName.IsEmpty()) { IConsoleVariable* CVar = IConsoleManager::Get().FindConsoleVariable(*CVarName); \
|
|
if (CVar) { CVar->Set(TargetValue, ECVF_SetByProjectSetting); } } \
|
|
SettingsObject->PropertyName = (TargetValue); } \
|
|
Builder.AddEntry(SettingsObject, Property, FMetaSettingGatherer::ValueToString(TargetValue), bModified); \
|
|
}
|
|
|
|
//////////////////////////////////////////////////////////////////////////
|
|
// FHardwareTargetingModule
|
|
|
|
class FHardwareTargetingModule : public IHardwareTargetingModule
|
|
{
|
|
public:
|
|
// IModuleInterface interface
|
|
virtual void StartupModule() override;
|
|
virtual void ShutdownModule() override;
|
|
// End of IModuleInterface interface
|
|
|
|
// IHardwareTargetingModule interface
|
|
virtual void ApplyHardwareTargetingSettings() override;
|
|
virtual TArray<FModifiedDefaultConfig> GetPendingSettingsChanges() override;
|
|
virtual TSharedRef<SWidget> MakeHardwareClassTargetCombo(FOnHardwareClassChanged OnChanged, TAttribute<EHardwareClass::Type> SelectedEnum) override;
|
|
virtual TSharedRef<SWidget> MakeGraphicsPresetTargetCombo(FOnGraphicsPresetChanged OnChanged, TAttribute<EGraphicsPreset::Type> SelectedEnum) override;
|
|
// End of IHardwareTargetingModule interface
|
|
|
|
private:
|
|
void GatherSettings(FMetaSettingGatherer& Builder);
|
|
};
|
|
|
|
void FHardwareTargetingModule::StartupModule()
|
|
{
|
|
ISettingsModule* SettingsModule = FModuleManager::GetModulePtr<ISettingsModule>("Settings");
|
|
|
|
if (SettingsModule != nullptr)
|
|
{
|
|
SettingsModule->RegisterSettings("Project", "Project", "HardwareTargeting",
|
|
LOCTEXT("HardwareTargetingSettingsName", "Target Hardware"),
|
|
LOCTEXT("HardwareTargetingSettingsDescription", "Options for choosing which class of hardware to target"),
|
|
GetMutableDefault<UHardwareTargetingSettings>()
|
|
);
|
|
}
|
|
|
|
// Apply any settings on startup if necessary
|
|
ApplyHardwareTargetingSettings();
|
|
}
|
|
|
|
void FHardwareTargetingModule::ShutdownModule()
|
|
{
|
|
}
|
|
|
|
TArray<FModifiedDefaultConfig> FHardwareTargetingModule::GetPendingSettingsChanges()
|
|
{
|
|
// Gather and stringify the modified settings
|
|
FMetaSettingGatherer Gatherer;
|
|
Gatherer.bReadOnly = true;
|
|
Gatherer.bIncludeUnmodifiedProperties = true;
|
|
GatherSettings(Gatherer);
|
|
|
|
TArray<FModifiedDefaultConfig> OutArray;
|
|
for (auto& Pair : Gatherer.DescriptionBuffers)
|
|
{
|
|
FModifiedDefaultConfig ModifiedConfig;
|
|
ModifiedConfig.SettingsObject = Pair.Key;
|
|
ModifiedConfig.Description = Pair.Value.ToText();
|
|
ModifiedConfig.CategoryHeading = Gatherer.CategoryNames.FindChecked(Pair.Key);
|
|
|
|
OutArray.Add(ModifiedConfig);
|
|
}
|
|
return OutArray;
|
|
}
|
|
|
|
void FHardwareTargetingModule::GatherSettings(FMetaSettingGatherer& Builder)
|
|
{
|
|
UHardwareTargetingSettings* Settings = GetMutableDefault<UHardwareTargetingSettings>();
|
|
|
|
|
|
if (Builder.bReadOnly)
|
|
{
|
|
// Force the category order and give nice descriptions
|
|
Builder.CategoryNames.Add(GetMutableDefault<URendererSettings>(), LOCTEXT("RenderingCategoryHeader", "Engine - Rendering"));
|
|
Builder.CategoryNames.Add(GetMutableDefault<UInputSettings>(), LOCTEXT("InputCategoryHeader", "Engine - Input"));
|
|
Builder.CategoryNames.Add(GetMutableDefault<UGameMapsSettings>(), LOCTEXT("MapsAndModesCategoryHeader", "Project - Maps & Modes"));
|
|
Builder.CategoryNames.Add(GetMutableDefault<ULevelEditor2DSettings>(), LOCTEXT("EditorSettings2D", "Editor - 2D"));
|
|
}
|
|
|
|
|
|
const bool bLowEndMobile = (Settings->TargetedHardwareClass == EHardwareClass::Mobile) && (Settings->DefaultGraphicsPerformance == EGraphicsPreset::Scalable);
|
|
const bool bAnyMobile = (Settings->TargetedHardwareClass == EHardwareClass::Mobile);
|
|
const bool bHighEndMobile = (Settings->TargetedHardwareClass == EHardwareClass::Mobile) && (Settings->DefaultGraphicsPerformance == EGraphicsPreset::Maximum);
|
|
const bool bAnyPC = (Settings->TargetedHardwareClass == EHardwareClass::Desktop);
|
|
const bool bHighEndPC = (Settings->TargetedHardwareClass == EHardwareClass::Desktop) && (Settings->DefaultGraphicsPerformance == EGraphicsPreset::Maximum);
|
|
const bool bAnyScalable = Settings->DefaultGraphicsPerformance == EGraphicsPreset::Scalable;
|
|
|
|
{
|
|
// Based roughly on https://docs.unrealengine.com/latest/INT/Platforms/Mobile/PostProcessEffects/index.html
|
|
UE_META_SETTING_ENTRY(Builder, URendererSettings, bMobileHDR, !bLowEndMobile);
|
|
|
|
// Bloom works and isn't terribly expensive on anything beyond low-end
|
|
UE_META_SETTING_ENTRY(Builder, URendererSettings, bDefaultFeatureBloom, !bLowEndMobile);
|
|
|
|
// Separate translucency does nothing in the ES2 renderer
|
|
UE_META_SETTING_ENTRY(Builder, URendererSettings, bSeparateTranslucency, !bAnyMobile);
|
|
|
|
// Motion blur, auto-exposure, and ambient occlusion don't work in the ES2 renderer
|
|
UE_META_SETTING_ENTRY(Builder, URendererSettings, bDefaultFeatureMotionBlur, bHighEndPC);
|
|
UE_META_SETTING_ENTRY(Builder, URendererSettings, bDefaultFeatureAutoExposure, bHighEndPC);
|
|
UE_META_SETTING_ENTRY(Builder, URendererSettings, bDefaultFeatureAmbientOcclusion, bAnyPC);
|
|
|
|
// lens flare doesn't work in the ES2 renderer, the quality is low and the feature is controversial
|
|
UE_META_SETTING_ENTRY(Builder, URendererSettings, bDefaultFeatureLensFlare, false);
|
|
|
|
// DOF and AA work on mobile but are expensive, keeping them off by default
|
|
//@TODO: DOF setting doesn't exist yet
|
|
// UE_META_SETTING_ENTRY(Builder, URendererSettings, bDefaultFeatureDepthOfField, bHighEndPC);
|
|
UE_META_SETTING_ENTRY(Builder, URendererSettings, DefaultFeatureAntiAliasing, bHighEndPC ? AAM_TemporalAA : AAM_None);
|
|
}
|
|
|
|
{
|
|
// Mobile uses touch
|
|
UE_META_SETTING_ENTRY(Builder, UInputSettings, bUseMouseForTouch, bAnyMobile);
|
|
//@TODO: Use bAlwaysShowTouchInterface (sorta implied by bUseMouseForTouch)?
|
|
}
|
|
|
|
{
|
|
// Tablets or phones are usually shared-screen multiplayer instead of split-screen
|
|
UE_META_SETTING_ENTRY(Builder, UGameMapsSettings, bUseSplitscreen, bAnyPC);
|
|
}
|
|
}
|
|
|
|
void FHardwareTargetingModule::ApplyHardwareTargetingSettings()
|
|
{
|
|
UHardwareTargetingSettings* Settings = GetMutableDefault<UHardwareTargetingSettings>();
|
|
|
|
// Apply the settings if they've changed
|
|
if (Settings->HasPendingChanges())
|
|
{
|
|
// Gather and apply the modified settings
|
|
FMetaSettingGatherer Builder;
|
|
Builder.bReadOnly = false;
|
|
GatherSettings(Builder);
|
|
|
|
const bool bSuccess = Builder.Finalize();
|
|
|
|
// Write out the 'did we apply' values
|
|
if (bSuccess)
|
|
{
|
|
Settings->AppliedTargetedHardwareClass = Settings->TargetedHardwareClass;
|
|
Settings->AppliedDefaultGraphicsPerformance = Settings->DefaultGraphicsPerformance;
|
|
Settings->UpdateDefaultConfigFile();
|
|
}
|
|
}
|
|
}
|
|
|
|
TSharedRef<SWidget> FHardwareTargetingModule::MakeHardwareClassTargetCombo(FOnHardwareClassChanged OnChanged, TAttribute<EHardwareClass::Type> SelectedEnum)
|
|
{
|
|
TArray<SDecoratedEnumCombo<EHardwareClass::Type>::FComboOption> HardwareClassInfo;
|
|
HardwareClassInfo.Add(SDecoratedEnumCombo<EHardwareClass::Type>::FComboOption(
|
|
EHardwareClass::Unspecified, FSlateIcon(FEditorStyle::GetStyleSetName(), "HardwareTargeting.HardwareUnspecified"), LOCTEXT("UnspecifiedCaption", "Unspecified"), false));
|
|
HardwareClassInfo.Add(SDecoratedEnumCombo<EHardwareClass::Type>::FComboOption(
|
|
EHardwareClass::Desktop, FSlateIcon(FEditorStyle::GetStyleSetName(), "HardwareTargeting.DesktopPlatform"), LOCTEXT("DesktopCaption", "Desktop / Console")));
|
|
HardwareClassInfo.Add(SDecoratedEnumCombo<EHardwareClass::Type>::FComboOption(
|
|
EHardwareClass::Mobile, FSlateIcon(FEditorStyle::GetStyleSetName(), "HardwareTargeting.MobilePlatform"), LOCTEXT("MobileCaption", "Mobile / Tablet")));
|
|
|
|
return SNew(SDecoratedEnumCombo<EHardwareClass::Type>, MoveTemp(HardwareClassInfo))
|
|
.SelectedEnum(SelectedEnum)
|
|
.OnEnumChanged(OnChanged)
|
|
.ToolTip(IDocumentation::Get()->CreateToolTip(LOCTEXT("HardwareClassTooltip", "Choose the overall class of hardware to target (desktop/console or mobile/tablet)."), NULL, TEXT("Shared/Editor/Settings/TargetHardware"), TEXT("HardwareClass")));
|
|
}
|
|
|
|
TSharedRef<SWidget> FHardwareTargetingModule::MakeGraphicsPresetTargetCombo(FOnGraphicsPresetChanged OnChanged, TAttribute<EGraphicsPreset::Type> SelectedEnum)
|
|
{
|
|
TArray<SDecoratedEnumCombo<EGraphicsPreset::Type>::FComboOption> GraphicsPresetInfo;
|
|
GraphicsPresetInfo.Add(SDecoratedEnumCombo<EGraphicsPreset::Type>::FComboOption(
|
|
EGraphicsPreset::Unspecified, FSlateIcon(FEditorStyle::GetStyleSetName(), "HardwareTargeting.GraphicsUnspecified"), LOCTEXT("UnspecifiedCaption", "Unspecified"), false));
|
|
GraphicsPresetInfo.Add(SDecoratedEnumCombo<EGraphicsPreset::Type>::FComboOption(
|
|
EGraphicsPreset::Maximum, FSlateIcon(FEditorStyle::GetStyleSetName(), "HardwareTargeting.MaximumQuality"), LOCTEXT("MaximumCaption", "Maximum Quality")));
|
|
GraphicsPresetInfo.Add(SDecoratedEnumCombo<EGraphicsPreset::Type>::FComboOption(
|
|
EGraphicsPreset::Scalable, FSlateIcon(FEditorStyle::GetStyleSetName(), "HardwareTargeting.ScalableQuality"), LOCTEXT("ScalableCaption", "Scalable 3D or 2D")));
|
|
|
|
return SNew(SDecoratedEnumCombo<EGraphicsPreset::Type>, MoveTemp(GraphicsPresetInfo))
|
|
.SelectedEnum(SelectedEnum)
|
|
.OnEnumChanged(OnChanged)
|
|
.ToolTip(IDocumentation::Get()->CreateToolTip(LOCTEXT("GraphicsPresetTooltip", "Choose the graphical level to target (high-end only or scalable from low-end on up)."), NULL, TEXT("Shared/Editor/Settings/TargetHardware"), TEXT("GraphicalLevel")));
|
|
}
|
|
|
|
IHardwareTargetingModule& IHardwareTargetingModule::Get()
|
|
{
|
|
static FHardwareTargetingModule Instance;
|
|
return Instance;
|
|
}
|
|
|
|
IMPLEMENT_MODULE(FHardwareTargetingModule, HardwareTargeting);
|
|
|
|
#undef UE_META_SETTING_ENTRY
|
|
#undef LOCTEXT_NAMESPACE
|