Implemented apply changes logic

Updated autodetect graphics to complete to new apply changes rules
Made it so gamepad can activate key rebinds
This commit is contained in:
Areloch 2023-12-19 16:37:23 -06:00
parent 70e121595f
commit df00543502
3 changed files with 292 additions and 596 deletions

View file

@ -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.");
}
@ -1353,3 +1447,19 @@ 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);
}

View file

@ -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 );
}

View file

@ -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);
%unappliedVideoChanges = VideoSettingsList.checkForUnappliedChanges();
%unappliedAudioChanges = AudioSettingsList.checkForUnappliedChanges();
echo("tryCloseOptionsMenu() - testing option: " @ %option.optionsObject.optionName @ " target level of: " @ %targetOptionLevel.displayName);
if(!%targetOptionLevel.isCurrent())
{
%unappliedChanges = true;
break;
}
}
}
}
//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);",
@ -644,49 +666,23 @@ function tryCloseOptionsMenu(%val)
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);
VideoSettingsList.applyChanges();
AudioSettingsList.applyChanges();
if(!%targetOptionLevel.isCurrent())
{
echo("Applying setting of " @ %option.optionsObject.optionName);
%targetOptionLevel.apply();
}
}
}
}
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() {