//============================================================================= // KFGFxOptionsMenu_Graphics //============================================================================= // This menu will be used to update and display the graphics options for the game //============================================================================= // Killing Floor 2 // Copyright (C) 2015 Tripwire Interactive LLC // Zane Gholson - 9/29/2014 //============================================================================= class KFGFxOptionsMenu_Graphics extends KFGFxObject_Menu native(UI); //@HSL_MOD_BEGIN - amiller 5/25/2016 - Adding support to save extra data into profile settings `include(KFProfileSettings.uci); //@HSL_MOD_END `define MIN 0 `define MAX 1 enum PerfWarning { // Little to no performance implications PerfWarning_None, // May cause performance degradation PerfWarning_Normal, // May cause severe performance degradation PerfWarning_Severe, }; var bool bIsRevertCoundownActive; var byte TimeCount; var const byte ExpireTime; var localized string FlexPopUpString; var localized string KeepSettingsPromptString; var localized string WarningPromptString; var localized string WillExpireString; var localized string PerformanceDescString[2]; var localized string RestartDescString; var localized string SingleWarningString; var localized string DoubleWarningString; var localized string UnsavedChangesString; var localized string ContinueString; var localized string SaveChangesString; var localized string AdjustGammaDescription; var localized string ResetGammaString; var localized string SetGammaString; var localized string GraphicsString; var localized string BasicString; var localized string AdvancedString; var localized string EffectsString; var localized string AspectRatioString; var localized string ResolutionString; var localized string GraphicsQualityString; var localized string VSyncString; var localized string FullscreenString; var localized string VariableFrameRateString; var localized string AdjustGammaString; var localized string FilmGrainString; var localized string EnvironmentDetailsString; var localized string CharacterDetailString; var localized string FXString; var localized string TextureResolutionString; var localized string TextureFilteringString; var localized string ShadowsString; var localized string RealtimeReflectionsString; var localized string AntiAliasingString; var localized string BloomString; var localized string MotionBlurString; var localized string AmbientOcclusionString; var localized string DepthOfFieldString; var localized string VolumetricLightingString; var localized string lensFlaresString; var localized string LightShaftsString; var localized string CustomString; var localized string IniOverrideString; var localized string OKString; var localized string ApplyString; var localized string CancelString; var localized string DefaultString; var localized string PhysicsLevelString; var localized array PhysicsLevelOptionStrings; var localized array PhysicsLevelSuggestionStrings; var localized string AspectRatioString_All; var localized string StandardAspectRatioString_4_3; var localized string StandardAspectRatioString_5_4; var localized string StandardAspectRatioString_3_2; var localized string WideAspectRatioString_16_9; var localized string WideAspectRatioString_16_10; var localized string ExtraWideAspectRatioString_2_1; var localized string ExtraWideAspectRatioString_21_9; var localized string MultiMonitorAspectRatioString; var localized array FullScreenStringOptions; var localized array GraphicsQualityStringOptions; var localized array VSyncStringOptions; var localized array EnvironmentDetailsStringOptions; var localized array CharacterDetailStringOptions; var localized array FXStringOptions; var localized array TextureResolutionStringOptions; var localized array TextureFilteringStringOptions; var localized array ShadowsStringOptions; var localized array RealtimeReflectionsStringOptions; var localized array AntiAliasingStringOptions; var localized array BloomStringOptions; var localized array MotionBlurStringOptions; var localized array AmbientOcclusionStringOptions; var localized array DepthOfFieldStringOptions; var localized arrayOffOnStringOptions; var transient array SupportedResolutionList; var transient string RevertPopupDescriptionString; /** List of supported aspect ratios. All of them might not be available for user. */ enum SupportedAspectRatio { KFASPECTRATIO_All, KFASPECTRATIO_Standard_4_3, KFASPECTRATIO_Standard_5_4, KFASPECTRATIO_Standard_3_2, KFASPECTRATIO_Wide_16_9, KFASPECTRATIO_Wide_16_10, KFASPECTRATIO_ExtraWide_2_1, KFASPECTRATIO_ExtraWide_21_9, KFASPECTRATIO_MultiMonitor, KFASPECTRATIO_MAX }; /** Array containing the list of aspect ratios supported by the user's machine. Use the index retured by the UI to access this list to get the actual aspect ratio */ var transient array AvailableAspectRatioList; //====================================================================================== // Meta Settings. Abstracted quality setting which contains one or more system settings. //====================================================================================== // ------------------------------------------------------------------------------------- // Resolution Setting // ------------------------------------------------------------------------------------- struct native ResolutionSetting { var int ResX; var int ResY; structcpptext { void CopyToNativeSettings(FSystemSettings& OutSettings, UEngine* OutEngine) { OutSettings.ResX = ResX; OutSettings.ResY = ResY; } void CopyFromNativeSettings(FSystemSettings& InSettings, UEngine* InEngine) { ResX = InSettings.ResX; ResY = InSettings.ResY; } } }; // ------------------------------------------------------------------------------------- // Graphics Quality (Basic Setting) // ------------------------------------------------------------------------------------- struct native GraphicsQualitySetting { var int EnvironmentDetailIndex; var int CharacterDetailIndex; var int FXQualityIndex; var int TextureResolutionIndex; var int TextureFilteringIndex; var int ShadowQualityIndex; var int RealtimeReflectionsIndex; var bool LightShafts; var bool VolumetricLighting; var bool LensFlares; var int AntiAliasingIndex; var int BloomIndex; var int MotionBlurIndex; var int AmbientOcclusionIndex; var int DOFIndex; var int FlexIndex; structcpptext { #if __TW_WITH_GSA_ // This should match the number of options in the struct #define MAX_OPTIONS 16 static int GetGSAOptions(NvGsaNamedOption** OutOptions) { NvGsaNamedOption *GSAOptions = new NvGsaNamedOption[MAX_OPTIONS]; // Environment Detail GSAOptions[0].name = TEXT("EnvironmentDetail"); GSAOptions[0].value.type = NV_GSA_TYPE_INT; GSAOptions[0].value.asInt = 2; GSAOptions[0].numRange.maxValue.asInt = 3; GSAOptions[0].numRange.minValue.asInt = 0; GSAOptions[0].numRange.numSteps = 3; // Character Detail GSAOptions[1].name = TEXT("CharacterDetail"); GSAOptions[1].value.type = NV_GSA_TYPE_INT; GSAOptions[1].value.asInt = 1; GSAOptions[1].numRange.maxValue.asInt = 2; GSAOptions[1].numRange.minValue.asInt = 0; GSAOptions[1].numRange.numSteps = 2; // FX Quality GSAOptions[2].name = TEXT("FX"); GSAOptions[2].value.type = NV_GSA_TYPE_INT; GSAOptions[2].value.asInt = 2; GSAOptions[2].numRange.maxValue.asInt = 3; GSAOptions[2].numRange.minValue.asInt = 0; GSAOptions[2].numRange.numSteps = 3; // Texture Resolution GSAOptions[3].name = TEXT("TextureResolution"); GSAOptions[3].value.type = NV_GSA_TYPE_INT; GSAOptions[3].value.asInt = 2; GSAOptions[3].numRange.maxValue.asInt = 3; GSAOptions[3].numRange.minValue.asInt = 0; GSAOptions[3].numRange.numSteps = 3; // Texture Filtering GSAOptions[4].name = TEXT("TextureFiltering"); GSAOptions[4].value.type = NV_GSA_TYPE_INT; GSAOptions[4].value.asInt = 2; GSAOptions[4].numRange.maxValue.asInt = 3; GSAOptions[4].numRange.minValue.asInt = 0; GSAOptions[4].numRange.numSteps = 3; // Shadows GSAOptions[5].name = TEXT("Shadows"); GSAOptions[5].value.type = NV_GSA_TYPE_INT; GSAOptions[5].value.asInt = 2; GSAOptions[5].numRange.maxValue.asInt = 3; GSAOptions[5].numRange.minValue.asInt = 0; GSAOptions[5].numRange.numSteps = 3; // Realtime Reflections GSAOptions[6].name = TEXT("RealtimeReflections"); GSAOptions[6].value.type = NV_GSA_TYPE_INT; GSAOptions[6].value.asInt = 0; GSAOptions[6].numRange.maxValue.asInt = 1; GSAOptions[6].numRange.minValue.asInt = 0; GSAOptions[6].numRange.numSteps = 1; // Light Shafts GSAOptions[7].name = TEXT("LightShafts"); GSAOptions[7].value.type = NV_GSA_TYPE_INT; GSAOptions[7].value.asInt = 1; GSAOptions[7].numRange.maxValue.asInt = 1; GSAOptions[7].numRange.minValue.asInt = 0; GSAOptions[7].numRange.numSteps = 1; // Volumetric Lighting GSAOptions[8].name = TEXT("VolumetricLighting"); GSAOptions[8].value.type = NV_GSA_TYPE_INT; GSAOptions[8].value.asInt = 1; GSAOptions[8].numRange.maxValue.asInt = 1; GSAOptions[8].numRange.minValue.asInt = 0; GSAOptions[8].numRange.numSteps = 1; // Lens Flares GSAOptions[9].name = TEXT("LensFlares"); GSAOptions[9].value.type = NV_GSA_TYPE_INT; GSAOptions[9].value.asInt = 1; GSAOptions[9].numRange.maxValue.asInt = 1; GSAOptions[9].numRange.minValue.asInt = 0; GSAOptions[9].numRange.numSteps = 1; // AntiAliasing GSAOptions[10].name = TEXT("AntiAliasing"); GSAOptions[10].value.type = NV_GSA_TYPE_INT; GSAOptions[10].value.asInt = 1; GSAOptions[10].numRange.maxValue.asInt = 1; GSAOptions[10].numRange.minValue.asInt = 0; GSAOptions[10].numRange.numSteps = 1; // Bloom GSAOptions[11].name = TEXT("Bloom"); GSAOptions[11].value.type = NV_GSA_TYPE_INT; GSAOptions[11].value.asInt = 2; GSAOptions[11].numRange.maxValue.asInt = 2; GSAOptions[11].numRange.minValue.asInt = 0; GSAOptions[11].numRange.numSteps = 2; // Motion Blur GSAOptions[12].name = TEXT("MotionBlur"); GSAOptions[12].value.type = NV_GSA_TYPE_INT; GSAOptions[12].value.asInt = 0; GSAOptions[12].numRange.maxValue.asInt = 1; GSAOptions[12].numRange.minValue.asInt = 0; GSAOptions[12].numRange.numSteps = 1; // AO GSAOptions[13].name = TEXT("AmbientOcclusion"); GSAOptions[13].value.type = NV_GSA_TYPE_INT; GSAOptions[13].value.asInt = 1; GSAOptions[13].numRange.maxValue.asInt = 2; GSAOptions[13].numRange.minValue.asInt = 0; GSAOptions[13].numRange.numSteps = 2; // DOF GSAOptions[14].name = TEXT("DepthOfField"); GSAOptions[14].value.type = NV_GSA_TYPE_INT; GSAOptions[14].value.asInt = 1; GSAOptions[14].numRange.maxValue.asInt = 1; GSAOptions[14].numRange.minValue.asInt = 0; GSAOptions[14].numRange.numSteps = 1; // Flex GSAOptions[15].name = TEXT("Flex"); GSAOptions[15].value.type = NV_GSA_TYPE_INT; GSAOptions[15].value.asInt = 0; GSAOptions[15].numRange.maxValue.asInt = 2; GSAOptions[15].numRange.minValue.asInt = 0; GSAOptions[15].numRange.numSteps = 2; // ----------------------------------------------------------- // Add new settings here. Remember to increment MAX_OPTIONS // ----------------------------------------------------------- *OutOptions = GSAOptions; return MAX_OPTIONS; } static FGraphicsQualitySetting GetGraphicsQualityFromGSA() { FGraphicsQualitySetting Out; NvGsaVariant Value; NvGsaStatus Status; // Environment Detail Status = GFSDK_GSA_GetOptionValue(&Value, TEXT("EnvironmentDetail")); checkSlow( Status == NV_GSA_STATUS_OK); Out.EnvironmentDetailIndex = Value.asInt; GFSDK_GSA_ReleaseVariant(&Value); // Character Detail Status = GFSDK_GSA_GetOptionValue(&Value, TEXT("CharacterDetail")); checkSlow( Status == NV_GSA_STATUS_OK); Out.CharacterDetailIndex = Value.asInt; GFSDK_GSA_ReleaseVariant(&Value); // FX Quality Status = GFSDK_GSA_GetOptionValue(&Value, TEXT("FX")); checkSlow( Status == NV_GSA_STATUS_OK); Out.FXQualityIndex = Value.asInt; GFSDK_GSA_ReleaseVariant(&Value); // Texture Resolution Status = GFSDK_GSA_GetOptionValue(&Value, TEXT("TextureResolution")); checkSlow( Status == NV_GSA_STATUS_OK); Out.TextureResolutionIndex = Value.asInt; GFSDK_GSA_ReleaseVariant(&Value); // Texture Filtering Status = GFSDK_GSA_GetOptionValue(&Value, TEXT("TextureFiltering")); checkSlow( Status == NV_GSA_STATUS_OK); Out.TextureFilteringIndex = Value.asInt; GFSDK_GSA_ReleaseVariant(&Value); // Shadows Status = GFSDK_GSA_GetOptionValue(&Value, TEXT("Shadows")); checkSlow( Status == NV_GSA_STATUS_OK); Out.ShadowQualityIndex = Value.asInt; GFSDK_GSA_ReleaseVariant(&Value); // Realtime Reflections Status = GFSDK_GSA_GetOptionValue(&Value, TEXT("RealtimeReflections")); checkSlow( Status == NV_GSA_STATUS_OK); Out.RealtimeReflectionsIndex = Value.asInt; GFSDK_GSA_ReleaseVariant(&Value); // Light Shafts Status = GFSDK_GSA_GetOptionValue(&Value, TEXT("LightShafts")); checkSlow( Status == NV_GSA_STATUS_OK); Out.LightShafts = Value.asInt > 0; GFSDK_GSA_ReleaseVariant(&Value); // Volumetric Lighting Status = GFSDK_GSA_GetOptionValue(&Value, TEXT("VolumetricLighting")); checkSlow( Status == NV_GSA_STATUS_OK); Out.VolumetricLighting = Value.asInt > 0; GFSDK_GSA_ReleaseVariant(&Value); // Lens Flares Status = GFSDK_GSA_GetOptionValue(&Value, TEXT("LensFlares")); checkSlow( Status == NV_GSA_STATUS_OK); Out.LensFlares = Value.asInt > 0; GFSDK_GSA_ReleaseVariant(&Value); // AntiAliasing Status = GFSDK_GSA_GetOptionValue(&Value, TEXT("AntiAliasing")); checkSlow( Status == NV_GSA_STATUS_OK); Out.AntiAliasingIndex = Value.asInt; GFSDK_GSA_ReleaseVariant(&Value); // Bloom Status = GFSDK_GSA_GetOptionValue(&Value, TEXT("Bloom")); checkSlow( Status == NV_GSA_STATUS_OK); Out.BloomIndex = Value.asInt; GFSDK_GSA_ReleaseVariant(&Value); // Motion Blur Status = GFSDK_GSA_GetOptionValue(&Value, TEXT("MotionBlur")); checkSlow( Status == NV_GSA_STATUS_OK); Out.MotionBlurIndex = Value.asInt; GFSDK_GSA_ReleaseVariant(&Value); // AO Status = GFSDK_GSA_GetOptionValue(&Value, TEXT("AmbientOcclusion")); checkSlow( Status == NV_GSA_STATUS_OK); Out.AmbientOcclusionIndex = Value.asInt; GFSDK_GSA_ReleaseVariant(&Value); // DOF Status = GFSDK_GSA_GetOptionValue(&Value, TEXT("DepthOfField")); checkSlow( Status == NV_GSA_STATUS_OK); Out.DOFIndex = Value.asInt; GFSDK_GSA_ReleaseVariant(&Value); // Flex Status = GFSDK_GSA_GetOptionValue(&Value, TEXT("Flex")); checkSlow( Status == NV_GSA_STATUS_OK); Out.FlexIndex = Value.asInt; GFSDK_GSA_ReleaseVariant(&Value); return Out; } #endif //__TW_WITH_GSA_ } }; // ------------------------------------------------------------------------------------- // Display Setting // ------------------------------------------------------------------------------------- struct native DisplaySetting { var bool Fullscreen; var bool BorderlessWindow; structcpptext { void CopyToNativeSettings(FSystemSettings& OutSettings, UEngine* OutEngine) { OutSettings.bFullscreen = Fullscreen; #if __TW_BORDERLESS_WINDOW_SUPPORT_ OutSettings.bBorderless = BorderlessWindow; #endif } void CopyFromNativeSettings(FSystemSettings& InSettings, UEngine* InEngine) { Fullscreen = InSettings.bFullscreen; #if __TW_BORDERLESS_WINDOW_SUPPORT_ BorderlessWindow = InSettings.bBorderless; #endif } } }; // ------------------------------------------------------------------------------------- // VSync Setting // ------------------------------------------------------------------------------------- struct native VSyncSetting { var bool VSync; structcpptext { void CopyToNativeSettings(FSystemSettings& OutSettings, UEngine* OutEngine) { OutSettings.bUseVSync = VSync; } void CopyFromNativeSettings(FSystemSettings& InSettings, UEngine* InEngine) { VSync = InSettings.bUseVSync; } } }; // ------------------------------------------------------------------------------------- // Variable Framerate Setting // ------------------------------------------------------------------------------------- struct native VariableFramerateSetting { var bool VariableFrameRate; structcpptext { void CopyToNativeSettings(FSystemSettings& OutSettings, UEngine* OutEngine) { OutEngine->bSmoothFrameRate = !VariableFrameRate; } void CopyFromNativeSettings(FSystemSettings& InSettings, UEngine* InEngine) { VariableFrameRate = !InEngine->bSmoothFrameRate; } } }; // ------------------------------------------------------------------------------------- // Film Grain Setting // ------------------------------------------------------------------------------------- struct native FilmGrainSetting { var float FilmGrainScale; structcpptext { void CopyToNativeSettings(FSystemSettings& OutSettings, UEngine* OutEngine) { OutSettings.ImageGrainScaler = FilmGrainScale; } void CopyFromNativeSettings(FSystemSettings& InSettings, UEngine* InEngine) { FilmGrainScale = InSettings.ImageGrainScaler; } } }; // ------------------------------------------------------------------------------------- // Flex Setting // ------------------------------------------------------------------------------------- struct native FlexSetting { var int FlexLevel; structcpptext { void CopyToNativeSettings(FSystemSettings& OutSettings, UEngine* OutEngine) { OutEngine->PhysXLevel = FlexLevel; } void CopyFromNativeSettings(FSystemSettings& InSettings, UEngine* InEngine) { FlexLevel = InEngine->PhysXLevel; } } }; // ------------------------------------------------------------------------------------- // Environment Setting // ------------------------------------------------------------------------------------- struct native EnvironmentDetailSetting { // Native setting(s) var int DetailMode; var bool AllowLightFunctions; var bool bDisableCanBecomeDynamicWakeup; var float MakeDynamicCollisionThreshold; // Script setting(s) var float DestructionLifetimeScale; structcpptext { void CopyToNativeSettings(FSystemSettings& OutSettings, UEngine* OutEngine) { OutSettings.DetailMode = DetailMode; OutSettings.bAllowLightFunctions = AllowLightFunctions; OutSettings.bDisableCanBecomeDynamicWakeup = bDisableCanBecomeDynamicWakeup; OutSettings.MakeDynamicCollisionThreshold = MakeDynamicCollisionThreshold; } void CopyFromNativeSettings(FSystemSettings& InSettings, UEngine* InEngine) { DetailMode = InSettings.DetailMode; AllowLightFunctions = InSettings.bAllowLightFunctions; bDisableCanBecomeDynamicWakeup = InSettings.bDisableCanBecomeDynamicWakeup; MakeDynamicCollisionThreshold = InSettings.MakeDynamicCollisionThreshold; } } }; // ------------------------------------------------------------------------------------- // Shadow Setting // ------------------------------------------------------------------------------------- struct native ShadowQualitySetting { var bool bAllowWholeSceneDominantShadows; var bool bOverrideMapWholeSceneDominantShadowSetting; var bool bAllowDynamicShadows; var bool bAllowPerObjectShadows; var int MaxWholeSceneDominantShadowResolution; var int MaxShadowResolution; var int ShadowFadeResolution; var int MinShadowResolution; var float ShadowTexelsPerPixel; var float GlobalShadowDistanceScale; var bool AllowForegroundPreshadows; structcpptext { void CopyToNativeSettings(FSystemSettings& OutSettings, UEngine* OutEngine) { OutSettings.bAllowWholeSceneDominantShadows = bAllowWholeSceneDominantShadows; OutSettings.bOverrideMapWholeSceneDominantShadowSetting = bOverrideMapWholeSceneDominantShadowSetting; OutSettings.bAllowDynamicShadows = bAllowDynamicShadows; OutSettings.bAllowPerObjectShadows = bAllowPerObjectShadows; OutSettings.MaxWholeSceneDominantShadowResolution = MaxWholeSceneDominantShadowResolution; OutSettings.MaxShadowResolution = MaxShadowResolution; OutSettings.ShadowFadeResolution = ShadowFadeResolution; OutSettings.MinShadowResolution = MinShadowResolution; OutSettings.ShadowTexelsPerPixel = ShadowTexelsPerPixel; OutSettings.GlobalShadowDistanceScale = GlobalShadowDistanceScale; OutSettings.bAllowForegroundPreshadows = AllowForegroundPreshadows; } void CopyFromNativeSettings(FSystemSettings& InSettings, UEngine* InEngine) { bAllowWholeSceneDominantShadows = InSettings.bAllowWholeSceneDominantShadows; bOverrideMapWholeSceneDominantShadowSetting = InSettings.bOverrideMapWholeSceneDominantShadowSetting; bAllowDynamicShadows = InSettings.bAllowDynamicShadows; bAllowPerObjectShadows = InSettings.bAllowPerObjectShadows; MaxWholeSceneDominantShadowResolution = InSettings.MaxWholeSceneDominantShadowResolution; MaxShadowResolution = InSettings.MaxShadowResolution; ShadowFadeResolution = InSettings.ShadowFadeResolution; MinShadowResolution = InSettings.MinShadowResolution; ShadowTexelsPerPixel = InSettings.ShadowTexelsPerPixel; GlobalShadowDistanceScale = InSettings.GlobalShadowDistanceScale; AllowForegroundPreshadows = InSettings.bAllowForegroundPreshadows; } } }; // ------------------------------------------------------------------------------------- // FX Setting // ------------------------------------------------------------------------------------- struct native FXQualitySetting { // Native settings var int ParticleLODBias; var int DistanceFogQuality; var bool Distortion; var bool FilteredDistortion; var bool DropParticleDistortion; var bool AllowSecondaryBloodEffects; // Script settings var float EmitterPoolScale; var float ShellEjectLifetime; var bool AllowExplosionLights; var bool AllowSprayActorLights; var bool AllowFootstepSounds; var bool AllowBloodSplatterDecals; var bool AllowRagdollAndGoreOnDeadBodies; var bool AllowPilotLights; var int MaxImpactEffectDecals; var int MaxExplosionDecals; var float GoreFXLifetimeMultiplier; var int MaxBloodEffects; var int MaxGoreEffects; var int MaxPersistentSplatsPerFrame; structcpptext { void CopyToNativeSettings(FSystemSettings& OutSettings, UEngine* OutEngine) { OutSettings.ParticleLODBias = ParticleLODBias; OutSettings.DistanceFogQuality = DistanceFogQuality; OutSettings.bAllowDistortion = Distortion; OutSettings.bAllowFilteredDistortion = FilteredDistortion; OutSettings.bAllowParticleDistortionDropping = DropParticleDistortion; OutSettings.bAllowSecondaryBloodEffects = AllowSecondaryBloodEffects; } void CopyFromNativeSettings(FSystemSettings& InSettings, UEngine* InEngine) { ParticleLODBias = InSettings.ParticleLODBias; DistanceFogQuality = InSettings.DistanceFogQuality; Distortion = InSettings.bAllowDistortion; FilteredDistortion = InSettings.bAllowFilteredDistortion; DropParticleDistortion = InSettings.bAllowParticleDistortionDropping; AllowSecondaryBloodEffects = InSettings.bAllowSecondaryBloodEffects; } } }; // ------------------------------------------------------------------------------------- // Realtime Reflection Setting // ------------------------------------------------------------------------------------- struct native RealtimeReflectionsSetting { var bool bAllowScreenSpaceReflections; structcpptext { void CopyToNativeSettings(FSystemSettings& OutSettings, UEngine* OutEngine) { OutSettings.bAllowScreenSpaceReflections = bAllowScreenSpaceReflections; } void CopyFromNativeSettings(FSystemSettings& InSettings, UEngine* InEngine) { bAllowScreenSpaceReflections = InSettings.bAllowScreenSpaceReflections; } } }; // ------------------------------------------------------------------------------------- // Character Detail Setting // ------------------------------------------------------------------------------------- struct native CharacterDetailSetting { // System settings var int SkeletalMeshLODBias; var bool AllowSubsurfaceScattering; var float KinematicUpdateDistFactorScale; var bool ShouldCorpseCollideWithDead; var bool ShouldCorpseCollideWithLiving; var bool ShouldCorpseCollideWithDeadAfterSleep; // Script settings var int MaxBodyWoundDecals; var int MaxDeadBodies; var bool bAllowPhysics; structcpptext { void CopyToNativeSettings(FSystemSettings& OutSettings, UEngine* OutEngine) { OutSettings.SkeletalMeshLODBias = SkeletalMeshLODBias; OutSettings.bAllowSubsurfaceScattering = AllowSubsurfaceScattering; OutSettings.KinematicUpdateDistFactorScale = KinematicUpdateDistFactorScale; OutSettings.bShouldCorpseCollideWithDead = ShouldCorpseCollideWithDead; OutSettings.bShouldCorpseCollideWithLiving = ShouldCorpseCollideWithLiving; OutSettings.bShouldCorpseCollideWithDeadAfterSleep = ShouldCorpseCollideWithDeadAfterSleep; } void CopyFromNativeSettings(FSystemSettings& InSettings, UEngine* InEngine) { SkeletalMeshLODBias = InSettings.SkeletalMeshLODBias; AllowSubsurfaceScattering = InSettings.bAllowSubsurfaceScattering; KinematicUpdateDistFactorScale = InSettings.KinematicUpdateDistFactorScale; ShouldCorpseCollideWithDead = InSettings.bShouldCorpseCollideWithDead; ShouldCorpseCollideWithLiving = InSettings.bShouldCorpseCollideWithLiving; ShouldCorpseCollideWithDeadAfterSleep = InSettings.bShouldCorpseCollideWithDeadAfterSleep; } } }; // ------------------------------------------------------------------------------------- // Light Shafts Setting // ------------------------------------------------------------------------------------- struct native LightShaftsSetting { var bool bAllowLightShafts; structcpptext { void CopyToNativeSettings(FSystemSettings& OutSettings, UEngine* OutEngine) { OutSettings.bAllowLightShafts = bAllowLightShafts; } void CopyFromNativeSettings(FSystemSettings& InSettings, UEngine* InEngine) { bAllowLightShafts = InSettings.bAllowLightShafts; } } }; // ------------------------------------------------------------------------------------- // Volumetric Lighting Setting // ------------------------------------------------------------------------------------- struct native VolumetricLightingSetting { var bool bAllowLightCones; structcpptext { void CopyToNativeSettings(FSystemSettings& OutSettings, UEngine* OutEngine) { OutSettings.bAllowLightCones = bAllowLightCones; } void CopyFromNativeSettings(FSystemSettings& InSettings, UEngine* InEngine) { bAllowLightCones = InSettings.bAllowLightCones; } } }; // ------------------------------------------------------------------------------------- // Lens Flare Setting // ------------------------------------------------------------------------------------- struct native LensFlareSetting { var bool bAllowLensFlares; structcpptext { void CopyToNativeSettings(FSystemSettings& OutSettings, UEngine* OutEngine) { OutSettings.bAllowLensFlares = bAllowLensFlares; } void CopyFromNativeSettings(FSystemSettings& InSettings, UEngine* InEngine) { bAllowLensFlares = InSettings.bAllowLensFlares; } } }; // ------------------------------------------------------------------------------------- // Texture resolution // ------------------------------------------------------------------------------------- struct native TextureResolutionSetting { var int UIBias; var int ShadowmapBias; var int CharacterBias; var int Weapon1stBias; var int Weapon3rdBias; var int EnvironmentBias; var int FXBias; structcpptext { void CopyToNativeSettings(FSystemSettings& OutSettings, UEngine* OutEngine) { OutSettings.TextureLODSettings.GetTextureLODGroup(TEXTUREGROUP_UI).LODBias = UIBias; OutSettings.TextureLODSettings.GetTextureLODGroup(TEXTUREGROUP_UIWithMips).LODBias = UIBias; OutSettings.TextureLODSettings.GetTextureLODGroup(TEXTUREGROUP_UIStreamable).LODBias = UIBias; //@ TWI - bedwards: UI texture streaming support OutSettings.TextureLODSettings.GetTextureLODGroup(TEXTUREGROUP_Shadowmap).LODBias = ShadowmapBias; OutSettings.TextureLODSettings.GetTextureLODGroup(TEXTUREGROUP_Character).LODBias = CharacterBias; OutSettings.TextureLODSettings.GetTextureLODGroup(TEXTUREGROUP_CharacterNormalMap).LODBias = CharacterBias; OutSettings.TextureLODSettings.GetTextureLODGroup(TEXTUREGROUP_CharacterSpecular).LODBias = CharacterBias; OutSettings.TextureLODSettings.GetTextureLODGroup(TEXTUREGROUP_Creature).LODBias = CharacterBias; OutSettings.TextureLODSettings.GetTextureLODGroup(TEXTUREGROUP_CreatureNormalMap).LODBias = CharacterBias; OutSettings.TextureLODSettings.GetTextureLODGroup(TEXTUREGROUP_CreatureSpecular).LODBias = CharacterBias; OutSettings.TextureLODSettings.GetTextureLODGroup(TEXTUREGROUP_Cosmetic).LODBias = CharacterBias; OutSettings.TextureLODSettings.GetTextureLODGroup(TEXTUREGROUP_CosmeticNormalMap).LODBias = CharacterBias; OutSettings.TextureLODSettings.GetTextureLODGroup(TEXTUREGROUP_CosmeticSpecular).LODBias = CharacterBias; OutSettings.TextureLODSettings.GetTextureLODGroup(TEXTUREGROUP_Weapon).LODBias = Weapon1stBias; OutSettings.TextureLODSettings.GetTextureLODGroup(TEXTUREGROUP_WeaponNormalMap).LODBias = Weapon1stBias; OutSettings.TextureLODSettings.GetTextureLODGroup(TEXTUREGROUP_WeaponSpecular).LODBias = Weapon1stBias; OutSettings.TextureLODSettings.GetTextureLODGroup(TEXTUREGROUP_Weapon3rd).LODBias = Weapon3rdBias; OutSettings.TextureLODSettings.GetTextureLODGroup(TEXTUREGROUP_Weapon3rdNormalMap).LODBias = Weapon3rdBias; OutSettings.TextureLODSettings.GetTextureLODGroup(TEXTUREGROUP_Weapon3rdSpecular).LODBias = Weapon3rdBias; OutSettings.TextureLODSettings.GetTextureLODGroup(TEXTUREGROUP_World).LODBias = EnvironmentBias; OutSettings.TextureLODSettings.GetTextureLODGroup(TEXTUREGROUP_WorldNormalMap).LODBias = EnvironmentBias; OutSettings.TextureLODSettings.GetTextureLODGroup(TEXTUREGROUP_WorldSpecular).LODBias = EnvironmentBias; OutSettings.TextureLODSettings.GetTextureLODGroup(TEXTUREGROUP_Effects).LODBias = FXBias; OutSettings.TextureLODSettings.GetTextureLODGroup(TEXTUREGROUP_EffectsNotFiltered).LODBias = FXBias; } void CopyFromNativeSettings(FSystemSettings& InSettings, UEngine* InEngine) { // UI UIBias = InSettings.TextureLODSettings.GetTextureLODGroup(TEXTUREGROUP_UI).LODBias; // Shadowmap ShadowmapBias = InSettings.TextureLODSettings.GetTextureLODGroup(TEXTUREGROUP_Shadowmap).LODBias; CharacterBias = InSettings.TextureLODSettings.GetTextureLODGroup(TEXTUREGROUP_Character).LODBias; if( CharacterBias != InSettings.TextureLODSettings.GetTextureLODGroup(TEXTUREGROUP_CharacterNormalMap).LODBias || CharacterBias != InSettings.TextureLODSettings.GetTextureLODGroup(TEXTUREGROUP_CharacterSpecular).LODBias || CharacterBias != InSettings.TextureLODSettings.GetTextureLODGroup(TEXTUREGROUP_Creature).LODBias || CharacterBias != InSettings.TextureLODSettings.GetTextureLODGroup(TEXTUREGROUP_CreatureNormalMap).LODBias || CharacterBias != InSettings.TextureLODSettings.GetTextureLODGroup(TEXTUREGROUP_CreatureSpecular).LODBias || CharacterBias != InSettings.TextureLODSettings.GetTextureLODGroup(TEXTUREGROUP_Cosmetic).LODBias || CharacterBias != InSettings.TextureLODSettings.GetTextureLODGroup(TEXTUREGROUP_CosmeticNormalMap).LODBias || CharacterBias != InSettings.TextureLODSettings.GetTextureLODGroup(TEXTUREGROUP_CosmeticSpecular).LODBias) { warnf(TEXT("Settings mismatch for Character Texture Resolution")); CharacterBias = -1; } // First person weapons Weapon1stBias = InSettings.TextureLODSettings.GetTextureLODGroup(TEXTUREGROUP_Weapon).LODBias; if( Weapon1stBias != InSettings.TextureLODSettings.GetTextureLODGroup(TEXTUREGROUP_WeaponNormalMap).LODBias || Weapon1stBias != InSettings.TextureLODSettings.GetTextureLODGroup(TEXTUREGROUP_WeaponSpecular).LODBias ) { warnf(TEXT("Settings mismatch for 1st Person Weapon Texture Resolution")); Weapon1stBias = -1; } // Third person weapons Weapon3rdBias = InSettings.TextureLODSettings.GetTextureLODGroup(TEXTUREGROUP_Weapon3rd).LODBias; if( Weapon3rdBias != InSettings.TextureLODSettings.GetTextureLODGroup(TEXTUREGROUP_Weapon3rdNormalMap).LODBias || Weapon3rdBias != InSettings.TextureLODSettings.GetTextureLODGroup(TEXTUREGROUP_Weapon3rdSpecular).LODBias ) { warnf(TEXT("Settings mismatch for 3rd Person Weapon Texture Resolution")); Weapon3rdBias = -1; } // Environment EnvironmentBias = InSettings.TextureLODSettings.GetTextureLODGroup(TEXTUREGROUP_World).LODBias; if( EnvironmentBias != InSettings.TextureLODSettings.GetTextureLODGroup(TEXTUREGROUP_WorldNormalMap).LODBias || EnvironmentBias != InSettings.TextureLODSettings.GetTextureLODGroup(TEXTUREGROUP_WorldSpecular).LODBias ) { warnf(TEXT("Settings mismatch for Environment Texture Resolution")); EnvironmentBias = -1; } // FX FXBias = InSettings.TextureLODSettings.GetTextureLODGroup(TEXTUREGROUP_Effects).LODBias; if( FXBias != InSettings.TextureLODSettings.GetTextureLODGroup(TEXTUREGROUP_EffectsNotFiltered).LODBias ) { warnf(TEXT("Settings mismatch for FX Texture Resolution")); FXBias = -1; } } } }; // ------------------------------------------------------------------------------------- // Texture Filtering // ------------------------------------------------------------------------------------- struct native TextureFilterSetting { var name MinMagFilter; var name MipFilter; var int MaxAnisotropy; structcpptext { void CopyToNativeSettings(FSystemSettings& OutSettings, UEngine* OutEngine) { // Anisotropy setting OutSettings.MaxAnisotropy = MaxAnisotropy; // Filter mode ESamplerFilter Filter = SF_Trilinear, NoMipFilter = SF_Bilinear; if( MinMagFilter == NAME_Linear && MipFilter == NAME_Point ) { Filter = SF_Bilinear; NoMipFilter = SF_Bilinear; } else if( MinMagFilter == NAME_Linear && MipFilter == NAME_Linear ) { Filter = SF_Trilinear; NoMipFilter = SF_Bilinear; } else if( MinMagFilter == NAME_Aniso && MipFilter == NAME_Linear ) { Filter = SF_AnisotropicLinear; NoMipFilter = SF_AnisotropicPoint; } // Assign to texture groups OutSettings.TextureLODSettings.GetTextureLODGroup(TEXTUREGROUP_Shadowmap).Filter = Filter; OutSettings.TextureLODSettings.GetTextureLODGroup(TEXTUREGROUP_Character).Filter = Filter; OutSettings.TextureLODSettings.GetTextureLODGroup(TEXTUREGROUP_CharacterNormalMap).Filter = Filter; OutSettings.TextureLODSettings.GetTextureLODGroup(TEXTUREGROUP_CharacterSpecular).Filter = Filter; OutSettings.TextureLODSettings.GetTextureLODGroup(TEXTUREGROUP_Creature).Filter = Filter; OutSettings.TextureLODSettings.GetTextureLODGroup(TEXTUREGROUP_CreatureNormalMap).Filter = Filter; OutSettings.TextureLODSettings.GetTextureLODGroup(TEXTUREGROUP_CreatureSpecular).Filter = Filter; OutSettings.TextureLODSettings.GetTextureLODGroup(TEXTUREGROUP_Cosmetic).Filter = Filter; OutSettings.TextureLODSettings.GetTextureLODGroup(TEXTUREGROUP_CosmeticNormalMap).Filter = Filter; OutSettings.TextureLODSettings.GetTextureLODGroup(TEXTUREGROUP_CosmeticSpecular).Filter = Filter; OutSettings.TextureLODSettings.GetTextureLODGroup(TEXTUREGROUP_Weapon).Filter = Filter; OutSettings.TextureLODSettings.GetTextureLODGroup(TEXTUREGROUP_WeaponNormalMap).Filter = Filter; OutSettings.TextureLODSettings.GetTextureLODGroup(TEXTUREGROUP_WeaponSpecular).Filter = Filter; OutSettings.TextureLODSettings.GetTextureLODGroup(TEXTUREGROUP_Weapon3rd).Filter = Filter; OutSettings.TextureLODSettings.GetTextureLODGroup(TEXTUREGROUP_Weapon3rdNormalMap).Filter = Filter; OutSettings.TextureLODSettings.GetTextureLODGroup(TEXTUREGROUP_Weapon3rdSpecular).Filter = Filter; OutSettings.TextureLODSettings.GetTextureLODGroup(TEXTUREGROUP_World).Filter = Filter; OutSettings.TextureLODSettings.GetTextureLODGroup(TEXTUREGROUP_WorldNormalMap).Filter = Filter; OutSettings.TextureLODSettings.GetTextureLODGroup(TEXTUREGROUP_WorldSpecular).Filter = Filter; OutSettings.TextureLODSettings.GetTextureLODGroup(TEXTUREGROUP_Effects).Filter = Filter; OutSettings.TextureLODSettings.GetTextureLODGroup(TEXTUREGROUP_UIWithMips).Filter = Filter; // Special texture groups /wo mip filtering OutSettings.TextureLODSettings.GetTextureLODGroup(TEXTUREGROUP_UIStreamable).Filter = NoMipFilter; OutSettings.TextureLODSettings.GetTextureLODGroup(TEXTUREGROUP_UI).Filter = NoMipFilter; OutSettings.TextureLODSettings.GetTextureLODGroup(TEXTUREGROUP_EffectsNotFiltered).Filter = NoMipFilter; } void CopyFromNativeSettings(FSystemSettings& InSettings, UEngine* InEngine) { // Anisotropy setting MaxAnisotropy = InSettings.MaxAnisotropy; ESamplerFilter Filter; Filter = InSettings.TextureLODSettings.GetTextureLODGroup(TEXTUREGROUP_World).Filter; if( Filter != InSettings.TextureLODSettings.GetTextureLODGroup(TEXTUREGROUP_Shadowmap).Filter || Filter != InSettings.TextureLODSettings.GetTextureLODGroup(TEXTUREGROUP_Character).Filter || Filter != InSettings.TextureLODSettings.GetTextureLODGroup(TEXTUREGROUP_CharacterNormalMap).Filter || Filter != InSettings.TextureLODSettings.GetTextureLODGroup(TEXTUREGROUP_CharacterSpecular).Filter || Filter != InSettings.TextureLODSettings.GetTextureLODGroup(TEXTUREGROUP_Creature).Filter || Filter != InSettings.TextureLODSettings.GetTextureLODGroup(TEXTUREGROUP_CreatureNormalMap).Filter || Filter != InSettings.TextureLODSettings.GetTextureLODGroup(TEXTUREGROUP_CreatureSpecular).Filter || Filter != InSettings.TextureLODSettings.GetTextureLODGroup(TEXTUREGROUP_Cosmetic).Filter || Filter != InSettings.TextureLODSettings.GetTextureLODGroup(TEXTUREGROUP_CosmeticNormalMap).Filter || Filter != InSettings.TextureLODSettings.GetTextureLODGroup(TEXTUREGROUP_CosmeticSpecular).Filter || Filter != InSettings.TextureLODSettings.GetTextureLODGroup(TEXTUREGROUP_Weapon).Filter || Filter != InSettings.TextureLODSettings.GetTextureLODGroup(TEXTUREGROUP_WeaponNormalMap).Filter || Filter != InSettings.TextureLODSettings.GetTextureLODGroup(TEXTUREGROUP_WeaponSpecular).Filter || Filter != InSettings.TextureLODSettings.GetTextureLODGroup(TEXTUREGROUP_Weapon3rd).Filter || Filter != InSettings.TextureLODSettings.GetTextureLODGroup(TEXTUREGROUP_Weapon3rdNormalMap).Filter || Filter != InSettings.TextureLODSettings.GetTextureLODGroup(TEXTUREGROUP_Weapon3rdSpecular).Filter || Filter != InSettings.TextureLODSettings.GetTextureLODGroup(TEXTUREGROUP_WorldNormalMap).Filter || Filter != InSettings.TextureLODSettings.GetTextureLODGroup(TEXTUREGROUP_WorldSpecular).Filter || Filter != InSettings.TextureLODSettings.GetTextureLODGroup(TEXTUREGROUP_Effects).Filter || Filter != InSettings.TextureLODSettings.GetTextureLODGroup(TEXTUREGROUP_UIWithMips).Filter ) { warnf(TEXT("Settings mismatch for Texture Filter")); } ESamplerFilter NoMipFilter; NoMipFilter = InSettings.TextureLODSettings.GetTextureLODGroup(TEXTUREGROUP_UI).Filter; if( NoMipFilter != InSettings.TextureLODSettings.GetTextureLODGroup(TEXTUREGROUP_EffectsNotFiltered).Filter || NoMipFilter != InSettings.TextureLODSettings.GetTextureLODGroup(TEXTUREGROUP_UIStreamable).Filter ) //@ TWI - bedwards: UI texture streaming support { warnf(TEXT("Settings mismatch for Texture Filter (No Mips)")); } if( Filter == SF_Bilinear && NoMipFilter == SF_Bilinear ) { MinMagFilter = NAME_Linear; MipFilter = NAME_Point; } else if( Filter == SF_Trilinear && NoMipFilter == SF_Bilinear ) { MinMagFilter = NAME_Linear; MipFilter = NAME_Linear; } else if( Filter == SF_AnisotropicLinear && NoMipFilter == SF_AnisotropicPoint ) { MinMagFilter = NAME_Aniso; MipFilter = NAME_Linear; } } } }; // ------------------------------------------------------------------------------------- // Bloom // ------------------------------------------------------------------------------------- struct native BloomSetting { var bool Bloom; var int BloomQuality; structcpptext { void CopyToNativeSettings(FSystemSettings& OutSettings, UEngine* OutEngine) { OutSettings.bAllowBloom = Bloom; OutSettings.BloomQuality = BloomQuality; } void CopyFromNativeSettings(FSystemSettings& InSettings, UEngine* InEngine) { Bloom = InSettings.bAllowBloom; BloomQuality = InSettings.BloomQuality; } } }; // ------------------------------------------------------------------------------------- // Motion Blur // ------------------------------------------------------------------------------------- struct native MotionBlurSetting { var bool MotionBlur; var int MotionBlurQuality; structcpptext { void CopyToNativeSettings(FSystemSettings& OutSettings, UEngine* OutEngine) { OutSettings.bAllowMotionBlur = MotionBlur; OutSettings.MotionBlurQuality = MotionBlurQuality; } void CopyFromNativeSettings(FSystemSettings& InSettings, UEngine* InEngine) { MotionBlur = InSettings.bAllowMotionBlur; MotionBlurQuality = InSettings.MotionBlurQuality; } } }; // ------------------------------------------------------------------------------------- // Anti Aliasing // ------------------------------------------------------------------------------------- struct native AntiAliasingSetting { var bool PostProcessAA; structcpptext { void CopyToNativeSettings(FSystemSettings& OutSettings, UEngine* OutEngine) { OutSettings.bAllowPostProcessAA = PostProcessAA; } void CopyFromNativeSettings(FSystemSettings& InSettings, UEngine* InEngine) { PostProcessAA = InSettings.bAllowPostProcessAA; } } }; // ------------------------------------------------------------------------------------- // Ambient Occlusion // ------------------------------------------------------------------------------------- struct native AmbientOcclusionSetting { var bool AmbientOcclusion; var bool HBAO; structcpptext { void CopyToNativeSettings(FSystemSettings& OutSettings, UEngine* OutEngine) { OutSettings.bAllowAmbientOcclusion = AmbientOcclusion; #if __TW_GAMEWORKS_HBAO_ OutSettings.bAllowHBAO = HBAO; #endif // __TW_GAMEWORKS_HBAO_ } void CopyFromNativeSettings(FSystemSettings& InSettings, UEngine* InEngine) { AmbientOcclusion = InSettings.bAllowAmbientOcclusion; #if __TW_GAMEWORKS_HBAO_ HBAO = InSettings.bAllowHBAO; #endif // __TW_GAMEWORKS_HBAO_ } } }; // ------------------------------------------------------------------------------------- // Depth Of Field // ------------------------------------------------------------------------------------- struct native DOFSetting { var bool DepthOfField; var int DepthOfFieldQuality; structcpptext { void CopyToNativeSettings(FSystemSettings& OutSettings, UEngine* OutEngine) { OutSettings.bAllowDepthOfField = DepthOfField; OutSettings.DepthOfFieldQuality = DepthOfFieldQuality; } void CopyFromNativeSettings(FSystemSettings& InSettings, UEngine* InEngine) { DepthOfField = InSettings.bAllowDepthOfField; DepthOfFieldQuality = InSettings.DepthOfFieldQuality; } } }; //====================================================================================== // Setting Presets. Contains the values that make up the quality preset. //====================================================================================== var array GraphicsQualityPresets; var array DisplayPresets; var array VSyncPresets; var array VariableFrameratePresets; var array FilmGrainMinMaxPreset; var array FlexPresets; var array EnvironmentDetailPresets; var array ShadowQualityPresets; var array FXQualityPresets; var array RealtimeReflectionsPresets; var array CharacterDetailPresets; var array LightShaftsPresets; var array VolumetricLightingPresets; var array LensFlarePresets; var array TextureResolutionPresets; var array TextureFilterPresets; var array BloomPresets; var array MotionBlurPresets; var array AntiAliasingPresets; var array AmbientOcclusionPresets; var array DOFPresets; //====================================================================================== enum GraphicsLevelPreset { GRAPHICS_LOW, GRAPHICS_MEDIUM, GRAPHICS_HIGH, GRAPHICS_ULTRA, GRAPHICS_CUSTOM, GRAPHICS_MAX }; struct native GFXSettings { //basic var ResolutionSetting Resolution; var VSyncSetting VSync; var DisplaySetting Display; var VariableFramerateSetting VariableFPS; var FilmGrainSetting FilmGrain; var FlexSetting Flex; //advanced var EnvironmentDetailSetting EnvironmentDetail; var CharacterDetailSetting CharacterDetail; var FXQualitySetting FX; var TextureResolutionSetting TextureResolution; var TextureFilterSetting TextureFiltering; var ShadowQualitySetting Shadows; var RealtimeReflectionsSetting RealtimeReflections; var AntiAliasingSetting AntiAliasing; var BloomSetting Bloom; var MotionBlurSetting MotionBlur; var AmbientOcclusionSetting AmbientOcclusion; var DOFSetting DepthOfField; var VolumetricLightingSetting VolumetricLighting; var LensFlareSetting LensFlares; var LightShaftsSetting LightShafts; }; // The current setting that the user has. Needs to be serialized. var transient GFXSettings CurrentGFXSettings; //On revert, then these settings will be applied var transient GFXSettings RevertedGFXSettings; // Changes that the user made but did not apply var transient GFXSettings UnsavedGFXSettings; // Whether there is a pending restart due to unsaved changes var transient bool UnsavedPendingRestart; cpptext { #if __TW_WITH_GSA_ // NVIDIA GSA hooks static UBOOL InitGSASettings(); static UBOOL ApplyGSASettings(); #endif } // Update settings for GSA // Note: This function definition is not compiled out for platforms // that don't support GSA so as to not cause a script native dependency when // building for another platform. Instead, it turns into a empty function if // not supported. native static function UpdateGSASetting(string SettingName, int Index); native static function UpdateGSAResolution(int Width, int Height); // Update the config file native static function FlushGSA(); /** Get/Set functions for native SystemSettings */ native static function GetCurrentNativeSettings(out GFXSettings CurrentSettings); native static function SetNativeSettings(out GFXSettings NewSettings); /** Returns the compat score assigned by the AppCompat system*/ native function int GetCompatLevel(); /** Queries engine to check whether the aspect ratio is available */ native function bool IsAspectRatioAvailable(SupportedAspectRatio InAspectRatio); /** Update the resolution options based on given aspect ratio and the list of resolutions that are supported by the adapter */ native function RefreshSupportedResolutions(SupportedAspectRatio InAspectRatio); native function string GetMonitorResolution(); /** Returns whether Nvidia FleX is supported or not */ native function bool IsFleXSupported(); /** Keeps the GSA system in sync whenever we change GFXSettings */ static function UpdateGSA(GFXSettings InSettings) { // Register settings updates UpdateGSASetting("EnvironmentDetail", FindEnvironmentDetailIndex(InSettings.EnvironmentDetail, default.EnvironmentDetailPresets)); UpdateGSASetting("CharacterDetail", FindCharacterDetailIndex(InSettings.CharacterDetail, default.CharacterDetailPresets)); UpdateGSASetting("FX", FindFXQualityIndex(InSettings.FX, default.FXQualityPresets)); UpdateGSASetting("TextureResolution", FindTextureResolutionSettingIndex(InSettings.TextureResolution, default.TextureResolutionPresets)); UpdateGSASetting("TextureFiltering", FindTextureFilterSettingIndex(InSettings.TextureFiltering, default.TextureFilterPresets)); UpdateGSASetting("Shadows", FindShadowQualityIndex(InSettings.Shadows, default.ShadowQualityPresets)); UpdateGSASetting("RealtimeReflections", FindReflectionsSettingIndex(InSettings.RealtimeReflections, default.RealtimeReflectionsPresets)); UpdateGSASetting("AntiAliasing", FindAntiAliasingSettingIndex(InSettings.AntiAliasing, default.AntiAliasingPresets)); UpdateGSASetting("Bloom", FindBloomSettingIndex(InSettings.Bloom, default.BloomPresets)); UpdateGSASetting("MotionBlur", FindMotionBlurSettingIndex(InSettings.MotionBlur, default.MotionBlurPresets)); UpdateGSASetting("AmbientOcclusion", FindAmbientOcclusionSettingIndex(InSettings.AmbientOcclusion, default.AmbientOcclusionPresets)); UpdateGSASetting("DepthOfField", FindDOFSettingIndex(InSettings.DepthOfField, default.DOFPresets)); UpdateGSASetting("VolumetricLighting", FindVolumetricLightingSettingIndex(InSettings.VolumetricLighting, default.VolumetricLightingPresets)); UpdateGSASetting("LensFlares", FindLensFlareSettingIndex(InSettings.LensFlares, default.LensFlarePresets)); UpdateGSASetting("LightShafts", FindLightShaftsSettingIndex(InSettings.LightShafts, default.LightShaftsPresets)); UpdateGSASetting("Flex", FindFlexSettingIndex(InSettings.Flex, default.FlexPresets)); // Register resolution updates UpdateGSAResolution(InSettings.Resolution.ResX, InSettings.Resolution.ResY); // Save to config file FlushGSA(); } /** Returns the aspect ratio for the given resolution */ event SupportedAspectRatio GetAspectRatio(int ResX, int ResY) { local float ComputedAspectRatio; if( IsAspectRatioAvailable(KFASPECTRATIO_MultiMonitor) ) { return KFASPECTRATIO_MultiMonitor; } else { // Compute the aspect ratio from current resolution ComputedAspectRatio = float(ResX)/float(ResY); // Match computed aspect ratio against supported aspect ratios if( ComputedAspectRatio ~= 4.f/3.f ) { return KFASPECTRATIO_Standard_4_3; } else if( ComputedAspectRatio ~= 5.f/4.f ) { return KFASPECTRATIO_Standard_5_4; } else if( ComputedAspectRatio ~= 3.f/2.f ) { return KFASPECTRATIO_Standard_3_2; } else if( ComputedAspectRatio ~= 16.f/9.f) { return KFASPECTRATIO_Wide_16_9; } else if( ComputedAspectRatio ~= 16.f/10.f ) { return KFASPECTRATIO_Wide_16_10; } else if( ComputedAspectRatio ~= 2.f/1.f ) { return KFASPECTRATIO_ExtraWide_2_1; } else if( ComputedAspectRatio ~= 21.f/9.f ) { return KFASPECTRATIO_ExtraWide_21_9; } } // Default: unsupress all resolutions return KFASPECTRATIO_All; } /** Function to get current script settings. Should not be called directly. Use GetCurrentGFXSettings() instead */ static function GetCurrentScriptSettings(out GFXSettings CurrentSettings) { GetScriptDisplaySettings(CurrentSettings.Display); GetScriptVSyncSettings(CurrentSettings.VSync); GetScriptVariableFramerateSettings(CurrentSettings.VariableFPS); GetScriptFilmGrainSettings(CurrentSettings.FilmGrain); GetScriptFlexSettings(CurrentSettings.Flex); GetScriptEnvironmentDetailSettings(CurrentSettings.EnvironmentDetail); GetScriptShadowQualitySettings(CurrentSettings.Shadows); GetScriptFXQualitySettings(CurrentSettings.FX); GetScriptReflectionSettings(CurrentSettings.RealtimeReflections); GetScriptCharacterDetailSettings(CurrentSettings.CharacterDetail); GetScriptLightShaftsSettings(CurrentSettings.LightShafts); GetScriptVolumetricLightingSettings(CurrentSettings.VolumetricLighting); GetScriptLensFlareSettings(CurrentSettings.LensFlares); GetScriptTextureResolutionSettings(CurrentSettings.TextureResolution); GetScriptTextureFilterSettings(CurrentSettings.TextureFiltering); GetScriptBloomSettings(CurrentSettings.Bloom); GetScriptMotionBlurSettings(CurrentSettings.MotionBlur); GetScriptAntiAliasingSettings(CurrentSettings.AntiAliasing); GetScriptAmbientOcclusionSettings(CurrentSettings.AmbientOcclusion); GetScriptDOFSettings(CurrentSettings.DepthOfField); } /** Function to set script settings. Should not be called directly. Use SetGFXSettings() instead */ static function SetScriptSettings(out GFXSettings NewSettings) { SetScriptDisplaySettings(NewSettings.Display); SetScriptVSyncSettings(NewSettings.VSync); SetScriptVariableFramerateSettings(NewSettings.VariableFPS); SetScriptFilmGrainSettings(NewSettings.FilmGrain); SetScriptFlexSettings(NewSettings.Flex); SetScriptEnvironmentDetailSettings(NewSettings.EnvironmentDetail); SetScriptShadowQualitySettings(NewSettings.Shadows); SetScriptFXQualitySettings(NewSettings.FX); SetScriptReflectionSettings(NewSettings.RealtimeReflections); SetScriptCharacterDetailSettings(NewSettings.CharacterDetail); SetScriptLightShaftsSettings(NewSettings.LightShafts); SetScriptVolumetricLightingSettings(NewSettings.VolumetricLighting); SetScriptLensFlareSettings(NewSettings.LensFlares); SetScriptTextureResolutionSettings(NewSettings.TextureResolution); SetScriptTextureFilterSettings(NewSettings.TextureFiltering); SetScriptBloomSettings(NewSettings.Bloom); SetScriptMotionBlurSettings(NewSettings.MotionBlur); SetScriptAntiAliasingSettings(NewSettings.AntiAliasing); SetScriptAmbientOcclusionSettings(NewSettings.AmbientOcclusion); SetScriptDOFSettings(NewSettings.DepthOfField); } //======================================================================= // Helper functions for meta settings //======================================================================= // // Graphics Quality // function int FindGraphicsQualitySettingIndex(out GFXSettings Ref, out array SettingsList) { local int i; local GraphicsQualitySetting GraphicsQuality; // Retrieve graphics quality from the advanced settings GraphicsQuality.EnvironmentDetailIndex = FindEnvironmentDetailIndex(Ref.EnvironmentDetail, EnvironmentDetailPresets); GraphicsQuality.CharacterDetailIndex = FindCharacterDetailIndex(Ref.CharacterDetail, CharacterDetailPresets); GraphicsQuality.FXQualityIndex = FindFXQualityIndex(Ref.FX, FXQualityPresets); GraphicsQuality.TextureResolutionIndex = FindTextureResolutionSettingIndex(Ref.TextureResolution, TextureResolutionPresets); GraphicsQuality.TextureFilteringIndex = FindTextureFilterSettingIndex(Ref.TextureFiltering, TextureFilterPresets); GraphicsQuality.ShadowQualityIndex = FindShadowQualityIndex(Ref.Shadows, ShadowQualityPresets); GraphicsQuality.RealtimeReflectionsIndex = FindReflectionsSettingIndex(Ref.RealtimeReflections, RealtimeReflectionsPresets); GraphicsQuality.LightShafts = FindLightShaftsSettingIndex(Ref.LightShafts, LightShaftsPresets) > 0; GraphicsQuality.VolumetricLighting = FindVolumetricLightingSettingIndex(Ref.VolumetricLighting, VolumetricLightingPresets) > 0; GraphicsQuality.LensFlares = FindLensFlareSettingIndex(Ref.LensFlares, LensFlarePresets) > 0; GraphicsQuality.AntiAliasingIndex = FindAntiAliasingSettingIndex(Ref.AntiAliasing, AntiAliasingPresets); GraphicsQuality.BloomIndex = FindBloomSettingIndex(Ref.Bloom, BloomPresets); GraphicsQuality.MotionBlurIndex = FindMotionBlurSettingIndex(Ref.MotionBlur, MotionBlurPresets); GraphicsQuality.AmbientOcclusionIndex = FindAmbientOcclusionSettingIndex(Ref.AmbientOcclusion, AmbientOcclusionPresets); GraphicsQuality.DOFIndex = FindDOFSettingIndex(Ref.DepthOfField, DOFPresets); GraphicsQuality.FlexIndex = FindFlexSettingIndex(Ref.Flex, FlexPresets); // Look for a match in the graphics quality presets for( i=0; i SettingsList) { local int i; for( i=0; i SettingsList) { local int i; for( i=0; i SettingsList) { local int i; for( i=0; i SettingsList) { // Return normalized [0.0, 1.0] value for the slider local float SliderValue; SliderValue = (Ref.FilmGrainScale - SettingsList[`MIN].FilmGrainScale) / (SettingsList[`MAX].FilmGrainScale - SettingsList[`MIN].FilmGrainScale); return FClamp(SliderValue, 0.0, 1.0); } function float GetFilmGrainSettingValue(float SliderValue, out array SettingsList) { // Convert [0.0, 1.0] slider value to actual setting value in the range [MinFilmGrainScale, MaxFilmGrainScale] local float FilmGrainScale; FilmGrainScale = SliderValue * (SettingsList[`MAX].FilmGrainScale - SettingsList[`MIN].FilmGrainScale) + SettingsList[`MIN].FilmGrainScale; return FClamp(FilmGrainScale, SettingsList[`MIN].FilmGrainScale, SettingsList[`MAX].FilmGrainScale); } static function GetScriptFilmGrainSettings(out FilmGrainSetting Setting){} static function SetScriptFilmGrainSettings(out FilmGrainSetting Setting){} // Overridden comparison operators for float comparisons static final operator(24) bool == (FilmGrainSetting A, FilmGrainSetting B) { return A.FilmGrainScale ~= B.FilmGrainScale; } static final operator(26) bool != (FilmGrainSetting A, FilmGrainSetting B) { return !(A==B); } // // Environment Detail // static function int FindEnvironmentDetailIndex(out EnvironmentDetailSetting Ref, array SettingsList) { local int i; for( i=0; i SettingsList) { local int i; for( i=0; i SettingsList) { local int i; for( i=0; i SettingsList) { local int i; for( i=0; i SettingsList) { local int i; for( i=0; i SettingsList) { local int i; for( i=0; i SettingsList) { local int i; for( i=0; i SettingsList) { local int i; for( i=0; i SettingsList) { local int i; for( i=0; i SettingsList) { local int i; for( i=0; i SettingsList) { local int i; for( i=0; i SettingsList) { local int i; for( i=0; i SettingsList) { local int i; for( i=0; i SettingsList) { local int i; for( i=0; i SettingsList) { local int i; for( i=0; i SettingsList) { local int i; for( i=0; i SupportedAspectRatioOptions; // Start clean i = 0; AvailableAspectRatioList.Remove(0, AvailableAspectRatioList.length); // All. // No filter option. Unsupress all resolutions. SupportedAspectRatioOptions[i++] = AspectRatioString_All; AvailableAspectRatioList.AddItem(KFASPECTRATIO_All); // 4:3 if( IsAspectRatioAvailable(KFASPECTRATIO_Standard_4_3) ) { SupportedAspectRatioOptions[i++] = StandardAspectRatioString_4_3; AvailableAspectRatioList.AddItem(KFASPECTRATIO_Standard_4_3); } // 5:4 if( IsAspectRatioAvailable(KFASPECTRATIO_Standard_5_4) ) { SupportedAspectRatioOptions[i++] = StandardAspectRatioString_5_4; AvailableAspectRatioList.AddItem(KFASPECTRATIO_Standard_5_4); } // 3:2 if( IsAspectRatioAvailable(KFASPECTRATIO_Standard_3_2) ) { SupportedAspectRatioOptions[i++] = StandardAspectRatioString_3_2; AvailableAspectRatioList.AddItem(KFASPECTRATIO_Standard_3_2); } // 16:9 if( IsAspectRatioAvailable(KFASPECTRATIO_Wide_16_9) ) { SupportedAspectRatioOptions[i++] = WideAspectRatioString_16_9; AvailableAspectRatioList.AddItem(KFASPECTRATIO_Wide_16_9); } // 16:10 if( IsAspectRatioAvailable(KFASPECTRATIO_Wide_16_10) ) { SupportedAspectRatioOptions[i++] = WideAspectRatioString_16_10; AvailableAspectRatioList.AddItem(KFASPECTRATIO_Wide_16_10); } // 2:1 if( IsAspectRatioAvailable(KFASPECTRATIO_ExtraWide_2_1) ) { SupportedAspectRatioOptions[i++] = ExtraWideAspectRatioString_2_1; AvailableAspectRatioList.AddItem(KFASPECTRATIO_ExtraWide_2_1); } // 21:9 if( IsAspectRatioAvailable(KFASPECTRATIO_ExtraWide_21_9) ) { SupportedAspectRatioOptions[i++] = ExtraWideAspectRatioString_21_9; AvailableAspectRatioList.AddItem(KFASPECTRATIO_ExtraWide_21_9); } // Multi-monitor if( IsAspectRatioAvailable(KFASPECTRATIO_MultiMonitor) ) { SupportedAspectRatioOptions[i++] = MultiMonitorAspectRatioString; AvailableAspectRatioList.AddItem(KFASPECTRATIO_MultiMonitor); } LocalizedObject.SetObject("aspectRatioOptions", MakeDataProvider(SupportedAspectRatioOptions)); } function SetFullScreenOptions(out GFxObject LocalizedObject) { LocalizedObject.SetObject("fullscreenOptions", MakeDataProvider(FullScreenStringOptions)); } function SetGraphicsQualityOptions(out GFxObject LocalizedObject) { LocalizedObject.SetObject("graphicsOptions", MakeDataProvider(GraphicsQualityStringOptions)); } function SetVSyncOptions(out GFxObject LocalizedObject) { LocalizedObject.SetObject("vSyncOptions", MakeDataProvider(VSyncStringOptions)); } function SetEnvironmentDetailOptions(out GFxObject LocalizedObject) { LocalizedObject.SetObject("environmentDetailOptions", MakeDataProvider(EnvironmentDetailsStringOptions)); } function SetCharacterDetailOptions(out GFxObject LocalizedObject) { LocalizedObject.SetObject("characterDetailOptions", MakeDataProvider(CharacterDetailStringOptions)); } function SetFXOptions(out GFxObject LocalizedObject) { LocalizedObject.SetObject("fxOptions", MakeDataProvider(FXStringOptions)); } function SetTextureResolutionOptions(out GFxObject LocalizedObject) { LocalizedObject.SetObject("textureResolutionOptions", MakeDataProvider(TextureResolutionStringOptions)); } function SetTextureFilteringOptions(out GFxObject LocalizedObject) { LocalizedObject.SetObject("textureFilteringOptions", MakeDataProvider(TextureFilteringStringOptions)); } function SetShadowOptions(out GFxObject LocalizedObject) { LocalizedObject.SetObject("shadowsOptions", MakeDataProvider(ShadowsStringOptions)); } function SetRealtimeReflectionsOptions(out GFxObject LocalizedObject) { LocalizedObject.SetObject("realtimeReflectionsOptions", MakeDataProvider(RealtimeReflectionsStringOptions)); } function SetAntiAliasingOptions(out GFxObject LocalizedObject) { LocalizedObject.SetObject("antiAliasingOptions", MakeDataProvider(AntiAliasingStringOptions)); } function SetBloomOptions(out GFxObject LocalizedObject) { LocalizedObject.SetObject("bloomOptions", MakeDataProvider(BloomStringOptions)); } function SetMotionBlurOptions(out GFxObject LocalizedObject) { LocalizedObject.SetObject("motionBlurOptions", MakeDataProvider(MotionBlurStringOptions)); } function SetAmbientOcclusionOptions(out GFxObject LocalizedObject) { LocalizedObject.SetObject("ambientOcclusionOptions", MakeDataProvider(AmbientOcclusionStringOptions)); } function SetDepthOfFieldOptions(out GFxObject LocalizedObject) { LocalizedObject.SetObject("depthOfFieldOptions", MakeDataProvider(DepthOfFieldStringOptions)); } function SetVolumetricLightingOptions(out GFxObject LocalizedObject) { LocalizedObject.SetObject("volumetricLightingOptions", MakeDataProvider(OffOnStringOptions)); } function SetLensFlareOptions(out GFxObject LocalizedObject) { LocalizedObject.SetObject("lensFlaresOptions", MakeDataProvider(OffOnStringOptions)); } function SetLightShaftOptions(out GFxObject LocalizedObject) { LocalizedObject.SetObject("lightShaftsOptions", MakeDataProvider(OffOnStringOptions)); } function SetPhysicsLevelOptions(out GFxObject LocalizedObject) { LocalizedObject.SetObject("physicsLevelOptions", MakeDataProvider(PhysicsLevelOptionStrings)); } // ***************************************************************************************** function LocalizeText() { local GFxObject LocalizedObject; LocalizedObject = CreateObject( "Object" ); LocalizedObject.SetString("graphics", Caps(class'KFGFxOptionsMenu_Selection'.default.OptionStrings[OM_Video])); LocalizedObject.SetString("basic", Caps(BasicString)); LocalizedObject.SetString("advanced", Caps(AdvancedString)); LocalizedObject.SetString("effects", EffectsString); LocalizedObject.SetString("physicsLevel", PhysicsLevelString); LocalizedObject.SetString("aspectRatio", AspectRatioString); LocalizedObject.SetString("resolution", ResolutionString); LocalizedObject.SetString("graphicsQuality", GraphicsQualityString); LocalizedObject.SetString("vSync", VSyncString); LocalizedObject.SetString("fullscreen", FullscreenString); LocalizedObject.SetString("variableFrameRate", VariableFrameRateString); LocalizedObject.SetString("adjustGamma", AdjustGammaString); LocalizedObject.SetString("filmGrain", FilmGrainString); LocalizedObject.SetString("environmentDetails", EnvironmentDetailsString); LocalizedObject.SetString("characterDetail", CharacterDetailString); LocalizedObject.SetString("fx", FXString); LocalizedObject.SetString("textureResolution", TextureResolutionString); LocalizedObject.SetString("textureFiltering", TextureFilteringString); LocalizedObject.SetString("shadows", ShadowsString); LocalizedObject.SetString("realtimeReflections", RealtimeReflectionsString); LocalizedObject.SetString("antiAliasing", AntiAliasingString); LocalizedObject.SetString("bloom", BloomString); LocalizedObject.SetString("motionBlur", MotionBlurString); LocalizedObject.SetString("ambientOcclusion", AmbientOcclusionString); LocalizedObject.SetString("depthOfField", DepthOfFieldString); LocalizedObject.SetString("volumetricLighting", VolumetricLightingString); LocalizedObject.SetString("lensFlares", LensFlaresString); LocalizedObject.SetString("lightShafts", LightShaftsString); LocalizedObject.SetString("customString", CustomString); LocalizedObject.SetString("iniOverrideString", IniOverrideString); LocalizedObject.SetString("apply", ApplyString); LocalizedObject.SetString("close", Class'KFCommon_LocalizedStrings'.default.BackString); LocalizedObject.SetString("default", DefaultString); LocalizedObject.SetObject("physicsSuggestionsArray", MakeDataProvider(PhysicsLevelSuggestionStrings) ); // Populate the options. SetAspectRatioOptions(LocalizedObject); SetFullScreenOptions(LocalizedObject); SetGraphicsQualityOptions(LocalizedObject); SetVSyncOptions(LocalizedObject); SetEnvironmentDetailOptions(LocalizedObject); SetCharacterDetailOptions(LocalizedObject); SetFXOptions(LocalizedObject); SetTextureResolutionOptions(LocalizedObject); SetTextureFilteringOptions(LocalizedObject); SetShadowOptions(LocalizedObject); SetRealTimeReflectionsOptions(LocalizedObject); SetAntiAliasingOptions(LocalizedObject); SetBloomOptions(LocalizedObject); SetMotionBlurOptions(LocalizedObject); SetAmbientOcclusionOptions(LocalizedObject); SetDepthOfFieldOptions(LocalizedObject); SetVolumetricLightingOptions(LocalizedObject); SetLensFlareOptions(LocalizedObject); SetLightShaftOptions(LocalizedObject); SetPhysicsLevelOptions(LocalizedObject); SetObject("localizedText", LocalizedObject); } //Returns an array for a dataProvider to be read in via GFX function GFxObject MakeDataProvider(const out array SourceText) { local GFxObject DataProvider; local byte i; DataProvider = CreateArray(); for (i = 0; i < SourceText.Length; i++) { DataProvider.SetElementString(i, SourceText[i]); } return DataProvider; } // Maps from compat level to graphics quality setting static function int GetGraphicsQualityFromCompat(int CompatLevel) { switch( CompatLevel) { case 0: // Unsupported. // Setting to low settings for now. We may want to catch that earlier // and let the user know that he won't be able to run the game return 0; case 1: // Low return 0; case 2: // Medium return 1; case 3: case 4: case 5: // 3,4,5 all map to high. Ultra is never assigned by default return 2; case 6: // Ultra setting (forced only) return 3; case 7: // High + Low Flex (forced only) return 4; case 8: // High + High Flex (forced only) return 5; case 9: // Ultra + High Flex (forced only) return 6; default: `log("[AppCompat]" @ CompatLevel @ " is not a valid compat level. Defaulting to medium settings" ); return 1; } } // Called during engine initialization to set graphics options static event SetCompatibilityLevel(int CompatLevel) { local GraphicsQualitySetting GraphicsQuality; local int GraphicsQualityIndex; GraphicsQualityIndex = GetGraphicsQualityFromCompat(CompatLevel); if( GraphicsQualityIndex >= 0 && GraphicsQualityIndex < default.GraphicsQualityPresets.length ) { // Get base graphics quality GraphicsQuality = default.GraphicsQualityPresets[GraphicsQualityIndex]; // Apply settings SetGraphicsQuality(GraphicsQuality, false); } } // Apply settings for the passed in graphics quality static event SetGraphicsQuality(GraphicsQualitySetting GraphicsQuality, bool bPreserveUserOverrides) { local GFXSettings NewGFXSettings; // // Initialize with current settings (for resolution, etc.) // GetCurrentGFXSettings(NewGFXSettings); // // Populate the advanced settings // NOTE: If bPreserveUserOverrides is specified, check whether current setting belongs to a preset or not before assigning one of the presets. // This done to preserve settings that a user has tweaked manually in the INI. The check will fail in // that case, and GSA (or AppCompat) will leave that setting alone (preserging the user override) // if( !bPreserveUserOverrides || FindEnvironmentDetailIndex(NewGFXSettings.EnvironmentDetail, default.EnvironmentDetailPresets) != INDEX_NONE ) { NewGFXSettings.EnvironmentDetail = default.EnvironmentDetailPresets[GraphicsQuality.EnvironmentDetailIndex]; } if( !bPreserveUserOverrides || FindCharacterDetailIndex(NewGFXSettings.CharacterDetail, default.CharacterDetailPresets) != INDEX_NONE ) { NewGFXSettings.CharacterDetail = default.CharacterDetailPresets[GraphicsQuality.CharacterDetailIndex]; } if( !bPreserveUserOverrides || FindFXQualityIndex(NewGFXSettings.FX, default.FXQualityPresets) != INDEX_NONE ) { NewGFXSettings.FX = default.FXQualityPresets[GraphicsQuality.FXQualityIndex]; } if( !bPreserveUserOverrides || FindTextureResolutionSettingIndex(NewGFXSettings.TextureResolution, default.TextureResolutionPresets) != INDEX_NONE ) { NewGFXSettings.TextureResolution = default.TextureResolutionPresets[GraphicsQuality.TextureResolutionIndex]; } if( !bPreserveUserOverrides || FindTextureFilterSettingIndex(NewGFXSettings.TextureFiltering, default.TextureFilterPresets) != INDEX_NONE ) { NewGFXSettings.TextureFiltering = default.TextureFilterPresets[GraphicsQuality.TextureFilteringIndex]; } if( !bPreserveUserOverrides || FindShadowQualityIndex(NewGFXSettings.Shadows, default.ShadowQualityPresets) != INDEX_NONE ) { NewGFXSettings.Shadows = default.ShadowQualityPresets[GraphicsQuality.ShadowQualityIndex]; } if( !bPreserveUserOverrides || FindReflectionsSettingIndex(NewGFXSettings.RealtimeReflections, default.RealtimeReflectionsPresets) != INDEX_NONE ) { NewGFXSettings.RealtimeReflections = default.RealtimeReflectionsPresets[GraphicsQuality.RealtimeReflectionsIndex]; } if( !bPreserveUserOverrides || FindLightShaftsSettingIndex(NewGFXSettings.LightShafts, default.LightShaftsPresets) != INDEX_NONE ) { NewGFXSettings.LightShafts = default.LightShaftsPresets[GraphicsQuality.LightShafts ? 1 : 0]; } if( !bPreserveUserOverrides || FindVolumetricLightingSettingIndex(NewGFXSettings.VolumetricLighting, default.VolumetricLightingPresets) != INDEX_NONE ) { NewGFXSettings.VolumetricLighting = default.VolumetricLightingPresets[GraphicsQuality.VolumetricLighting ? 1 : 0]; } if( !bPreserveUserOverrides || FindLensFlareSettingIndex(NewGFXSettings.LensFlares, default.LensFlarePresets) != INDEX_NONE ) { NewGFXSettings.LensFlares = default.LensFlarePresets[GraphicsQuality.LensFlares ? 1 : 0]; } if( !bPreserveUserOverrides || FindAntiAliasingSettingIndex(NewGFXSettings.AntiAliasing, default.AntiAliasingPresets) != INDEX_NONE ) { NewGFXSettings.AntiAliasing = default.AntiAliasingPresets[GraphicsQuality.AntiAliasingIndex]; } if( !bPreserveUserOverrides || FindBloomSettingIndex(NewGFXSettings.Bloom, default.BloomPresets) != INDEX_NONE ) { NewGFXSettings.Bloom = default.BloomPresets[GraphicsQuality.BloomIndex]; } if( !bPreserveUserOverrides || FindMotionBlurSettingIndex(NewGFXSettings.MotionBlur, default.MotionBlurPresets) != INDEX_NONE ) { NewGFXSettings.MotionBlur = default.MotionBlurPresets[GraphicsQuality.MotionBlurIndex]; } if( !bPreserveUserOverrides || FindAmbientOcclusionSettingIndex(NewGFXSettings.AmbientOcclusion, default.AmbientOcclusionPresets) != INDEX_NONE ) { NewGFXSettings.AmbientOcclusion = default.AmbientOcclusionPresets[GraphicsQuality.AmbientOcclusionIndex]; } if( !bPreserveUserOverrides || FindDOFSettingIndex(NewGFXSettings.DepthOfField, default.DOFPresets) != INDEX_NONE ) { NewGFXSettings.DepthOfField = default.DOFPresets[GraphicsQuality.DOFIndex]; } if( !bPreserveUserOverrides || FindFlexSettingIndex(NewGFXSettings.Flex, default.FlexPresets) != INDEX_NONE ) { NewGFXSettings.Flex = default.FlexPresets[GraphicsQuality.FlexIndex]; } // Apply the new settings // Ideally, we should be calling SetGFXSettings() instead of the following // but SetGFXSettings() is not a static function. So we have to do this work around. SetNativeSettings(NewGFXSettings); SetScriptSettings(NewGFXSettings); // Keep GSA in sync UpdateGSA(NewGFXSettings); } function InitValues() { local GFxObject ValuesObject; local int GraphicsQualityIndex; local int DisplayIndex; local int VSyncSettingIndex; local int VariableFramerateSettingIndex; local int EnvironmentDetailIndex; local int ShadowQualityIndex; local int FXQualityIndex; local int ReflectionsSettingIndex; local int CharacterDetailIndex; local int LightShaftsSettingIndex; local int VolumetricLightingSettingIndex; local int LensFlareSettingIndex; local int TextureResolutionSettingIndex; local int TextureFilterSettingIndex; local int BloomSettingIndex; local int MotionBlurSettingIndex; local int AntiAliasingSettingIndex; local int AmbientOcclusionSettingIndex; local int DOFSettingIndex; local float FilmGrainSliderValue; local int FlexSettingIndex; ValuesObject = GetObject("options"); // TODO:SAVE - need to find PC Values to be included here // // Basic Graphics Quality Setting // Passing -1 defaults to "Custom" // GraphicsQualityIndex = FindGraphicsQualitySettingIndex(CurrentGFXSettings, GraphicsQualityPresets); ValuesObject.SetInt("graphics", GraphicsQualityIndex); // // Vsync // VSyncSettingIndex = FindVSyncSettingIndex(CurrentGFXSettings.VSync, VSyncPresets); if(VSyncSettingIndex >= 0 && VSyncSettingIndex < VSyncPresets.length) { ValuesObject.SetInt("vSync", VSyncSettingIndex); } // // Display // DisplayIndex = FindDisplaySettingIndex(CurrentGFXSettings.Display, DisplayPresets); if(DisplayIndex >= 0 && DisplayIndex < DisplayPresets.length) { ValuesObject.SetInt("fullScreen", DisplayIndex); } // // Variable frame rate // VariableFramerateSettingIndex = FindVariableFPSSettingIndex(CurrentGFXSettings.VariableFPS, VariableFrameratePresets); if(VariableFramerateSettingIndex >= 0 && VariableFramerateSettingIndex < VariableFrameratePresets.length) { ValuesObject.SetBool("variableFrameRate", VariableFramerateSettingIndex > 0); } // // Film grain // FilmGrainSliderValue = GetFilmGrainSliderValue(CurrentGFXSettings.FilmGrain, FilmGrainMinMaxPreset); ValuesObject.SetFloat("filmGrain", FilmGrainSliderValue); // // Advanced Settings // Passing -1 defaults to "Custom" // EnvironmentDetailIndex = FindEnvironmentDetailIndex(CurrentGFXSettings.EnvironmentDetail, EnvironmentDetailPresets); ValuesObject.SetInt("environmentDetail", EnvironmentDetailIndex); CharacterDetailIndex = FindCharacterDetailIndex(CurrentGFXSettings.CharacterDetail, CharacterDetailPresets); ValuesObject.SetInt("characterDetail", CharacterDetailIndex); FXQualityIndex = FindFXQualityIndex(CurrentGFXSettings.FX, FXQualityPresets); ValuesObject.SetInt("fx", FXQualityIndex); TextureResolutionSettingIndex = FindTextureResolutionSettingIndex(CurrentGFXSettings.TextureResolution, TextureResolutionPresets); ValuesObject.SetInt("textureResolution", TextureResolutionSettingIndex); TextureFilterSettingIndex = FindTextureFilterSettingIndex(CurrentGFXSettings.TextureFiltering, TextureFilterPresets); ValuesObject.SetInt("textureFiltering", TextureFilterSettingIndex); ShadowQualityIndex = FindShadowQualityIndex(CurrentGFXSettings.Shadows, ShadowQualityPresets); ValuesObject.SetInt("shadows", ShadowQualityIndex); ReflectionsSettingIndex = FindReflectionsSettingIndex(CurrentGFXSettings.RealtimeReflections, RealtimeReflectionsPresets); ValuesObject.SetInt("realtimeReflections", ReflectionsSettingIndex); AntiAliasingSettingIndex = FindAntiAliasingSettingIndex(CurrentGFXSettings.AntiAliasing, AntiAliasingPresets); ValuesObject.SetInt("antiAliasing", AntiAliasingSettingIndex); BloomSettingIndex = FindBloomSettingIndex(CurrentGFXSettings.Bloom, BloomPresets); ValuesObject.SetInt("bloom", BloomSettingIndex); MotionBlurSettingIndex = FindMotionBlurSettingIndex(CurrentGFXSettings.MotionBlur, MotionBlurPresets); ValuesObject.SetInt("motionBlur", MotionBlurSettingIndex); AmbientOcclusionSettingIndex = FindAmbientOcclusionSettingIndex(CurrentGFXSettings.AmbientOcclusion, AmbientOcclusionPresets); ValuesObject.SetInt("ambientOcclusion", AmbientOcclusionSettingIndex); DOFSettingIndex = FindDOFSettingIndex(CurrentGFXSettings.DepthOfField, DOFPresets); ValuesObject.SetInt("depthOfField", DOFSettingIndex); LightShaftsSettingIndex = FindLightShaftsSettingIndex(CurrentGFXSettings.LightShafts, LightShaftsPresets); ValuesObject.SetInt("lightShafts", LightShaftsSettingIndex); VolumetricLightingSettingIndex = FindVolumetricLightingSettingIndex(CurrentGFXSettings.VolumetricLighting, VolumetricLightingPresets); ValuesObject.SetInt("volumetricLighting", VolumetricLightingSettingIndex); LensFlareSettingIndex = FindLensFlareSettingIndex(CurrentGFXSettings.LensFlares, LensFlarePresets); ValuesObject.SetInt("lensFlares", LensFlareSettingIndex); FlexSettingIndex = FindFlexSettingIndex(CurrentGFXSettings.Flex, FlexPresets); ValuesObject.SetInt("physicsLevel", FlexSettingIndex); // // Update the UI // SetObject("options", ValuesObject); } /** Function to get current GFX settings. This will grab both native and script settings, and is the recommended funtion to use to query the current settings. */ static function GetCurrentGFXSettings(out GFXSettings CurrentSettings) { GetCurrentNativeSettings(CurrentSettings); GetCurrentScriptSettings(CurrentSettings); } /** Wrapper function that updates the native side system settings, the script side settings, and also updates the book keeping variables */ function SetGFXSettings(GFXSettings NewSettings) { // Store a copy of the current settings to support reverts RevertedGFXSettings = CurrentGFXSettings; // Actual update SetNativeSettings(NewSettings); SetScriptSettings(NewSettings); // Update the current settings CurrentGFXSettings = NewSettings; // Keep GSA in sync UpdateGSA(NewSettings); } function GetModifiedGFXSettings(out GFXSettings NewSettings) { local array ResolutionStringArr; local GFxObject OptionsObj; local int ResolutionIndex; local int DisplayIndex; local int VSyncSettingIndex; local int VariableFramerateSettingIndex; local int EnvironmentDetailIndex; local int ShadowQualityIndex; local int FXQualityIndex; local int ReflectionsSettingIndex; local int CharacterDetailIndex; local int LightShaftsSettingIndex; local int VolumetricLightingSettingIndex; local int LensFlareSettingIndex; local int TextureResolutionSettingIndex; local int TextureFilterSettingIndex; local int BloomSettingIndex; local int MotionBlurSettingIndex; local int AntiAliasingSettingIndex; local int AmbientOcclusionSettingIndex; local int DOFSettingIndex; local int FlexSettingIndex; local float FilmGrainSliderValue; OptionsObj = GetObject("options"); ResolutionIndex = OptionsObj.GetInt("resolution"); ResolutionStringArr = SplitString( SupportedResolutionList[ResolutionIndex], "x", true ); NewSettings.Resolution.ResX = int(ResolutionStringArr[0]); NewSettings.Resolution.ResY = int(ResolutionStringArr[1]); VSyncSettingIndex = OptionsObj.GetInt("vSync"); if( VSyncSettingIndex >= 0 && VSyncSettingIndex < VSyncPresets.length ) { NewSettings.VSync = VSyncPresets[VSyncSettingIndex]; } DisplayIndex = OptionsObj.GetInt("fullScreen"); if( DisplayIndex >= 0 && DisplayIndex < DisplayPresets.length ) { NewSettings.Display = DisplayPresets[DisplayIndex]; } VariableFramerateSettingIndex = OptionsObj.GetBool("variableFrameRate") ? 1 : 0; if( VariableFramerateSettingIndex >= 0 && VariableFramerateSettingIndex < VariableFrameratePresets.length ) { NewSettings.VariableFPS = VariableFrameratePresets[VariableFramerateSettingIndex]; } FilmGrainSliderValue = OptionsObj.GetFloat("filmGrain"); NewSettings.FilmGrain.FilmGrainScale = GetFilmGrainSettingValue(FilmGrainSliderValue, FilmGrainMinMaxPreset); FlexSettingIndex = OptionsObj.GetInt("physicsLevel"); if( FlexSettingIndex >= 0 && FlexSettingIndex < FlexPresets.length ) { NewSettings.Flex = FlexPresets[FlexSettingIndex]; } EnvironmentDetailIndex = OptionsObj.GetInt("environmentDetail"); if( EnvironmentDetailIndex >= 0 && EnvironmentDetailIndex < EnvironmentDetailPresets.length ) { NewSettings.EnvironmentDetail = EnvironmentDetailPresets[EnvironmentDetailIndex]; } CharacterDetailIndex = OptionsObj.GetInt("characterDetail"); if( CharacterDetailIndex >= 0 && CharacterDetailIndex < CharacterDetailPresets.length ) { NewSettings.CharacterDetail = CharacterDetailPresets[CharacterDetailIndex]; } FXQualityIndex = OptionsObj.GetInt("fx"); if( FXQualityIndex >= 0 && FXQualityIndex < FXQualityPresets.length ) { NewSettings.FX = FXQualityPresets[FXQualityIndex]; } TextureResolutionSettingIndex = OptionsObj.GetInt("textureResolution"); if( TextureResolutionSettingIndex >= 0 && TextureResolutionSettingIndex < TextureResolutionPresets.length ) { NewSettings.TextureResolution = TextureResolutionPresets[TextureResolutionSettingIndex]; } TextureFilterSettingIndex = OptionsObj.GetInt("textureFiltering"); if( TextureFilterSettingIndex >= 0 && TextureFilterSettingIndex < TextureFilterPresets.length ) { NewSettings.TextureFiltering = TextureFilterPresets[TextureFilterSettingIndex]; } ShadowQualityIndex = OptionsObj.GetInt("shadows"); if( ShadowQualityIndex >= 0 && ShadowQualityIndex < ShadowQualityPresets.length ) { NewSettings.Shadows = ShadowQualityPresets[ShadowQualityIndex]; } ReflectionsSettingIndex = OptionsObj.GetInt("realtimeReflections"); if( ReflectionsSettingIndex >= 0 && ReflectionsSettingIndex < RealtimeReflectionsPresets.length ) { NewSettings.RealtimeReflections = RealtimeReflectionsPresets[ReflectionsSettingIndex]; } AntiAliasingSettingIndex = OptionsObj.GetInt("antiAliasing"); if( AntiAliasingSettingIndex >= 0 && AntiAliasingSettingIndex < AntiAliasingPresets.length ) { NewSettings.AntiAliasing = AntiAliasingPresets[AntiAliasingSettingIndex]; } BloomSettingIndex = OptionsObj.GetInt("bloom"); if( BloomSettingIndex >= 0 && BloomSettingIndex < BloomPresets.length ) { NewSettings.Bloom = BloomPresets[BloomSettingIndex]; } MotionBlurSettingIndex = OptionsObj.GetInt("motionBlur"); if( MotionBlurSettingIndex >= 0 && MotionBlurSettingIndex < MotionBlurPresets.length ) { NewSettings.MotionBlur = MotionBlurPresets[MotionBlurSettingIndex]; } AmbientOcclusionSettingIndex = OptionsObj.GetInt("ambientOcclusion"); if( AmbientOcclusionSettingIndex >= 0 && AmbientOcclusionSettingIndex < AmbientOcclusionPresets.length ) { NewSettings.AmbientOcclusion = AmbientOcclusionPresets[AmbientOcclusionSettingIndex]; } DOFSettingIndex = OptionsObj.GetInt("depthOfField"); if( DOFSettingIndex >= 0 && DOFSettingIndex < DOFPresets.length ) { NewSettings.DepthOfField = DOFPresets[DOFSettingIndex]; } LightShaftsSettingIndex = OptionsObj.GetInt("lightShafts"); if( LightShaftsSettingIndex >= 0 && LightShaftsSettingIndex < LightShaftsPresets.length ) { NewSettings.LightShafts = LightShaftsPresets[LightShaftsSettingIndex]; } VolumetricLightingSettingIndex = OptionsObj.GetInt("volumetricLighting"); if( VolumetricLightingSettingIndex >= 0 && VolumetricLightingSettingIndex < VolumetricLightingPresets.length ) { NewSettings.VolumetricLighting = VolumetricLightingPresets[VolumetricLightingSettingIndex]; } LensFlareSettingIndex = OptionsObj.GetInt("lensFlares"); if( LensFlareSettingIndex >= 0 && LensFlareSettingIndex < LensFlarePresets.length ) { NewSettings.LensFlares = LensFlarePresets[LensFlareSettingIndex]; } AdjustModifiedGFXSettings(NewSettings); } function AdjustModifiedGFXSettings(out GFXSettings NewSettings) { local string MonitorResolution; local array ResolutionStringArr; local array MonitorResolutionStringArr; local GFxObject OptionsObj; local int ResolutionIndex; local int i; local bool NewSettingIsBorderless; local bool OldSettingIsNotBorderless; NewSettingIsBorderless = NewSettings.Display.BorderlessWindow && !NewSettings.Display.Fullscreen; OldSettingIsNotBorderless = !(CurrentGFXSettings.Display.BorderlessWindow && !CurrentGFXSettings.Display.Fullscreen); // Adjust resolution in case we are in changing to borderless mode if(NewSettingIsBorderless && OldSettingIsNotBorderless) { // Get current monitor resolution MonitorResolution = GetMonitorResolution(); if(MonitorResolution != "") { // Put the biggest resolution just in case ResolutionIndex = SupportedResolutionList.length - 1; // Search for the correct resolution among all the possible that the game support for( i=0 ; i= 0 && GraphicsQualityIndex < GraphicsQualityPresets.length ) { GraphicsQuality = GraphicsQualityPresets[GraphicsQualityIndex]; OptionsObj.SetInt("environmentDetail", GraphicsQuality.EnvironmentDetailIndex); OptionsObj.SetInt("characterDetail", GraphicsQuality.CharacterDetailIndex); OptionsObj.SetInt("fx", GraphicsQuality.FXQualityIndex); OptionsObj.SetInt("textureResolution", GraphicsQuality.TextureResolutionIndex); OptionsObj.SetInt("textureFiltering", GraphicsQuality.TextureFilteringIndex); OptionsObj.SetInt("shadows", GraphicsQuality.ShadowQualityIndex); OptionsObj.SetInt("realtimeReflections", GraphicsQuality.RealtimeReflectionsIndex); OptionsObj.SetBool("lightShafts", GraphicsQuality.LightShafts); OptionsObj.SetBool("volumetricLighting", GraphicsQuality.VolumetricLighting); OptionsObj.SetBool("lensFlares", GraphicsQuality.LensFlares); OptionsObj.SetInt("antiAliasing", GraphicsQuality.AntiAliasingIndex); OptionsObj.SetInt("bloom", GraphicsQuality.BloomIndex); OptionsObj.SetInt("motionBlur", GraphicsQuality.MotionBlurIndex); OptionsObj.SetInt("ambientOcclusion", GraphicsQuality.AmbientOcclusionIndex); OptionsObj.SetInt("depthOfField", GraphicsQuality.DOFIndex); OptionsObj.SetInt("physicsLevel", GraphicsQuality.FlexIndex); SetObject("options", OptionsObj); } } function OneSecondLoop() { local byte TimeLeft; local string TempString; if(Manager != none && Manager.CurrentPopUp != none && bIsRevertCoundownActive && IsViewportInFocus()) { if(TimeCount < ExpireTime) { TimeLeft = ExpireTime - TimeCount; TempString = Repl(RevertPopupDescriptionString, "%x%", TimeLeft, true); Manager.CurrentPopUp.UpdateDescritionText(TempString); TimeCount++; } else { RevertSettings(); Manager.UnloadCurrentPopup(); } } } /** Called when Apply is clicked in the menu */ function Apply() { local GFXSettings NewGFXSettings; // These need to by bytes because UnrealScript doesn't support bools as out parameters local byte UpdateSystemSettings; local byte NeedsRestart; local byte PerformanceWarningLevel; local byte NeedsRevertCountdown; // Get the current settings GetCurrentGFXSettings(CurrentGFXSettings); // Get the modified settings (if any) // Initialize with current settings so that we don't have invalid values for INI Overrides NewGFXSettings = CurrentGFXSettings; GetModifiedGFXSettings(NewGFXSettings); // Check to see if there where any udpates UpdateSystemSettings = 0; NeedsRestart = 0; NeedsRevertCountdown = 0; PerformanceWarningLevel=PerfWarning_None; CheckForChangedSettings(NewGFXSettings, UpdateSystemSettings, NeedsRestart, PerformanceWarningLevel, NeedsRevertCountdown); //Apply changes and show popup if there where any udpates. if( UpdateSystemSettings != 0 ) { // Apply changes SetGFXSettings(NewGFXSettings); // ----------------------------------------------------------------- // Popup to revert settings. Show popup only if you need to display // a) Performance warning, or // b) Restart warning, or // c) Revert countdown // ----------------------------------------------------------------- if( PerformanceWarningLevel > PerfWarning_None || NeedsRestart > 0 || NeedsRevertCountdown > 0 ) { ShowRevertPopUp(PerformanceWarningLevel, NeedsRestart > 0, NeedsRevertCountdown > 0); } } } function ResetValues() { InitializeResolution(); InitValues(); } function RevertSettings() { //REVERT SetGFXSettings(RevertedGFXSettings); ResetValues(); bIsRevertCoundownActive = false; } function ShowRevertPopUp(byte PerfWarningLevel, bool bNeedsRestart, bool bNeedsRevertCountdown) { local string TempString; local string PromptString; bIsRevertCoundownActive = bNeedsRevertCountdown; TimeCount = 0; if( PerfWarningLevel > PerfWarning_None && bNeedsRestart ) { //Popup text PromptString = WarningPromptString; RevertPopupDescriptionString = Repl(Repl(DoubleWarningString, "%x%", PerformanceDescString[PerfWarningLevel-1], true), "%y%", RestartDescString, true); RevertPopupDescriptionString $= ". " $ ContinueString; if( bNeedsRevertCountdown ) { RevertPopupDescriptionString $= "\n\n" $ WillExpireString; TempString = Repl(RevertPopupDescriptionString, "%x%", ExpireTime, true); Manager.DelayedOpenPopup( EConfirmation, EDPPID_Misc,PromptString, TempString, OKString, CancelString, OnRestartConfirm, OnSettingsRevert); } else { Manager.DelayedOpenPopup( EConfirmation,EDPPID_Misc, PromptString, RevertPopupDescriptionString, OKString, CancelString, OnRestartConfirm, OnSettingsRevert); } } else if( PerfWarningLevel > PerfWarning_None ) { //Popup text PromptString = WarningPromptString; RevertPopupDescriptionString = Repl(SingleWarningString, "%x%", PerformanceDescString[PerfWarningLevel-1], true); RevertPopupDescriptionString $= ". " $ ContinueString; if( bNeedsRevertCountdown ) { RevertPopupDescriptionString $= "\n\n" $ WillExpireString; TempString = Repl(RevertPopupDescriptionString, "%x%", ExpireTime, true); Manager.DelayedOpenPopup( EConfirmation, EDPPID_Misc, PromptString, TempString, OKString, CancelString, OnSettingsConfirm, OnSettingsRevert); } else { Manager.DelayedOpenPopup( EConfirmation, EDPPID_Misc, PromptString, RevertPopupDescriptionString, OKString, CancelString, OnSettingsConfirm, OnSettingsRevert); } } else if( bNeedsRestart ) { //Popup text PromptString = WarningPromptString; RevertPopupDescriptionString = Repl(SingleWarningString, "%x%", RestartDescString, true); RevertPopupDescriptionString $= ". " $ ContinueString; if( bNeedsRevertCountdown ) { RevertPopupDescriptionString $= "\n\n" $ WillExpireString; TempString = Repl(RevertPopupDescriptionString, "%x%", ExpireTime, true); Manager.DelayedOpenPopup( EConfirmation, EDPPID_Misc, PromptString, TempString, OKString, CancelString, OnRestartConfirm, OnSettingsRevert); } else { Manager.DelayedOpenPopup( EConfirmation, EDPPID_Misc, PromptString, RevertPopupDescriptionString, OKString, CancelString, OnRestartConfirm, OnSettingsRevert); } } else { //Popup text RevertPopupDescriptionString = KeepSettingsPromptString; if( bNeedsRevertCountdown ) { RevertPopupDescriptionString $= "\n\n" $ WillExpireString; TempString = Repl(RevertPopupDescriptionString, "%x%", ExpireTime, true); Manager.DelayedOpenPopup( EConfirmation, EDPPID_Misc, PromptString, TempString, OKString, CancelString, OnSettingsConfirm, OnSettingsRevert); } else { Manager.DelayedOpenPopup( EConfirmation, EDPPID_Misc, PromptString, RevertPopupDescriptionString, OKString, CancelString, OnSettingsConfirm, OnSettingsRevert); } } } function OnGraphicsQualitySet(int Index) { // Update advanced settings UI UpdateAdvancedSettingsUI(Index); } /** Update the resolution list for the selected AspectRatio */ function UpdateResolutionList(SupportedAspectRatio InAspectRatio) { local int i; local int CurrentResolutionIndex; local GFxObject ResolutionSlot, DataProvider; local GFxObject OptionsObj; local string CurrentRes; // Selected value to display in resolution list drop box. // Current resolution if in list, otherwise the first entry in the list CurrentResolutionIndex = 0; // Resolution string for current resolution CurrentRes = CurrentGFXSettings.Resolution.ResX $"x" $CurrentGFXSettings.Resolution.ResY; // Update the resolution options based on given aspect ratio and the // list of resolutions that are supported by the adapter RefreshSupportedResolutions(InAspectRatio); // Populate the data provider with above list DataProvider = CreateArray(); for( i = 0; i < SupportedResolutionList.Length; i++ ) { ResolutionSlot = CreateObject( "Object" ); ResolutionSlot.SetString("label", SupportedResolutionList[i]); if ( CurrentRes == SupportedResolutionList[i] ) { CurrentResolutionIndex = i; } DataProvider.SetElementObject(i, ResolutionSlot); } // Update UI SetObject("resolutionOptions", DataProvider); // Update selected resolution display OptionsObj = GetObject("options"); OptionsObj.SetInt("resolution", CurrentResolutionIndex); SetObject("options", OptionsObj); } /** Callback when aspect ratio is changed. Populate the resolution list with supported resolutions for selected aspect ratio */ function OnAspectRatioSet(int Index) { UpdateResolutionList(AvailableAspectRatioList[Index]); } function OnAdvancedOptionChanged() { //`log("SET TO CUSTOM!"); } //============================================================== // Per setting callbacks // NOTE: These can be used to specify settings update or application // restart. Additionally you can also use logic here to warn about // performance implications. //============================================================== function OnResolutionSettingChanged(ResolutionSetting OldSetting, ResolutionSetting NewSetting, out byte bUpdateSystemSettings, out byte bRequiresRestart, out byte PerformanceWarningLevel, out byte bNeedsRevertCountdown) { bUpdateSystemSettings = bUpdateSystemSettings | 1; bNeedsRevertCountdown = bNeedsRevertCountdown | 1; } function OnVsyncSettingChanged(VSyncSetting OldSetting, VSyncSetting NewSetting, out byte bUpdateSystemSettings, out byte bRequiresRestart, out byte PerformanceWarningLevel, out byte bNeedsRevertCountdown) { bUpdateSystemSettings = bUpdateSystemSettings | 1; } function OnDisplaySettingChanged(DisplaySetting OldSetting, DisplaySetting NewSetting, out byte bUpdateSystemSettings, out byte bRequiresRestart, out byte PerformanceWarningLevel, out byte bNeedsRevertCountdown) { bUpdateSystemSettings = bUpdateSystemSettings | 1; bNeedsRevertCountdown = bNeedsRevertCountdown | 1; } function OnVariableFramerateSettingChanged(VariableFramerateSetting OldSetting, VariableFramerateSetting NewSetting, out byte bUpdateSystemSettings, out byte bRequiresRestart, out byte PerformanceWarningLevel, out byte bNeedsRevertCountdown) { bUpdateSystemSettings = bUpdateSystemSettings | 1; } function OnFilmGrainSettingChanged(FilmGrainSetting OldSetting, FilmGrainSetting NewSetting, out byte bUpdateSystemSettings, out byte bRequiresRestart, out byte PerformanceWarningLevel, out byte bNeedsRevertCountdown) { bUpdateSystemSettings = bUpdateSystemSettings | 1; } function OnEnvironmentDetailSettingChanged(EnvironmentDetailSetting OldSetting, EnvironmentDetailSetting NewSetting, out byte bUpdateSystemSettings, out byte bRequiresRestart, out byte PerformanceWarningLevel, out byte bNeedsRevertCountdown) { bUpdateSystemSettings = bUpdateSystemSettings | 1; bRequiresRestart = bRequiresRestart | 1; } function OnCharacterDetailSettingChanged(CharacterDetailSetting OldSetting, CharacterDetailSetting NewSetting, out byte bUpdateSystemSettings, out byte bRequiresRestart, out byte bNeedsRevertCountdown) { bUpdateSystemSettings = bUpdateSystemSettings | 1; } function OnFXQualitySettingChanged(FXQualitySetting OldSetting, FXQualitySetting NewSetting, out byte bUpdateSystemSettings, out byte bRequiresRestart, out byte PerformanceWarningLevel, out byte bNeedsRevertCountdown) { bUpdateSystemSettings = bUpdateSystemSettings | 1; bRequiresRestart = bRequiresRestart | 1; } function OnTextureResolutionSettingChanged(TextureResolutionSetting OldSetting, TextureResolutionSetting NewSetting, out byte bUpdateSystemSettings, out byte bRequiresRestart, out byte PerformanceWarningLevel, out byte bNeedsRevertCountdown) { bUpdateSystemSettings = bUpdateSystemSettings | 1; } function OnTextureFilteringSettingChanged(TextureFilterSetting OldSetting, TextureFilterSetting NewSetting, out byte bUpdateSystemSettings, out byte bRequiresRestart, out byte PerformanceWarningLevel, out byte bNeedsRevertCountdown) { bUpdateSystemSettings = bUpdateSystemSettings | 1; bRequiresRestart = bRequiresRestart | 1; } function OnShadowQualitySettingChanged(ShadowQualitySetting OldSetting, ShadowQualitySetting NewSetting, out byte bUpdateSystemSettings, out byte bRequiresRestart, out byte PerformanceWarningLevel, out byte bNeedsRevertCountdown) { bUpdateSystemSettings = bUpdateSystemSettings | 1; bRequiresRestart = bRequiresRestart | 1; } function OnReflectionSettingChanged(RealtimeReflectionsSetting OldSetting, RealtimeReflectionsSetting NewSetting, out byte bUpdateSystemSettings, out byte bRequiresRestart, out byte PerformanceWarningLevel, out byte bNeedsRevertCountdown) { bUpdateSystemSettings = bUpdateSystemSettings | 1; // Caution about possible performance drop if( !OldSetting.bAllowScreenSpaceReflections && NewSetting.bAllowScreenSpaceReflections ) { PerformanceWarningLevel = Max(PerformanceWarningLevel, PerfWarning_Normal); } } function OnAntiAliasingSettingChanged(AntiAliasingSetting OldSetting, AntiAliasingSetting NewSetting, out byte bUpdateSystemSettings, out byte bRequiresRestart, out byte PerformanceWarningLevel, out byte bNeedsRevertCountdown) { bUpdateSystemSettings = bUpdateSystemSettings | 1; } function OnBloomSettingChanged(BloomSetting OldSetting, BloomSetting NewSetting, out byte bUpdateSystemSettings, out byte bRequiresRestart, out byte PerformanceWarningLevel, out byte bNeedsRevertCountdown) { bUpdateSystemSettings = bUpdateSystemSettings | 1; } function OnMotionBlurSettingChanged(MotionBlurSetting OldSetting, MotionBlurSetting NewSetting, out byte bUpdateSystemSettings, out byte bRequiresRestart, out byte PerformanceWarningLevel, out byte bNeedsRevertCountdown) { bUpdateSystemSettings = bUpdateSystemSettings | 1; } function OnAmbientOcclusionSettingChanged(AmbientOcclusionSetting OldSetting, AmbientOcclusionSetting NewSetting, out byte bUpdateSystemSettings, out byte bRequiresRestart, out byte PerformanceWarningLevel, out byte bNeedsRevertCountdown) { bUpdateSystemSettings = bUpdateSystemSettings | 1; // Caution about possible performance drop if( NewSetting.HBAO ) { PerformanceWarningLevel = Max(PerformanceWarningLevel, PerfWarning_Normal); } } function OnDOFSettingChanged(DOFSetting OldSetting, DOFSetting NewSetting, out byte bUpdateSystemSettings, out byte bRequiresRestart, out byte PerformanceWarningLevel, out byte bNeedsRevertCountdown) { bUpdateSystemSettings = bUpdateSystemSettings | 1; } function OnVolumetricLightingSettingChanged(VolumetricLightingSetting OldSetting, VolumetricLightingSetting NewSetting, out byte bUpdateSystemSettings, out byte bRequiresRestart, out byte PerformanceWarningLevel, out byte bNeedsRevertCountdown) { bUpdateSystemSettings = bUpdateSystemSettings | 1; bRequiresRestart = bRequiresRestart | 1; } function OnLensFlareSettingChanged(LensFlareSetting OldSetting, LensFlareSetting NewSetting, out byte bUpdateSystemSettings, out byte bRequiresRestart, out byte PerformanceWarningLevel, out byte bNeedsRevertCountdown) { bUpdateSystemSettings = bUpdateSystemSettings | 1; bRequiresRestart = bRequiresRestart | 1; } function OnLightShaftsSettingChanged(LightShaftsSetting OldSetting, LightShaftsSetting NewSetting, out byte bUpdateSystemSettings, out byte bRequiresRestart, out byte PerformanceWarningLevel, out byte bNeedsRevertCountdown) { bUpdateSystemSettings = bUpdateSystemSettings | 1; } function OnFlexSettingChanged(FlexSetting OldSetting, FlexSetting NewSetting, out byte bUpdateSystemSettings, out byte bRequiresRestart, out byte PerformanceWarningLevel, out byte bNeedsRevertCountdown) { bUpdateSystemSettings = bUpdateSystemSettings | 1; bRequiresRestart = bRequiresRestart | 1; // Caution about possible performance drop if( NewSetting.FlexLevel > OldSetting.FlexLevel && NewSetting.FlexLevel == 1 ) { PerformanceWarningLevel = Max(PerformanceWarningLevel, PerfWarning_Normal); } if( NewSetting.FlexLevel > OldSetting.FlexLevel && NewSetting.FlexLevel == 2 ) { PerformanceWarningLevel = Max(PerformanceWarningLevel, PerfWarning_Severe); } } //============================================================== // @name Popup delegates //============================================================== function OnSettingsConfirm() { bIsRevertCoundownActive = false; } function OnRestartConfirm() { bIsRevertCoundownActive = false; ConsoleCommand("RESTART"); } function OnSettingsRevert() { RevertSettings(); } function OnSaveConfirm() { // Save unsaved changes SetGFXSettings(UnsavedGFXSettings); // Restart game if required if( UnsavedPendingRestart ) { ConsoleCommand("RESTART"); } Manager.OpenMenu( UI_OptionsSelection ); } function OnSaveCancel() { ResetValues(); Manager.OpenMenu( UI_OptionsSelection ); } /********************************************************************************************* * @name ActionScript Callbacks ********************************************************************************************* */ function Callback_CloseMenu() { local GFXSettings NewGFXSettings; local string PromptString; local string DescriptionString; // These need to by bytes because UnrealScript doesn't support bools as out parameters local byte UpdateSystemSettings; local byte NeedsRestart; local byte PerformanceWarningLevel; local byte NeedsRevertCountdown; // Get the current settings GetCurrentGFXSettings(CurrentGFXSettings); // Get the modified settings (if any) // Initialize with current settings so that we don't have invalid values for INI Overrides NewGFXSettings = CurrentGFXSettings; GetModifiedGFXSettings(NewGFXSettings); // Check to see if there where any udpates UpdateSystemSettings = 0; NeedsRestart = 0; NeedsRevertCountdown = 0; PerformanceWarningLevel=PerfWarning_None; CheckForChangedSettings(NewGFXSettings, UpdateSystemSettings, NeedsRestart, PerformanceWarningLevel, NeedsRevertCountdown); //Apply changes and show popup if there where any udpates. if( UpdateSystemSettings != 0 ) { // Cache the new but unsaved settings UnsavedGFXSettings = NewGFXSettings; UnsavedPendingRestart = NeedsRestart > 0; if( PerformanceWarningLevel > PerfWarning_None && NeedsRestart > 0 ) { //Popup text PromptString = WarningPromptString; DescriptionString = UnsavedChangesString $ ". "; DescriptionString $= Repl(Repl(DoubleWarningString, "%x%", PerformanceDescString[PerformanceWarningLevel-1], true), "%y%", RestartDescString, true) $ ". "; DescriptionString $= "\n\n" $ SaveChangesString; } else if( PerformanceWarningLevel > PerfWarning_None ) { //Popup text PromptString = WarningPromptString; DescriptionString = UnsavedChangesString $ ". "; DescriptionString $= Repl(SingleWarningString, "%x%", PerformanceDescString[PerformanceWarningLevel-1], true) $ ". "; DescriptionString $= "\n\n" $ SaveChangesString; } else if( NeedsRestart > 0 ) { //Popup text PromptString = WarningPromptString; DescriptionString = UnsavedChangesString $ ". "; DescriptionString $= Repl(SingleWarningString, "%x%", RestartDescString, true) $ ". "; DescriptionString $= "\n\n" $ SaveChangesString; } else { //Popup text PromptString = ""; DescriptionString = UnsavedChangesString $ ". "; DescriptionString $= "\n\n" $ SaveChangesString; } Manager.DelayedOpenPopup( EConfirmation, EDPPID_Misc, PromptString, DescriptionString, Class'KFCommon_LocalizedStrings'.default.YesString, Class'KFCommon_LocalizedStrings'.default.NoString, OnSaveConfirm, OnSaveCancel); } else { ResetValues(); Manager.OpenMenu( UI_OptionsSelection ); } } function Callback_FleXOptionChange(bool bShowPopUp) { if(bShowPopUp) { Manager.DelayedOpenPopup(ENotification, EDPPID_Misc, WarningPromptString, FlexPopUpString, class'KFCommon_LocalizedStrings'.default.OKString); } } function Callback_ApplyVideo() { Apply(); } function Callback_CancelVideo() { ResetValues(); Manager.OpenMenu( UI_OptionsSelection ); } function Callback_ResetDefaultVideo() { local GFxObject OptionsObj; local int GraphicsQualityIndex; local float FilmGrainSliderValue; local FilmGrainSetting DefultImageGrain; // Retrieve the current options OptionsObj = GetObject("options"); // Set graphics preset. // @TODO: Query from appcompat system. Defaulting to high for now. GraphicsQualityIndex = GetGraphicsQualityFromCompat(GetCompatLevel()); OptionsObj.SetInt("graphics", GraphicsQualityIndex); // Film grain scale = 1.0 DefultImageGrain.FilmGrainScale = 1.f; FilmGrainSliderValue = GetFilmGrainSliderValue(DefultImageGrain, FilmGrainMinMaxPreset); OptionsObj.SetFloat("filmGrain", FilmGrainSliderValue); // Vsync off OptionsObj.SetInt("vSync", 0); // Variable framerate off OptionsObj.SetBool("variableFrameRate", false); // Update options SetObject("options", OptionsObj); // Update the advanced settings options OnGraphicsQualitySet(GraphicsQualityIndex); } function Callback_OpenGamma() { Manager.SetVariableBool("bStartUpGamma", false); // Let the manager know if we are gamma for start up so we can block backing out of the popup - HSL Manager.DelayedOpenPopup(EGamma, EDPPID_Gamma, "", AdjustGammaDescription, ResetGammaString, SetGammaString); } defaultproperties { ExpireTime=30 //================================================================================================= // Preset values //================================================================================================= // Graphics Quality (Basic Setting) GraphicsQualityPresets(0)={(EnvironmentDetailIndex=0,CharacterDetailIndex=0,FXQualityIndex=0,TextureResolutionIndex=0,TextureFilteringIndex=0,ShadowQualityIndex=0,RealtimeReflectionsIndex=0,LightShafts=False,VolumetricLighting=False,LensFlares=False,AntiAliasingIndex=0,BloomIndex=0,MotionBlurIndex=0,AmbientOcclusionIndex=0,DOFIndex=0,FlexIndex=0)} GraphicsQualityPresets(1)={(EnvironmentDetailIndex=1,CharacterDetailIndex=0,FXQualityIndex=1,TextureResolutionIndex=1,TextureFilteringIndex=1,ShadowQualityIndex=1,RealtimeReflectionsIndex=0,LightShafts=False,VolumetricLighting=False,LensFlares=False,AntiAliasingIndex=1,BloomIndex=1,MotionBlurIndex=0,AmbientOcclusionIndex=0,DOFIndex=0,FlexIndex=0)} GraphicsQualityPresets(2)={(EnvironmentDetailIndex=2,CharacterDetailIndex=1,FXQualityIndex=2,TextureResolutionIndex=2,TextureFilteringIndex=2,ShadowQualityIndex=2,RealtimeReflectionsIndex=0,LightShafts=True,VolumetricLighting=True,LensFlares=True,AntiAliasingIndex=1,BloomIndex=2,MotionBlurIndex=0,AmbientOcclusionIndex=1,DOFIndex=1,FlexIndex=0)} GraphicsQualityPresets(3)={(EnvironmentDetailIndex=3,CharacterDetailIndex=2,FXQualityIndex=3,TextureResolutionIndex=3,TextureFilteringIndex=3,ShadowQualityIndex=3,RealtimeReflectionsIndex=1,LightShafts=True,VolumetricLighting=True,LensFlares=True,AntiAliasingIndex=1,BloomIndex=2,MotionBlurIndex=1,AmbientOcclusionIndex=2,DOFIndex=1,FlexIndex=0)} GraphicsQualityPresets(4)={(EnvironmentDetailIndex=2,CharacterDetailIndex=1,FXQualityIndex=2,TextureResolutionIndex=2,TextureFilteringIndex=2,ShadowQualityIndex=2,RealtimeReflectionsIndex=0,LightShafts=True,VolumetricLighting=True,LensFlares=True,AntiAliasingIndex=1,BloomIndex=2,MotionBlurIndex=0,AmbientOcclusionIndex=1,DOFIndex=1,FlexIndex=1)} GraphicsQualityPresets(5)={(EnvironmentDetailIndex=2,CharacterDetailIndex=1,FXQualityIndex=2,TextureResolutionIndex=2,TextureFilteringIndex=2,ShadowQualityIndex=2,RealtimeReflectionsIndex=0,LightShafts=True,VolumetricLighting=True,LensFlares=True,AntiAliasingIndex=1,BloomIndex=2,MotionBlurIndex=0,AmbientOcclusionIndex=1,DOFIndex=1,FlexIndex=2)} GraphicsQualityPresets(6)={(EnvironmentDetailIndex=3,CharacterDetailIndex=2,FXQualityIndex=3,TextureResolutionIndex=3,TextureFilteringIndex=3,ShadowQualityIndex=3,RealtimeReflectionsIndex=1,LightShafts=True,VolumetricLighting=True,LensFlares=True,AntiAliasingIndex=1,BloomIndex=2,MotionBlurIndex=1,AmbientOcclusionIndex=2,DOFIndex=1,FlexIndex=2)} // Display DisplayPresets(0)={(Fullscreen=False, BorderlessWindow=False)} DisplayPresets(1)={(Fullscreen=False, BorderlessWindow=True)} DisplayPresets(2)={(Fullscreen=True, BorderlessWindow=False)} //VSync VSyncPresets(0)={(VSync=False)} VSyncPresets(1)={(VSync=True)} //VSyncPresets(2)={(VSync=True)} // Variable Framerate VariableFrameratePresets(0)={(VariableFramerate=False)} VariableFrameratePresets(1)={(VariableFramerate=True)} // Film Grain FilmGrainMinMaxPreset(`MIN)={(FilmGrainScale=0.5)} FilmGrainMinMaxPreset(`MAX)={(FilmGrainScale=37.5)} // Environment Detail EnvironmentDetailPresets(0)={(DetailMode=0, DestructionLifetimeScale=0.25, bDisableCanBecomeDynamicWakeup=True, MakeDynamicCollisionThreshold=200, AllowLightFunctions=False)} EnvironmentDetailPresets(1)={(DetailMode=1, DestructionLifetimeScale=0.5, bDisableCanBecomeDynamicWakeup=False, MakeDynamicCollisionThreshold=200, AllowLightFunctions=False)} EnvironmentDetailPresets(2)={(DetailMode=2, DestructionLifetimeScale=1.0, bDisableCanBecomeDynamicWakeup=False, MakeDynamicCollisionThreshold=150, AllowLightFunctions=True)} EnvironmentDetailPresets(3)={(DetailMode=2, DestructionLifetimeScale=1.2, bDisableCanBecomeDynamicWakeup=False, MakeDynamicCollisionThreshold=150, AllowLightFunctions=True)} // Shadows ShadowQualityPresets(0)={(bAllowWholeSceneDominantShadows=FALSE, bOverrideMapWholeSceneDominantShadowSetting=FALSE, bAllowDynamicShadows=TRUE, bAllowPerObjectShadows=FALSE, MaxWholeSceneDominantShadowResolution=1204, MaxShadowResolution=1024, ShadowFadeResolution=256, MinShadowResolution=128, ShadowTexelsPerPixel=0.5, GlobalShadowDistanceScale=0.75, AllowForegroundPreshadows=False)} ShadowQualityPresets(1)={(bAllowWholeSceneDominantShadows=TRUE, bOverrideMapWholeSceneDominantShadowSetting=FALSE, bAllowDynamicShadows=TRUE, bAllowPerObjectShadows=TRUE, MaxWholeSceneDominantShadowResolution=1204, MaxShadowResolution=1024, ShadowFadeResolution=128, MinShadowResolution=64, ShadowTexelsPerPixel=1.0, GlobalShadowDistanceScale=0.75, AllowForegroundPreshadows=False)} ShadowQualityPresets(2)={(bAllowWholeSceneDominantShadows=TRUE, bOverrideMapWholeSceneDominantShadowSetting=FALSE, bAllowDynamicShadows=TRUE, bAllowPerObjectShadows=TRUE, MaxWholeSceneDominantShadowResolution=1280, MaxShadowResolution=1024, ShadowFadeResolution=128, MinShadowResolution=64, ShadowTexelsPerPixel=1.3, GlobalShadowDistanceScale=1.0, AllowForegroundPreshadows=True)} ShadowQualityPresets(3)={(bAllowWholeSceneDominantShadows=TRUE, bOverrideMapWholeSceneDominantShadowSetting=TRUE, bAllowDynamicShadows=TRUE, bAllowPerObjectShadows=TRUE, MaxWholeSceneDominantShadowResolution=2048, MaxShadowResolution=1536, ShadowFadeResolution=64, MinShadowResolution=32, ShadowTexelsPerPixel=2.0, GlobalShadowDistanceScale=1.5, AllowForegroundPreshadows=True)} // FX FXQualityPresets(0)={(ParticleLODBias=1, DistanceFogQuality=0, Distortion=False, FilteredDistortion=False, DropParticleDistortion=True, EmitterPoolScale=0.25, ShellEjectLifetime=2, AllowExplosionLights=False, AllowSprayActorLights=False, AllowPilotLights=False, AllowFootstepSounds=False, AllowRagdollAndGoreOnDeadBodies=False, MaxImpactEffectDecals=8, MaxExplosionDecals=8, GoreFXLifetimeMultiplier=0.5, MaxBloodEffects=12, MaxGoreEffects=8, AllowSecondaryBloodEffects=False, AllowBloodSplatterDecals=False,MaxPersistentSplatsPerFrame=25)} FXQualityPresets(1)={(ParticleLODBias=0, DistanceFogQuality=0, Distortion=False, FilteredDistortion=False, DropParticleDistortion=True, EmitterPoolScale=0.5, ShellEjectLifetime=5, AllowExplosionLights=True, AllowSprayActorLights=False, AllowPilotLights=True, AllowFootstepSounds=True, AllowRagdollAndGoreOnDeadBodies=True, MaxImpactEffectDecals=15, MaxExplosionDecals=12, GoreFXLifetimeMultiplier=0.75, MaxBloodEffects=15, MaxGoreEffects=8, AllowSecondaryBloodEffects=False, AllowBloodSplatterDecals=False, MaxPersistentSplatsPerFrame=50)} FXQualityPresets(2)={(ParticleLODBias=0, DistanceFogQuality=1, Distortion=True, FilteredDistortion=True, DropParticleDistortion=False, EmitterPoolScale=1.0,ShellEjectLifetime=10, AllowExplosionLights=True, AllowSprayActorLights=True, AllowPilotLights=True, AllowFootstepSounds=True, AllowRagdollAndGoreOnDeadBodies=True, MaxImpactEffectDecals=20, MaxExplosionDecals=15, GoreFXLifetimeMultiplier=1.0, MaxBloodEffects=25, MaxGoreEffects=10, AllowSecondaryBloodEffects=True, AllowBloodSplatterDecals=True, MaxPersistentSplatsPerFrame=75)} FXQualityPresets(3)={(ParticleLODBias=0, DistanceFogQuality=1, Distortion=True, FilteredDistortion=True, DropParticleDistortion=False, EmitterPoolScale=2.0,ShellEjectLifetime=20, AllowExplosionLights=True, AllowSprayActorLights=True, AllowPilotLights=True, AllowFootstepSounds=True, AllowRagdollAndGoreOnDeadBodies=True, MaxImpactEffectDecals=40, MaxExplosionDecals=20, GoreFXLifetimeMultiplier=1.2, MaxBloodEffects=40, MaxGoreEffects=15, AllowSecondaryBloodEffects=True, AllowBloodSplatterDecals=True, MaxPersistentSplatsPerFrame=100)} // Realtime Reflections RealtimeReflectionsPresets(0)={(bAllowScreenSpaceReflections=False)} RealtimeReflectionsPresets(1)={(bAllowScreenSpaceReflections=True)} // Character Detail CharacterDetailPresets(0)={(SkeletalMeshLODBias=1, AllowSubsurfaceScattering=False, MaxBodyWoundDecals=2, MaxDeadBodies=8, KinematicUpdateDistFactorScale=3.0, ShouldCorpseCollideWithDead=False, ShouldCorpseCollideWithLiving=False, ShouldCorpseCollideWithDeadAfterSleep=False, bAllowPhysics=false)} CharacterDetailPresets(1)={(SkeletalMeshLODBias=0, AllowSubsurfaceScattering=False, MaxBodyWoundDecals=5, MaxDeadBodies=12, KinematicUpdateDistFactorScale=1.3, ShouldCorpseCollideWithDead=True, ShouldCorpseCollideWithLiving=True, ShouldCorpseCollideWithDeadAfterSleep=False, bAllowPhysics=true)} CharacterDetailPresets(2)={(SkeletalMeshLODBias=0, AllowSubsurfaceScattering=True, MaxBodyWoundDecals=5, MaxDeadBodies=15, KinematicUpdateDistFactorScale=1.0, ShouldCorpseCollideWithDead=True, ShouldCorpseCollideWithLiving=True, ShouldCorpseCollideWithDeadAfterSleep=True, bAllowPhysics=true)} // Light Shafts LightShaftsPresets(0)={(bAllowLightShafts=False)} LightShaftsPresets(1)={(bAllowLightShafts=True)} // Volumetric Lighting VolumetricLightingPresets(0)={(bAllowLightCones=False)} VolumetricLightingPresets(1)={(bAllowLightCones=True)} // Lens Flare LensFlarePresets(0)={(bAllowLensFlares=False)} LensFlarePresets(1)={(bAllowLensFlares=True)} // Texture Resolution TextureResolutionPresets(0)={(UIBias=0, ShadowmapBias=1, CharacterBias=3, Weapon1stBias=1, Weapon3rdBias=1, EnvironmentBias=2, FXBias=1)} TextureResolutionPresets(1)={(UIBias=0, ShadowmapBias=0, CharacterBias=2, Weapon1stBias=1, Weapon3rdBias=1, EnvironmentBias=2, FXBias=1)} TextureResolutionPresets(2)={(UIBias=0, ShadowmapBias=0, CharacterBias=1, Weapon1stBias=0, Weapon3rdBias=0, EnvironmentBias=1, FXBias=0)} TextureResolutionPresets(3)={(UIBias=0, ShadowmapBias=0, CharacterBias=0, Weapon1stBias=0, Weapon3rdBias=0, EnvironmentBias=0, FXBias=0)} // Texture Filtering TextureFilterPresets(0)={(MinMagFilter=Linear, MipFilter=Point, MaxAnisotropy=1)} TextureFilterPresets(1)={(MinMagFilter=Linear, MipFilter=Linear, MaxAnisotropy=1)} TextureFilterPresets(2)={(MinMagFilter=Aniso, MipFilter=Linear, MaxAnisotropy=4)} TextureFilterPresets(3)={(MinMagFilter=Aniso, MipFilter=Linear, MaxAnisotropy=16)} // Bloom BloomPresets(0)={(Bloom=False, BloomQuality=0)} BloomPresets(1)={(Bloom=True, BloomQuality=1)} BloomPresets(2)={(Bloom=True, BloomQuality=2)} // Motion Blur MotionBlurPresets(0)={(MotionBlur=False, MotionBlurQuality=0)} MotionBlurPresets(1)={(MotionBlur=True, MotionBlurQuality=1)} // Anti Aliasing AntiAliasingPresets(0)={(PostProcessAA=False)} AntiAliasingPresets(1)={(PostProcessAA=True)} // Ambient Occlusion AmbientOcclusionPresets(0)={(AmbientOcclusion=False, HBAO=False)} AmbientOcclusionPresets(1)={(AmbientOcclusion=True, HBAO=False)} AmbientOcclusionPresets(2)={(AmbientOcclusion=True, HBAO=True)} // Depth Of Field DOFPresets(0)={(DepthOfField=False, DepthOfFieldQuality=0)} DOFPresets(1)={(DepthOfField=True, DepthOfFieldQuality=1)} DOFPresets(2)={(DepthOfField=True, DepthOfFieldQuality=2)} DOFPresets(3)={(DepthOfField=True, DepthOfFieldQuality=3)} // Flex FlexPresets(0)={(FlexLevel=0)} FlexPresets(1)={(FlexLevel=1)} FlexPresets(2)={(FlexLevel=2)} }