diff --git a/Templates/BaseGame/game/core/rendering/scripts/graphicsOptions.tscript b/Templates/BaseGame/game/core/rendering/scripts/graphicsOptions.tscript index f48023dd2..42d6bef5f 100644 --- a/Templates/BaseGame/game/core/rendering/scripts/graphicsOptions.tscript +++ b/Templates/BaseGame/game/core/rendering/scripts/graphicsOptions.tscript @@ -71,6 +71,7 @@ new SimGroup(VideoSettingsGroup) { class = "OptionsSettings"; OptionName = "Display API"; + requiresRestart = true; }; new SimGroup( DisplayDevicesGroup ) @@ -693,7 +694,7 @@ new SimGroup(VideoSettingsGroup) class = "SubOptionsGroup"; displayName = "Effects"; - new SimGroup() + new SimGroup(ShaderQualityOptionsGroup) { class = "OptionsSettings"; OptionName = "Shader Quality"; @@ -723,7 +724,7 @@ new SimGroup(VideoSettingsGroup) }; - new SimGroup() + new SimGroup(AnisotropicFilterOptionsGroup) { class = "OptionsSettings"; OptionName = "Anisotropic Filtering"; @@ -759,7 +760,7 @@ new SimGroup(VideoSettingsGroup) }; }; - new SimGroup() + new SimGroup(AntiAliasingOptionsGroup) { class = "OptionsSettings"; OptionName = "Anti-Aliasing"; @@ -771,6 +772,7 @@ new SimGroup(VideoSettingsGroup) displayName = "None"; key["$pref::Video::AAMode"] = "None"; + key["$pref::Video::AA"] = 0; }; new ArrayObject() { @@ -778,6 +780,7 @@ new SimGroup(VideoSettingsGroup) displayName = "FXAA"; key["$pref::Video::AAMode"] = "FXAA"; + key["$pref::Video::AA"] = 0; }; new ArrayObject() { @@ -785,6 +788,7 @@ new SimGroup(VideoSettingsGroup) displayName = "SMAA"; key["$pref::Video::AAMode"] = "SMAA"; + key["$pref::Video::AA"] = 4; }; new ArrayObject() { @@ -792,10 +796,11 @@ new SimGroup(VideoSettingsGroup) displayName = "SMAA High"; key["$pref::Video::AAMode"] ="SMAA High"; + key["$pref::Video::AA"] = 4; }; }; - new SimGroup() + new SimGroup(ParallaxOptionsGroup) { class = "OptionsSettings"; OptionName = "Parallax"; @@ -818,7 +823,7 @@ new SimGroup(VideoSettingsGroup) }; - new SimGroup() + new SimGroup(TrueWaterReflectionsOptionsGroup) { class = "OptionsSettings"; OptionName = "True Water Reflections"; @@ -840,7 +845,7 @@ new SimGroup(VideoSettingsGroup) }; }; - new SimGroup() + new SimGroup(PostFXSSAOOptionsGroup) { class = "OptionsSettings"; OptionName = "SSAO"; @@ -862,7 +867,7 @@ new SimGroup(VideoSettingsGroup) }; }; - new SimGroup() + new SimGroup(PostFXDOFOptionsGroup) { class = "OptionsSettings"; OptionName = "Depth of Field"; @@ -883,7 +888,7 @@ new SimGroup(VideoSettingsGroup) }; }; - new SimGroup() + new SimGroup(PostFXVignetteOptionsGroup) { class = "OptionsSettings"; OptionName = "Vignette"; @@ -904,7 +909,7 @@ new SimGroup(VideoSettingsGroup) }; }; - new SimGroup() + new SimGroup(PostFXLightRayOptionsGroup) { class = "OptionsSettings"; OptionName = "Light Rays"; @@ -1008,6 +1013,126 @@ function VideoSettingsGroup::populateDisplaySettings(%this) DisplayRefreshSettingsGroup.add(%entry); } } + +function DisplayDevicesGroup::onApply(%this) +{ + updateDisplayOptionsSettings(); +} + +function DisplayModeGroup::onApply(%this) +{ + updateDisplayOptionsSettings(); +} + +function DisplayResSettingsGroup::onApply(%this) +{ + updateDisplayOptionsSettings(); +} + +function VSyncSettingsGroup::onApply(%this) +{ + updateDisplayOptionsSettings(); +} + +function DisplayRefreshSettingsGroup::onApply(%this) +{ + updateDisplayOptionsSettings(); +} + +function updateDisplayOptionsSettings() +{ + //Update the display settings now + %deviceName = getDisplayDeviceName(); + %newDeviceID = getWord(%deviceName, 0) - 1; + + %deviceModeName = getField($Video::ModeTags, $pref::Video::deviceMode); + %newDeviceMode = 0; + foreach$(%modeName in $Video::ModeTags) + { + if (%deviceModeName $= %modeName) + break; + else + %newDeviceMode++; + } + + if($pref::Video::deviceMode == $Video::ModeBorderless) + { + //if we're changing to borderless, we swap to the full resolution of the desktop + $pref::Video::mode = Canvas.getBestCanvasRes($pref::Video::deviceId, $pref::Video::deviceMode); + + $pref::Video::Resolution = $pref::Video::mode.x SPC $pref::Video::mode.y; + } + + %newRes = $pref::Video::Resolution; + %newBpp = 32; // ... its not 1997 anymore. + %newFullScreen = %deviceModeName $= "Fullscreen" ? true : false; + %newRefresh = $pref::Video::RefreshRate; + %newVsync = $pref::Video::enableVerticalSync; + %newAA = $pref::Video::AA; + + // Build the final mode string. + %newMode = $pref::Video::Resolution SPC %newFullScreen SPC %newBpp SPC %newRefresh SPC %newAA; + + // Change the video mode. + if ( %newMode !$= $pref::Video::mode || %newDeviceID != $pref::Video::deviceId || + %newVsync != $pref::Video::enableVerticalSync || %newDeviceMode != $pref::Video::deviceMode) + { + //****Edge Case Hack + // If we're in fullscreen mode and switching to a different monitor at the + // same resolution and maintaining fullscreen, GFX...WindowTarget::resetMode() + // will early-out because there is no "mode change" and the monitor change + // will not get applied. Instead of modifying platform code, we're going to + // move onto the new monitor in borderless and immediately switch to FS. + if (%newFullScreen && $pref::Video::FullScreen && + ($pref::Video::Resolution $= %newRes) && ($pref::Video::deviceId != %newDeviceID)) + { + $pref::Video::deviceId = %newDeviceID; + $pref::Video::deviceMode = $Video::ModeBorderless; + %tmpModeStr = Canvas.getMonitorMode(%newDeviceID, 0); + Canvas.setVideoMode(%tmpModeStr.x, %tmpModeStr.y, false, 32, getWord(%tmpModeStr, $WORD::REFRESH), %newAA); + } + + $pref::Video::mode = %newMode; + $pref::Video::enableVerticalSync = %newVsync; + $pref::Video::deviceId = %newDeviceID; + $pref::Video::deviceMode = %newDeviceMode; + $pref::Video::Resolution = %newRes; + $pref::Video::FullScreen = %newFullScreen; + $pref::Video::RefreshRate = %newRefresh; + $pref::Video::AA = %newAA; + configureCanvas(); + } +} + +function TextureQualityGroup::onApply(%this) +{ + reloadTextures(); +} + +function PostFXSSAOOptionsGroup::onApply(%this) +{ + %currentLevel = %this.getCurrentQualityLevel(); + PostFXManager.settingsEffectSetEnabled(SSAOPostFx, %currentLevel.getKey(0)); +} + +function PostFXDOFOptionsGroup::onApply(%this) +{ + %currentLevel = %this.getCurrentQualityLevel(); + PostFXManager.settingsEffectSetEnabled(DepthOfFieldPostFX, %currentLevel.getKey(0)); +} + +function PostFXVignetteOptionsGroup::onApply(%this) +{ + %currentLevel = %this.getCurrentQualityLevel(); + PostFXManager.settingsEffectSetEnabled(vignettePostFX, %currentLevel.getKey(0)); +} + +function PostFXLightRayOptionsGroup::onApply(%this) +{ + %currentLevel = %this.getCurrentQualityLevel(); + PostFXManager.settingsEffectSetEnabled(LightRayPostFX, %currentLevel.getKey(0)); +} + function getCurrentQualityLevel(%qualityGroup) { for ( %i=0; %i < %qualityGroup.getCount(); %i++ ) @@ -1046,11 +1171,6 @@ function AutodetectGraphics() %intel = ( strstr( strupr( getDisplayDeviceInformation() ), "INTEL" ) != -1 ) ? true : false; %videoMem = GFXCardProfilerAPI::getVideoMemoryMB(); - return AutodetectGraphics_Apply( %shaderVer, %intel, %videoMem ); -} - -function AutodetectGraphics_Apply(%shaderVer, %intel, %videoMem ) -{ if ( %shaderVer < 2.0 ) { echo("Your video card does not meet the minimum requirment of shader model 2.0."); @@ -1074,17 +1194,14 @@ function AutodetectGraphics_Apply(%shaderVer, %intel, %videoMem ) $pref::Shadows::useShadowCaching = true; - $pref::Water::enableTrueReflections = false; - $pref::Video::enableParallaxMapping = false; - $pref::PostFX::EnableSSAO = false; - $pref::PostFX::EnableHDR = false; - $pref::PostFX::EnableDOF = false; - $pref::PostFX::EnableLightRays = false; - $pref::PostFX::EnableVignette = false; - - $pref::Video::AAMode = "None"; - $pref::Video::AA = 0; - $pref::Video::defaultAnisotropy = 0; + AnisotropicFilterOptionsGroup.applySetting("None"); + AntiAliasingOptionsGroup.applySetting("Off"); + ParallaxOptionsGroup.applySetting("Off"); + TrueWaterReflectionsOptionsGroup.applySetting("Off"); + PostFXSSAOOptionsGroup.applySetting("Off"); + PostFXDOFOptionsGroup.applySetting("Off"); + PostFXVignetteOptionsGroup.applySetting("Off"); + PostFXLightRayOptionsGroup.applySetting("Off"); } else { @@ -1101,17 +1218,14 @@ function AutodetectGraphics_Apply(%shaderVer, %intel, %videoMem ) $pref::Shadows::useShadowCaching = true; - $pref::Water::enableTrueReflections = false; - $pref::Video::enableParallaxMapping = false; - $pref::PostFX::EnableSSAO = false; - $pref::PostFX::EnableHDR = false; - $pref::PostFX::EnableDOF = false; - $pref::PostFX::EnableLightRays = false; - $pref::PostFX::EnableVignette = false; - - $pref::Video::AAMode = "None"; - $pref::Video::AA = 0; - $pref::Video::defaultAnisotropy = 0; + AnisotropicFilterOptionsGroup.applySetting("None"); + AntiAliasingOptionsGroup.applySetting("Off"); + ParallaxOptionsGroup.applySetting("Off"); + TrueWaterReflectionsOptionsGroup.applySetting("Off"); + PostFXSSAOOptionsGroup.applySetting("Off"); + PostFXDOFOptionsGroup.applySetting("Off"); + PostFXVignetteOptionsGroup.applySetting("Off"); + PostFXLightRayOptionsGroup.applySetting("Off"); } } else @@ -1132,17 +1246,14 @@ function AutodetectGraphics_Apply(%shaderVer, %intel, %videoMem ) //Should this default to on in ultra settings? $pref::Shadows::useShadowCaching = true; - $pref::Water::enableTrueReflections = true; - $pref::Video::enableParallaxMapping = true; - $pref::PostFX::EnableSSAO = true; - $pref::PostFX::EnableHDR = true; - $pref::PostFX::EnableDOF = true; - $pref::PostFX::EnableLightRays = true; - $pref::PostFX::EnableVignette = true; - - $pref::Video::AAMode = "SMAA High"; - $pref::Video::AA = 4; - $pref::Video::defaultAnisotropy = 16; + AnisotropicFilterOptionsGroup.applySetting("16x"); + AntiAliasingOptionsGroup.applySetting("SMAA High"); + ParallaxOptionsGroup.applySetting("On"); + TrueWaterReflectionsOptionsGroup.applySetting("On"); + PostFXSSAOOptionsGroup.applySetting("On"); + PostFXDOFOptionsGroup.applySetting("On"); + PostFXVignetteOptionsGroup.applySetting("On"); + PostFXLightRayOptionsGroup.applySetting("On"); } else if ( %videoMem > 400 || %videoMem == 0 ) { @@ -1159,17 +1270,14 @@ function AutodetectGraphics_Apply(%shaderVer, %intel, %videoMem ) $pref::Shadows::useShadowCaching = true; - $pref::Water::enableTrueReflections = true; - $pref::Video::enableParallaxMapping = true; - $pref::PostFX::EnableSSAO = false; - $pref::PostFX::EnableHDR = true; - $pref::PostFX::EnableDOF = true; - $pref::PostFX::EnableLightRays = true; - $pref::PostFX::EnableVignette = true; - - $pref::Video::AAMode = "SMAA"; - $pref::Video::AA = 4; - $pref::Video::defaultAnisotropy = 4; + AnisotropicFilterOptionsGroup.applySetting("4x"); + AntiAliasingOptionsGroup.applySetting("SMAA"); + ParallaxOptionsGroup.applySetting("On"); + TrueWaterReflectionsOptionsGroup.applySetting("On"); + PostFXSSAOOptionsGroup.applySetting("Off"); + PostFXDOFOptionsGroup.applySetting("On"); + PostFXVignetteOptionsGroup.applySetting("On"); + PostFXLightRayOptionsGroup.applySetting("On"); if ( %videoMem == 0 ) echo("Torque was unable to detect available video memory. Applying 'Medium' quality."); @@ -1189,31 +1297,17 @@ function AutodetectGraphics_Apply(%shaderVer, %intel, %videoMem ) $pref::Shadows::useShadowCaching = true; - $pref::Water::enableTrueReflections = true; - $pref::Video::enableParallaxMapping = true; - $pref::PostFX::EnableSSAO = false; - $pref::PostFX::EnableHDR = false; - $pref::PostFX::EnableDOF = false; - $pref::PostFX::EnableLightRays = false; - $pref::PostFX::EnableVignette = false; - - $pref::Video::AAMode = "FXAA"; - $pref::Video::AA = 0; - $pref::Video::defaultAnisotropy = 0; + AnisotropicFilterOptionsGroup.applySetting("None"); + AntiAliasingOptionsGroup.applySetting("FXAA"); + ParallaxOptionsGroup.applySetting("On"); + TrueWaterReflectionsOptionsGroup.applySetting("On"); + PostFXSSAOOptionsGroup.applySetting("Off"); + PostFXDOFOptionsGroup.applySetting("Off"); + PostFXVignetteOptionsGroup.applySetting("Off"); + PostFXLightRayOptionsGroup.applySetting("Off"); } } - //%this.refresh(); - - //%this.apply(); - - //force postFX updates - PostFXManager.settingsEffectSetEnabled(SSAOPostFx, $pref::PostFX::EnableSSAO); - PostFXManager.settingsEffectSetEnabled(HDRPostFX, $pref::PostFX::EnableHDR); - PostFXManager.settingsEffectSetEnabled(DepthOfFieldPostFX, $pref::PostFX::EnableDOF); - PostFXManager.settingsEffectSetEnabled(LightRayPostFX, $pref::PostFX::EnableLightRays); - PostFXManager.settingsEffectSetEnabled(VignettePostFX, $pref::PostFX::EnableVignette); - echo("Graphics quality settings have been auto detected."); } @@ -1352,4 +1446,20 @@ function getDisplayDeviceId(%displayDeviceName) } return -1; +} + +function getDisplayDeviceName() +{ + %numDevices = Canvas.getMonitorCount(); + %devicesList = ""; + for(%i = 0; %i < %numDevices; %i++) + { + %device = (%i+1) @ " - " @ Canvas.getMonitorName(%i); + if(%i==0) + %devicesList = %device; + else + %devicesList = %devicesList @ "\t" @ %device; + } + + return getField(%devicesList, $pref::Video::deviceId); } \ No newline at end of file diff --git a/Templates/BaseGame/game/core/sfx/scripts/audioOptions.tscript b/Templates/BaseGame/game/core/sfx/scripts/audioOptions.tscript index 19417c2e4..eb72c3f86 100644 --- a/Templates/BaseGame/game/core/sfx/scripts/audioOptions.tscript +++ b/Templates/BaseGame/game/core/sfx/scripts/audioOptions.tscript @@ -80,3 +80,24 @@ function AudioSettingsGroup::populateSettings(%this) AudioSettingsDeviceGroup.add(%deviceEntry); } } + +function AudioSettingsProviderGroup::onApply(%this) +{ + updateAudioOptionsSettings(); +} + +function AudioSettingsDeviceGroup::onApply(%this) +{ + updateAudioOptionsSettings(); +} + +function updateAudioOptionsSettings() +{ + if ( !sfxCreateDevice( $pref::SFX::provider, + $pref::SFX::device, + $pref::SFX::useHardware, + -1 ) ) + error( "Unable to create SFX device: " @ $pref::SFX::provider + SPC $pref::SFX::device + SPC $pref::SFX::useHardware ); +} \ No newline at end of file diff --git a/Templates/BaseGame/game/data/UI/guis/optionsMenu.tscript b/Templates/BaseGame/game/data/UI/guis/optionsMenu.tscript index 0f3fe9f24..a4a14d996 100644 --- a/Templates/BaseGame/game/data/UI/guis/optionsMenu.tscript +++ b/Templates/BaseGame/game/data/UI/guis/optionsMenu.tscript @@ -115,6 +115,9 @@ if(!isObject( OptionsMenuActionMap ) ) OptionsMenuActionMap.bind( keyboard, R, OptionsMenuReset ); OptionsMenuActionMap.bind( gamepad, btn_x, OptionsMenuReset ); + + OptionsMenuActionMap.bind( keyboard, Enter, OptionsMenuActivateOption ); + OptionsMenuActionMap.bind( gamepad, btn_a, OptionsMenuActivateOption ); } function OptionsMenuList::syncGui(%this) @@ -178,6 +181,49 @@ function OptionsMenuList::syncGui(%this) } } +function OptionsMenuList::checkForUnappliedChanges(%this) +{ + %unappliedChanges = false; + + foreach(%option in %this) + { + if(%option.class $= "OptionsListEntry") + { + if(%option.currentOptionIndex >= 0 && %option.currentOptionIndex < %option.optionsObject.getCount()) + { + %targetOptionLevel = %option.optionsObject.getObject(%option.currentOptionIndex); + + if(!%targetOptionLevel.isCurrent()) + %unappliedChanges = true; + + if(%option.optionsObject.requiresRestart) + $optionsChangeRequiresRestart = true; + } + } + } + + return %unappliedChanges; +} + +function OptionsMenuList::applyChanges(%this) +{ + foreach(%option in %this) + { + if(%option.class $= "OptionsListEntry") + { + //If it's custom or nonsensical index, there's some kind of external factor going on, so we're + //just going to skip applying it because we don't know what we'd be applying + if(%option.currentOptionIndex >= 0 && %option.currentOptionIndex < %option.optionsObject.getCount()) + { + %targetOptionLevel = %option.optionsObject.getObject(%option.currentOptionIndex); + + if(!%targetOptionLevel.isCurrent()) + %targetOptionLevel.apply(); + } + } + } +} + function OptionsMenu::openOptionsCategory(%this, %categoryName) { VideoSettingsList.setVisible(%categoryName $= "Video"); @@ -343,7 +389,7 @@ function OptionMenuPrevSetting(%val) %newOptionLevel = %optionObject.getObject(%option.currentOptionIndex); - echo("Changed option: " @ %optionObject.optionName @ " from level: " @ %currentOptionLevel.displayName @ " to level: " @ %newOptionLevel.displayName); + //echo("Changed option: " @ %optionObject.optionName @ " from level: " @ %currentOptionLevel.displayName @ " to level: " @ %newOptionLevel.displayName); } $MenuList.syncGUI(); @@ -368,7 +414,7 @@ function OptionMenuNextSetting(%val) %newOptionLevel = %optionObject.getObject(%option.currentOptionIndex); - echo("Changed option: " @ %optionObject.optionName @ " from level: " @ %currentOptionLevel.displayName @ " to level: " @ %newOptionLevel.displayName); + //echo("Changed option: " @ %optionObject.optionName @ " from level: " @ %currentOptionLevel.displayName @ " to level: " @ %newOptionLevel.displayName); } $MenuList.syncGUI(); @@ -379,6 +425,23 @@ function OptionMenuStickChangeSetting(%val) } +function OptionsMenuActivateOption(%val) +{ + if(!%val) + return; + + %option = $MenuList.getObject($MenuList.listPosition); + + if(!isObject(%option)) + return; + + echo(%option.class); + + if(%option.class $= "OptionsKeybindEntry") + { + eval(%option-->button.altCommand); + } +} // // // @@ -584,53 +647,12 @@ function tryCloseOptionsMenu(%val) if(!%val) return; - //scan through all our options and see if any are any unapplied changes. If - //so we need to prompt to apply or discard them - %unappliedChanges = false; + $optionsChangeRequiresRestart = false; - foreach(%option in VideoSettingsList) - { - if(%option.class $= "OptionsListEntry") - { - if(%option.currentOptionIndex >= 0 && %option.currentOptionIndex < %option.optionsObject.getCount()) - { - %targetOptionLevel = %option.optionsObject.getObject(%option.currentOptionIndex); - - echo("tryCloseOptionsMenu() - testing option: " @ %option.optionsObject.optionName @ " target level of: " @ %targetOptionLevel.displayName); - - if(!%targetOptionLevel.isCurrent()) - { - %unappliedChanges = true; - break; - } - } - } - } + %unappliedVideoChanges = VideoSettingsList.checkForUnappliedChanges(); + %unappliedAudioChanges = AudioSettingsList.checkForUnappliedChanges(); - //check if we already have unapplied changes, so we can skip further iterating - if(!%unappliedChanges) - { - foreach(%option in AudioSettingsList) - { - if(%option.class $= "OptionsListEntry") - { - if(%option.currentOptionIndex >= 0 && %option.currentOptionIndex < %option.optionsObject.getCount()) - { - %targetOptionLevel = %option.optionsObject.getObject(%option.currentOptionIndex); - - echo("tryCloseOptionsMenu() - testing option: " @ %option.optionsObject.optionName @ " target level of: " @ %targetOptionLevel.displayName); - - if(!%targetOptionLevel.isCurrent()) - { - %unappliedChanges = true; - break; - } - } - } - } - } - - if(%unappliedChanges) + if(%unappliedVideoChanges || %unappliedAudioChanges) { MessageBoxOKCancel("Discard Changes?", "You have unapplied changes to your settings, do you wish to apply or discard them?", "OptionsMenu.applyChangedOptions();", "Canvas.popDialog(OptionsMenu);", @@ -640,53 +662,27 @@ function tryCloseOptionsMenu(%val) { Canvas.popDialog(OptionsMenu); } -} +} function OptionsMenu::applyChangedOptions(%this) { - foreach(%option in VideoSettingsList) - { - if(%option.class $= "OptionsListEntry") - { - //If it's custom or nonsensical index, there's some kind of external factor going on, so we're - //just going to skip applying it because we don't know what we'd be applying - if(%option.currentOptionIndex >= 0 && %option.currentOptionIndex < %option.optionsObject.getCount()) - { - %targetOptionLevel = %option.optionsObject.getObject(%option.currentOptionIndex); - - if(!%targetOptionLevel.isCurrent()) - { - echo("Applying setting of " @ %option.optionsObject.optionName); - %targetOptionLevel.apply(); - } - } - } - } + VideoSettingsList.applyChanges(); + AudioSettingsList.applyChanges(); - foreach(%option in AudioSettingsList) - { - if(%option.class $= "OptionsListEntry") - { - //If it's custom or nonsensical index, there's some kind of external factor going on, so we're - //just going to skip applying it because we don't know what we'd be applying - if(%option.currentOptionIndex >= 0 && %option.currentOptionIndex < %option.optionsObject.getCount()) - { - %targetOptionLevel = %option.optionsObject.getObject(%option.currentOptionIndex); - - if(!%targetOptionLevel.isCurrent()) - { - echo("Applying setting of " @ %option.optionsObject.optionName); - %targetOptionLevel.apply(); - } - } - } - } + //$pref::SFX::masterVolume = OptionsMenuSettingsList.getValue(2); + sfxSetMasterVolume( $pref::SFX::masterVolume ); + sfxSetChannelVolume( $GuiAudioType, $pref::SFX::channelVolume[ $GuiAudioType ] ); + sfxSetChannelVolume( $SimAudioType, $pref::SFX::channelVolume[ $SimAudioType ] ); + sfxSetChannelVolume( $MusicAudioType, $pref::SFX::channelVolume[ $MusicAudioType ] ); //Finally, write our prefs to file %prefPath = getPrefpath(); export("$pref::*", %prefPath @ "/clientPrefs." @ $TorqueScriptFileExtension, false); Canvas.popDialog(OptionsMenu); + + if($optionsChangeRequiresRestart) + MessageBoxOK("Restart Required", "Some of your changes require the game to be restarted."); } function doKeyRemap( %optionEntry ) @@ -841,442 +837,11 @@ function OptionsMenu::apply(%this) OptionsMenu.unappliedChanges.empty(); } -function OptionsMenu::resetToDefaults(%this) +function OptionsMenu::resetSettings(%this) { MessageBoxOKCancel("", "This will set the graphical settings back to the auto-detected defaults. Do you wish to continue?", "AutodetectGraphics();", ""); } -// -// old ones -// -function populateDisplaySettingsList() -{ - OptionsMenuSettingsList.clear(); - - OptionsMenu.currentCategory = "Display"; - - if(isObject(OptionName)) - OptionName.setText(""); - if(isObject(OptionDescription)) - OptionDescription.setText(""); - - %apiList = ""; - %apiCount = GFXInit::getAdapterCount(); - %apiIdx = 0; - for(%i=0; %i < %apiCount; %i++) - { - %api = GFXInit::getAdapterType(%i); - - if(%api !$= "NullDevice") - { - if(%apiIdx==0) - %apiList = %api; - else - %apiList = %apiList TAB %api; - - %apiIdx++; - } - } - - trim(%apiList); - - %displayDevice = OptionsMenu.getOptionVariableValue("$pref::Video::displayDevice"); - if(%displayDevice $= "") - %displayDevice = getDisplayDeviceType(); - - OptionsMenuSettingsList.addOptionRow("Display API", "$pref::Video::displayDevice", %apiList, false, "", true, "The display API used for rendering.", %displayDevice); - - %numDevices = Canvas.getMonitorCount(); - - %devicesList = getDisplayDeviceList(); - - if($pref::Video::displayDeviceId $= "") - $pref::Video::displayDeviceId = getField(%devicesList, $pref::Video::deviceId); - - OptionsMenuSettingsList.addOptionRow("Display Device", "$pref::Video::displayDeviceId", %devicesList, false, "", true, "The display devices the window should be on."); - - if (%numDevices > 1) - OptionsMenuSettingsList.setRowEnabled(1, true); - else - OptionsMenuSettingsList.setRowEnabled(1, false); - - %mode = OptionsMenu.getOptionVariableValue("$pref::Video::deviceMode"); - if(isInt(%mode)) - %mode = getField($Video::ModeTags, $pref::Video::deviceMode); - OptionsMenuSettingsList.addOptionRow("Window Mode", "$pref::Video::deviceMode", $Video::ModeTags, false, "", true, "", %mode); - - if(%mode !$= "Borderless") - { - %resolutionList = getScreenResolutionList($pref::Video::deviceId, $Video::Mode[%mode]); - %resolution = OptionsMenu.getOptionVariableValue("$pref::Video::Resolution"); - if(%resolution $= "") - %resolution = $pref::Video::mode; - - %resolution = _makePrettyResString(%resolution); - - OptionsMenuSettingsList.addOptionRow("Resolution", "$pref::Video::Resolution", %resolutionList, false, "", true, "Resolution of the game window", %resolution); - - // If the requested resolution could not be set, mark the control and pref as changed. - %resControl = OptionsMenuSettingsList.getObject(OptionsMenuSettingsList.getCount()-1); - if (%resControl.getCurrentOption() !$= %resolution) - %resControl.onChange(); - } - - OptionsMenuSettingsList.addOptionBoolRow("VSync", "$pref::Video::enableVerticalSync", $YesNoList, false, "", true, "", ""); - - - %refreshList = getScreenRefreshList($pref::Video::mode); - OptionsMenuSettingsList.addOptionRow("Refresh Rate", "$pref::Video::RefreshRate", %refreshList, false, "", true, "", OptionsMenu.getOptionVariableValue("$pref::Video::RefreshRate")); - - //move to gameplay tab - //OptionsMenuSettingsList.addSliderRow("Field of View", "", 75, 5, "65 100", ""); - - //OptionsMenuSettingsList.addSliderRow("Brightness", "", 0.5, 0.1, "0 1", ""); - //OptionsMenuSettingsList.addSliderRow("Contrast", "", 0.5, 0.1, "0 1", ""); -} - -// -// -// -function populateGraphicsSettingsList() -{ - OptionsMenuSettingsList.clear(); - - OptionsMenu.currentCategory = "Graphics"; - - if(isObject(OptionName)) - OptionName.setText(""); - if(isObject(OptionDescription)) - OptionDescription.setText(""); - - %yesNoList = "No\tYes"; - %onOffList = "Off\tOn"; - %anisoFilter = "Off\t4\t8\t16"; - %aaTypeFilter = "None\tFXAA\tSMAA\tSMAA High"; - OptionsMenuSettingsList.addOptionQualityLevelRow("Lighting Quality", "$pref::Graphics::LightingQuality", - LightingQualityList, false, "", true, "Amount and drawdistance of local lights"); - OptionsMenuSettingsList.addOptionQualityLevelRow("Shadow Quality", "$pref::Graphics::ShadowQuality", - ShadowQualityList, false, "", true, "Shadow revolution quality"); - - %shadowQuality = OptionsMenu.getOptionVariableValue("$pref::Graphics::ShadowQuality"); - if(%shadowQuality !$= "None") - { - OptionsMenuSettingsList.addOptionQualityLevelRow("Soft Shadow Quality", "$pref::Graphics::SoftShadowQuality", - SoftShadowList, false, "", true, "Amount of softening applied to shadowmaps"); - } - - OptionsMenuSettingsList.addOptionQualityLevelRow("Mesh Quality", "$pref::Graphics::MeshQuality", - MeshQualityGroup, false, "", true, "Fidelity of rendering of mesh objects"); - OptionsMenuSettingsList.addOptionQualityLevelRow("Object Draw Distance", "$pref::Graphics::ObjectDrawDistance", - MeshDrawDistQualityGroup, false, "", true, "Dictates if and when static objects fade out in the distance"); - OptionsMenuSettingsList.addOptionQualityLevelRow("Texture Quality", "$pref::Graphics::TextureQuality", - TextureQualityGroup, false, "", true, "Fidelity of textures"); - OptionsMenuSettingsList.addOptionQualityLevelRow("Terrain Quality", "$pref::Graphics::TerrainQuality", - TerrainQualityGroup, false, "", true, "Quality level of terrain objects"); - OptionsMenuSettingsList.addOptionQualityLevelRow("Decal Lifetime", "$pref::Graphics::DecalLifetime", - DecalLifetimeGroup, false, "", true, "How long decals are rendered"); - OptionsMenuSettingsList.addOptionQualityLevelRow("Ground Cover Density", "$pref::Graphics::GroundCoverDensity", - GroundCoverDensityGroup, false, "", true, "Density of ground cover items, such as grass"); - OptionsMenuSettingsList.addOptionQualityLevelRow("Shader Quality", "$pref::Graphics::ShaderQuality", - ShaderQualityGroup, false, "", true, "Dictates the overall shader quality level, adjusting what features are enabled."); - OptionsMenuSettingsList.addOptionRow("Anisotropic Filtering", "$pref::Video::defaultAnisotropy", %anisoFilter, false, "", true, "Amount of Anisotropic Filtering on textures, which dictates their sharpness at a distance"); - - OptionsMenuSettingsList.addOptionRow("Anti-Aliasing Type", "$pref::Video::AAMode", %aaTypeFilter, false, "", true, "The Anti-Aliasing Method applied to rendering"); - - OptionsMenuSettingsList.addOptionBoolRow("Parallax", "$pref::Video::enableParallaxMapping", %onOffList, false, "", true, "Whether the surface parallax shader effect is enabled", ""); - OptionsMenuSettingsList.addOptionBoolRow("Water Reflections", "$pref::Water::enableTrueReflections", %onOffList, false, "", true, "Whether water reflections are enabled", ""); - - OptionsMenuSettingsList.addOptionBoolRow("SSAO", "$pref::PostFX::EnableSSAO", %onOffList, false, "", true, "Whether Screen-Space Ambient Occlusion is enabled"); - OptionsMenuSettingsList.addOptionBoolRow("Depth of Field", "$pref::PostFX::EnableDOF", %onOffList, false, "", true, "Whether the Depth of Field effect is enabled"); - OptionsMenuSettingsList.addOptionBoolRow("Vignette", "$pref::PostFX::EnableVignette", %onOffList, false, "", true, "Whether the vignette effect is enabled"); - OptionsMenuSettingsList.addOptionBoolRow("Light Rays", "$pref::PostFX::EnableLightRays", %onOffList, false, "", true, "Whether the light rays effect is enabled"); -} - -function updateGraphicsSettings() -{ - if($pref::Graphics::LightingQuality !$= getCurrentQualityLevel(LightingQualityList)) - LightingQualityList.applySetting($pref::Graphics::LightingQuality); - if($pref::Graphics::ShadowQuality !$= getCurrentQualityLevel(ShadowQualityList)) - ShadowQualityList.applySetting($pref::Graphics::ShadowQuality); - if($pref::Graphics::SoftShadowQuality !$= getCurrentQualityLevel(SoftShadowList)) - SoftShadowList.applySetting($pref::Graphics::SoftShadowQuality); - - if($pref::Graphics::MeshQuality !$= getCurrentQualityLevel(MeshQualityGroup)) - MeshQualityGroup.applySetting($pref::Graphics::MeshQuality); - if($pref::Graphics::ObjectDrawDistance !$= getCurrentQualityLevel(MeshDrawDistQualityGroup)) - MeshDrawDistQualityGroup.applySetting($pref::Graphics::ObjectDrawDistance); - if($pref::Graphics::TextureQuality !$= getCurrentQualityLevel(TextureQualityGroup)) - { - TextureQualityGroup.applySetting($pref::Graphics::TextureQuality); - - reloadTextures(); - } - if($pref::Graphics::TerrainQuality !$= getCurrentQualityLevel(TerrainQualityGroup)) - TerrainQualityGroup.applySetting($pref::Graphics::TerrainQuality); - if($pref::Graphics::DecalLifetime !$= getCurrentQualityLevel(DecalLifetimeGroup)) - DecalLifetimeGroup.applySetting($pref::Graphics::DecalLifetime); - if($pref::Graphics::GroundCoverDensity !$= getCurrentQualityLevel(GroundCoverDensityGroup)) - GroundCoverDensityGroup.applySetting($pref::Graphics::GroundCoverDensity); - if($pref::Graphics::ShaderQuality !$= getCurrentQualityLevel(ShaderQualityGroup)) - { - ShaderQualityGroup.applySetting($pref::Graphics::ShaderQuality); - //this has ties into postFX behaviors, so we'll force an update to it here - updatePostFXSettings(); - } -} - -/*function updateDisplaySettings() -{ - //Update the display settings now - %deviceName = getDisplayDeviceName(); - %newDeviceID = getWord(%deviceName, 0) - 1; - - if(!isInt($pref::Video::deviceMode)) - { - //probably saved out as the mode name, so just translate it back - for(%i=0; %i < getFieldCount($Video::ModeTags); %i++) - { - if(getField($Video::ModeTags, %i) $= $pref::Video::deviceMode) - { - $pref::Video::deviceMode = %i; - break; - } - } - } - - %deviceModeName = getField($Video::ModeTags, $pref::Video::deviceMode); - %newDeviceMode = 0; - foreach$(%modeName in $Video::ModeTags) - { - if (%deviceModeName $= %modeName) - break; - else - %newDeviceMode++; - } - - if($pref::Video::deviceMode == $Video::ModeBorderless) - { - //if we're changing to borderless, we swap to the full resolution of the desktop - $pref::Video::mode = Canvas.getBestCanvasRes($pref::Video::deviceId, $pref::Video::deviceMode); - - $pref::Video::Resolution = $pref::Video::mode.x SPC $pref::Video::mode.y; - } - - %newRes = $pref::Video::Resolution; - %newBpp = 32; // ... its not 1997 anymore. - %newFullScreen = %deviceModeName $= "Fullscreen" ? true : false; - %newRefresh = $pref::Video::RefreshRate; - %newVsync = $pref::Video::enableVerticalSync; - %newAA = $pref::Video::AA; - - // Build the final mode string. - %newMode = $pref::Video::Resolution SPC %newFullScreen SPC %newBpp SPC %newRefresh SPC %newAA; - - // Change the video mode. - if ( %newMode !$= $pref::Video::mode || %newDeviceID != $pref::Video::deviceId || - %newVsync != $pref::Video::enableVerticalSync || %newDeviceMode != $pref::Video::deviceMode) - { - //****Edge Case Hack - // If we're in fullscreen mode and switching to a different monitor at the - // same resolution and maintaining fullscreen, GFX...WindowTarget::resetMode() - // will early-out because there is no "mode change" and the monitor change - // will not get applied. Instead of modifying platform code, we're going to - // move onto the new monitor in borderless and immediately switch to FS. - if (%newFullScreen && $pref::Video::FullScreen && - ($pref::Video::Resolution $= %newRes) && ($pref::Video::deviceId != %newDeviceID)) - { - $pref::Video::deviceId = %newDeviceID; - $pref::Video::deviceMode = $Video::ModeBorderless; - %tmpModeStr = Canvas.getMonitorMode(%newDeviceID, 0); - Canvas.setVideoMode(%tmpModeStr.x, %tmpModeStr.y, false, 32, getWord(%tmpModeStr, $WORD::REFRESH), %newAA); - } - - $pref::Video::mode = %newMode; - $pref::Video::enableVerticalSync = %newVsync; - $pref::Video::deviceId = %newDeviceID; - $pref::Video::deviceMode = %newDeviceMode; - $pref::Video::Resolution = %newRes; - $pref::Video::FullScreen = %newFullScreen; - $pref::Video::RefreshRate = %newRefresh; - $pref::Video::AA = %newAA; - configureCanvas(); - } -}*/ - -function updatePostFXSettings() -{ - PostFXManager.settingsEffectSetEnabled(SSAOPostFx, $pref::PostFX::EnableSSAO); - PostFXManager.settingsEffectSetEnabled(DepthOfFieldPostFX, $pref::PostFX::EnableDOF); - PostFXManager.settingsEffectSetEnabled(LightRayPostFX, $pref::PostFX::EnableLightRays); - PostFXManager.settingsEffectSetEnabled(vignettePostFX, $pref::PostFX::EnableVignette); -} - -// -// -// -function populateAudioSettingsList() -{ - OptionsMenuSettingsList.clear(); - - OptionsMenu.currentCategory = "Audio"; - - if(isObject(OptionName)) - OptionName.setText(""); - if(isObject(OptionDescription)) - OptionDescription.setText(""); - - %buffer = sfxGetAvailableDevices(); - %count = getRecordCount( %buffer ); - %audioDriverList = ""; - %audioProviderList = ""; - %audioDeviceList = ""; - - $currentAudioProvider = $currentAudioProvider $= "" ? $pref::SFX::provider : $currentAudioProvider; - - for(%i = 0; %i < %count; %i++) - { - %record = getRecord(%buffer, %i); - %provider = getField(%record, 0); - %device = getField(%record, 1); - - //When the client is actually running, we don't care about null audo devices - if(%provider $= "null") - continue; - - if(%audioProviderList $= "") - %audioProviderList = %provider; - else - %audioProviderList = %audioProviderList @ "\t" @ %provider; - - if(%provider $= $currentAudioProvider) - { - if(%audioDeviceList $= "") - %audioDeviceList = %device; - else - %audioDeviceList = %audioDeviceList @ "\t" @ %device; - } - } - - OptionsMenuSettingsList.addOptionRow("Audio Provider", "$pref::SFX::provider", %audioProviderList, false, "audioProviderChanged", true, ""); - OptionsMenuSettingsList.addOptionRow("Audio Device", "$pref::SFX::device", %audioDeviceList, false, "", true); - - OptionsMenuSettingsList.addSliderRow("Master Volume", "$pref::SFX::masterVolume", 0.1, "0 1", ""); - OptionsMenuSettingsList.addSliderRow("GUI Volume", "$pref::SFX::channelVolume[" @ $GuiAudioType @ "]", 0.1, "0 1", ""); - OptionsMenuSettingsList.addSliderRow("Effects Volume", "$pref::SFX::channelVolume[" @ $SimAudioType @ "]", 0.1, "0 1", ""); - OptionsMenuSettingsList.addSliderRow("Music Volume", "$pref::SFX::channelVolume[" @ $MusicAudioType @ "]", 0.1, "0 1", ""); -} - -function audioProviderChanged() -{ - //Get the option we have set for the provider - %provider = OptionsMenuSettingsList.getCurrentOption(0); - $currentAudioProvider = %provider; - - //And now refresh the list to get the correct devices - populateAudioSettingsList(); -} - -function updateAudioSettings() -{ - //$pref::SFX::masterVolume = OptionsMenuSettingsList.getValue(2); - sfxSetMasterVolume( $pref::SFX::masterVolume ); - - //$pref::SFX::channelVolume[ $GuiAudioType ] = OptionsMenuSettingsList.getValue(3); - //$pref::SFX::channelVolume[ $SimAudioType ] = OptionsMenuSettingsList.getValue(4); - //$pref::SFX::channelVolume[ $MusicAudioType ] = OptionsMenuSettingsList.getValue(5); - - sfxSetChannelVolume( $GuiAudioType, $pref::SFX::channelVolume[ $GuiAudioType ] ); - sfxSetChannelVolume( $SimAudioType, $pref::SFX::channelVolume[ $SimAudioType ] ); - sfxSetChannelVolume( $MusicAudioType, $pref::SFX::channelVolume[ $MusicAudioType ] ); - - //$pref::SFX::provider = OptionsMenuSettingsList.getCurrentOption(0); - //$pref::SFX::device = OptionsMenuSettingsList.getCurrentOption(1); - - if ( !sfxCreateDevice( $pref::SFX::provider, - $pref::SFX::device, - $pref::SFX::useHardware, - -1 ) ) - error( "Unable to create SFX device: " @ $pref::SFX::provider - SPC $pref::SFX::device - SPC $pref::SFX::useHardware ); - - if( !isObject( $AudioTestHandle ) ) - { - sfxPlay(menuButtonPressed); - } -} - -// -// -// -function MenuOptionsButton::onChange(%this) -{ - %optionMode = %this.getMode(); - %optionName = %this.getLabel(); - %tooltipText = %this.getTooltip(); - - %targetVar = %this.targetPrefVar; - - OptionName.setText(%optionName); - OptionDescription.setText(%tooltipText); - - if(%optionMode == 0) - { - %currentValue = %this.getCurrentOption(); - if(%currentValue !$= "") - { - if(%currentValue $= "yes" || %currentValue $= "on") - %saveReadyValue = 1; - else if(%currentValue $= "no" || %currentValue $= "off") - %saveReadyValue = 0; - else - %saveReadyValue = %currentValue; - - %prefIndex = OptionsMenu.unappliedChanges.getIndexFromKey(%targetVar); - if(%prefIndex == -1) - { - echo("Setting UnappliedChanges via add: key:" @ %targetVar @", value: " @ %saveReadyValue); - OptionsMenu.unappliedChanges.add(%targetVar, "\"" @ %saveReadyValue @ "\"" ); - } - else - { - echo("Setting UnappliedChanges via modify: key:" @ %targetVar @", value: " @ %saveReadyValue); - OptionsMenu.unappliedChanges.setValue("\"" @ %saveReadyValue @ "\"", %prefIndex); - } - } - } - else if(%optionMode == 1) - { - %currentValue = %this.getValue(); - - %prefIndex = OptionsMenu.unappliedChanges.getIndexFromKey(%targetVar); - if(%prefIndex == -1) - { - echo("Setting UnappliedChanges via add: key:" @ %targetVar @", value: " @ %currentValue); - OptionsMenu.unappliedChanges.add(%targetVar, "\"" @ %currentValue @ "\"" ); - } - else - { - OptionsMenu.unappliedChanges.setValue("\"" @ %currentValue @ "\"", %prefIndex); - } - } - - //Update the UI in case there's responsive logic - OptionsMenu.schedule(32, "refresh"); -} - -function OptionsMenu::onKeybindChanged(%this, %actionMap, %keybind) -{ - %prefIndex = OptionsMenu.unappliedChanges.getIndexFromKey(%actionMap); - if(%prefIndex == -1) - OptionsMenu.unappliedChanges.add(%actionMap, %keybind); - else - OptionsMenu.unappliedChanges.setValue(%keybind, %prefIndex); -} - -// -// new -// function addOptionGroup(%displayName) { %group = new GuiTextCtrl() {