mirror of
https://github.com/TorqueGameEngines/Torque3D.git
synced 2026-01-29 00:51:00 +00:00
Sidestep of memleak from CSF at the moment Minor fixes and corrections with asset importing and loose files WIP of updated options menu
567 lines
17 KiB
C#
567 lines
17 KiB
C#
// =============================================================================
|
|
// GRAPHICS MENU
|
|
// =============================================================================
|
|
//Mesh and Textures
|
|
//
|
|
function GraphicsMenu::onWake(%this)
|
|
{
|
|
DisplaySettingsMenu.hidden = false;
|
|
GeneralGraphicsSettingsMenu.hidden = true;
|
|
|
|
%this.refresh();
|
|
}
|
|
|
|
function GraphicsMenu::refresh(%this)
|
|
{
|
|
//
|
|
// Display Menu
|
|
GraphicsMenuFullScreen.setStateOn( Canvas.isFullScreen() );
|
|
GraphicsMenuVSync.setStateOn( !$pref::Video::disableVerticalSync );
|
|
|
|
%this.initResMenu();
|
|
%resSelId = GraphicsMenuResolution.findText( _makePrettyResString( $pref::Video::mode ) );
|
|
if( %resSelId != -1 )
|
|
GraphicsMenuResolution.setSelected( %resSelId );
|
|
|
|
GraphicsMenuDriver.clear();
|
|
|
|
%buffer = getDisplayDeviceList();
|
|
%count = getFieldCount( %buffer );
|
|
for(%i = 0; %i < %count; %i++)
|
|
GraphicsMenuDriver.add(getField(%buffer, %i), %i);
|
|
|
|
%selId = GraphicsMenuDriver.findText( getDisplayDeviceInformation() );
|
|
if ( %selId == -1 )
|
|
GraphicsMenuDriver.setFirstSelected();
|
|
else
|
|
GraphicsMenuDriver.setSelected( %selId );
|
|
//
|
|
|
|
//
|
|
// General Graphics menu
|
|
GraphicsMenuShadowQlty.init(ShadowQualityList);
|
|
GraphicsMenuSoftShadow.init(SoftShadowList);
|
|
|
|
GraphicsMenuModelDtl.init(MeshQualityGroup);
|
|
GraphicsMenuTextureDtl.init(TextureQualityGroup);
|
|
GraphicsMenuTerrainDtl.init(TerrainQualityGroup);
|
|
GraphicsMenuDecalLife.init(DecalLifetimeGroup);
|
|
GraphicsMenuGroundClutter.init(GroundCoverDensityGroup);
|
|
|
|
GraphicsMenuMaterialQlty.init(ShaderQualityGroup);
|
|
|
|
// Setup the anisotropic filtering menu.
|
|
%ansioCtrl = GraphicsMenuAniso;
|
|
%ansioCtrl.clear();
|
|
%ansioCtrl.add( "16X", 16 );
|
|
%ansioCtrl.add( "8X", 8 );
|
|
%ansioCtrl.add( "4X", 4 );
|
|
%ansioCtrl.add( "Off", 0 );
|
|
%ansioCtrl.setSelected( $pref::Video::defaultAnisotropy, false );
|
|
|
|
// set up the Refresh Rate menu.
|
|
%refreshMenu = GraphicsMenuRefreshRate;
|
|
%refreshMenu.clear();
|
|
// %refreshMenu.add("Auto", 60);
|
|
%refreshMenu.add("60", 60);
|
|
%refreshMenu.add("75", 75);
|
|
%refreshMenu.setSelected( $pref::Video::RefreshRate );
|
|
|
|
// Populate the Anti-aliasing popup.
|
|
%aaMenu = GraphicsMenuAA;
|
|
%aaMenu.clear();
|
|
%aaMenu.Add( "4x", 4 );
|
|
%aaMenu.Add( "2x", 2 );
|
|
%aaMenu.Add( "1x", 1 );
|
|
%aaMenu.Add( "Off", 0 );
|
|
%aaMenu.setSelected( $pref::Video::AA );
|
|
|
|
//Parallax
|
|
GraphicsMenuParallax.setStateOn(!$pref::Video::disableParallaxMapping);
|
|
|
|
//water reflections
|
|
GraphicsMenuWaterRefl.setStateOn(!$pref::Water::disableTrueReflections);
|
|
|
|
GraphicsMenuParallax.setStateOn(!$pref::Video::disableParallaxMapping);
|
|
|
|
GraphicsMenuAO.setStateOn($pref::PostFX::EnableSSAO);
|
|
GraphicsMenuHDR.setStateOn($pref::PostFX::EnableHDR);
|
|
GraphicsMenuDOF.setStateOn($pref::PostFX::EnableDOF);
|
|
GraphicsMenuVignette.setStateOn($pref::PostFX::EnableVignette);
|
|
GraphicsMenuLightRay.setStateOn($pref::PostFX::EnableLightRays);
|
|
}
|
|
|
|
function GraphicsMenuOKButton::onClick(%this)
|
|
{
|
|
//save the settings and then back out
|
|
GraphicsMenu.apply();
|
|
OptionsMenu.backOut();
|
|
}
|
|
|
|
function GraphicsMenu::initResMenu( %this )
|
|
{
|
|
// Clear out previous values
|
|
%resMenu = GraphicsMenuResolution;
|
|
%resMenu.clear();
|
|
|
|
// If we are in a browser then we can't change our resolution through
|
|
// the options dialog
|
|
if (getWebDeployment())
|
|
{
|
|
%count = 0;
|
|
%currRes = getWords(Canvas.getVideoMode(), $WORD::RES_X, $WORD::RES_Y);
|
|
%resMenu.add(%currRes, %count);
|
|
%count++;
|
|
|
|
return;
|
|
}
|
|
|
|
// Loop through all and add all valid resolutions
|
|
%count = 0;
|
|
%resCount = Canvas.getModeCount();
|
|
for (%i = 0; %i < %resCount; %i++)
|
|
{
|
|
%testResString = Canvas.getMode( %i );
|
|
%testRes = _makePrettyResString( %testResString );
|
|
|
|
// Only add to list if it isn't there already.
|
|
if (%resMenu.findText(%testRes) == -1)
|
|
{
|
|
%resMenu.add(%testRes, %i);
|
|
%count++;
|
|
}
|
|
}
|
|
|
|
%resMenu.sort();
|
|
}
|
|
|
|
function GraphicsQualityPopup::init( %this, %qualityGroup )
|
|
{
|
|
assert( isObject( %this ) );
|
|
assert( isObject( %qualityGroup ) );
|
|
|
|
%this.qualityGroup = %qualityGroup;
|
|
|
|
// Clear the existing content first.
|
|
%this.clear();
|
|
|
|
// Fill it.
|
|
%select = -1;
|
|
for ( %i=0; %i < %qualityGroup.getCount(); %i++ )
|
|
{
|
|
%level = %qualityGroup.getObject( %i );
|
|
if ( %level.isCurrent() )
|
|
%select = %i;
|
|
|
|
%this.add( %level.displayName, %i );
|
|
}
|
|
|
|
// Setup a default selection.
|
|
if ( %select == -1 )
|
|
%this.setText( "Custom" );
|
|
else
|
|
%this.setSelected( %select );
|
|
}
|
|
|
|
function GraphicsQualityPopup::apply( %this )
|
|
{
|
|
%levelName = %this.getText();
|
|
%this.qualityGroup.applySetting(%levelName);
|
|
}
|
|
//
|
|
function GraphicsMenu::Autodetect(%this)
|
|
{
|
|
$pref::Video::autoDetect = false;
|
|
|
|
%shaderVer = getPixelShaderVersion();
|
|
%intel = ( strstr( strupr( getDisplayDeviceInformation() ), "INTEL" ) != -1 ) ? true : false;
|
|
%videoMem = GFXCardProfilerAPI::getVideoMemoryMB();
|
|
|
|
return %this.Autodetect_Apply( %shaderVer, %intel, %videoMem );
|
|
}
|
|
|
|
function GraphicsMenu::Autodetect_Apply(%this, %shaderVer, %intel, %videoMem )
|
|
{
|
|
if ( %shaderVer < 2.0 )
|
|
{
|
|
return "Your video card does not meet the minimum requirment of shader model 2.0.";
|
|
}
|
|
|
|
if ( %shaderVer < 3.0 || %intel )
|
|
{
|
|
// Allow specular and normals for 2.0a and 2.0b
|
|
if ( %shaderVer > 2.0 )
|
|
{
|
|
MeshQualityGroup.applySetting("Lowest");
|
|
TextureQualityGroup.applySetting("Lowest");
|
|
GroundCoverDensityGroup.applySetting("Lowest");
|
|
DecalLifetimeGroup.applySetting("None");
|
|
TerrainQualityGroup.applySetting("Lowest");
|
|
ShaderQualityGroup.applySetting("High");
|
|
|
|
ShadowQualityList.applySetting("None");
|
|
|
|
SoftShadowList.applySetting("Off");
|
|
|
|
$pref::Shadows::useShadowCaching = true;
|
|
|
|
$pref::Water::disableTrueReflections = true;
|
|
$pref::Video::disableParallaxMapping = true;
|
|
$pref::PostFX::EnableSSAO = false;
|
|
$pref::PostFX::EnableHDR = false;
|
|
$pref::PostFX::EnableDOF = false;
|
|
$pref::PostFX::EnableLightRays = false;
|
|
$pref::PostFX::EnableVignette = false;
|
|
|
|
$pref::Video::AA = 0;
|
|
$pref::Video::disableVerticalSync = 0;
|
|
}
|
|
else
|
|
{
|
|
MeshQualityGroup.applySetting("Lowest");
|
|
TextureQualityGroup.applySetting("Lowest");
|
|
GroundCoverDensityGroup.applySetting("Lowest");
|
|
DecalLifetimeGroup.applySetting("None");
|
|
TerrainQualityGroup.applySetting("Lowest");
|
|
ShaderQualityGroup.applySetting("Low");
|
|
|
|
ShadowQualityList.applySetting("None");
|
|
|
|
SoftShadowList.applySetting("Off");
|
|
|
|
$pref::Shadows::useShadowCaching = true;
|
|
|
|
$pref::Water::disableTrueReflections = true;
|
|
$pref::Video::disableParallaxMapping = true;
|
|
$pref::PostFX::EnableSSAO = false;
|
|
$pref::PostFX::EnableHDR = false;
|
|
$pref::PostFX::EnableDOF = false;
|
|
$pref::PostFX::EnableLightRays = false;
|
|
$pref::PostFX::EnableVignette = false;
|
|
|
|
$pref::Video::AA = 0;
|
|
$pref::Video::disableVerticalSync = 0;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if ( %videoMem > 1000 )
|
|
{
|
|
MeshQualityGroup.applySetting("High");
|
|
TextureQualityGroup.applySetting("High");
|
|
GroundCoverDensityGroup.applySetting("High");
|
|
DecalLifetimeGroup.applySetting("High");
|
|
TerrainQualityGroup.applySetting("High");
|
|
ShaderQualityGroup.applySetting("High");
|
|
|
|
ShadowQualityList.applySetting("High");
|
|
|
|
SoftShadowList.applySetting("High");
|
|
|
|
//Should this default to on in ultra settings?
|
|
$pref::Shadows::useShadowCaching = true;
|
|
|
|
$pref::Water::disableTrueReflections = false;
|
|
$pref::Video::disableParallaxMapping = false;
|
|
$pref::PostFX::EnableSSAO = true;
|
|
$pref::PostFX::EnableHDR = true;
|
|
$pref::PostFX::EnableDOF = true;
|
|
$pref::PostFX::EnableLightRays = true;
|
|
$pref::PostFX::EnableVignette = true;
|
|
|
|
$pref::Video::AA = 4;
|
|
$pref::Video::disableVerticalSync = 16;
|
|
}
|
|
else if ( %videoMem > 400 || %videoMem == 0 )
|
|
{
|
|
MeshQualityGroup.applySetting("Medium");
|
|
TextureQualityGroup.applySetting("Medium");
|
|
GroundCoverDensityGroup.applySetting("Medium");
|
|
DecalLifetimeGroup.applySetting("Medium");
|
|
TerrainQualityGroup.applySetting("Medium");
|
|
ShaderQualityGroup.applySetting("High");
|
|
|
|
ShadowQualityList.applySetting("Medium");
|
|
|
|
SoftShadowList.applySetting("Low");
|
|
|
|
$pref::Shadows::useShadowCaching = true;
|
|
|
|
$pref::Water::disableTrueReflections = false;
|
|
$pref::Video::disableParallaxMapping = true;
|
|
$pref::PostFX::EnableSSAO = false;
|
|
$pref::PostFX::EnableHDR = true;
|
|
$pref::PostFX::EnableDOF = true;
|
|
$pref::PostFX::EnableLightRays = true;
|
|
$pref::PostFX::EnableVignette = true;
|
|
|
|
$pref::Video::AA = 4;
|
|
$pref::Video::disableVerticalSync = 4;
|
|
|
|
if ( %videoMem == 0 )
|
|
return "Torque was unable to detect available video memory. Applying 'Medium' quality.";
|
|
}
|
|
else
|
|
{
|
|
MeshQualityGroup.applySetting("Low");
|
|
TextureQualityGroup.applySetting("Low");
|
|
GroundCoverDensityGroup.applySetting("Low");
|
|
DecalLifetimeGroup.applySetting("Low");
|
|
TerrainQualityGroup.applySetting("Low");
|
|
ShaderQualityGroup.applySetting("Low");
|
|
|
|
ShadowQualityList.applySetting("None");
|
|
|
|
SoftShadowList.applySetting("Off");
|
|
|
|
$pref::Shadows::useShadowCaching = true;
|
|
|
|
$pref::Water::disableTrueReflections = false;
|
|
$pref::Video::disableParallaxMapping = true;
|
|
$pref::PostFX::EnableSSAO = false;
|
|
$pref::PostFX::EnableHDR = false;
|
|
$pref::PostFX::EnableDOF = false;
|
|
$pref::PostFX::EnableLightRays = false;
|
|
$pref::PostFX::EnableVignette = false;
|
|
|
|
$pref::Video::AA = 0;
|
|
$pref::Video::disableVerticalSync = 0;
|
|
}
|
|
}
|
|
|
|
%this.refresh();
|
|
|
|
%this.apply();
|
|
|
|
//force postFX updates
|
|
PostFXManager.settingsEffectSetEnabled("SSAO", $pref::PostFX::EnableSSAO);
|
|
PostFXManager.settingsEffectSetEnabled("HDR", $pref::PostFX::EnableHDR);
|
|
PostFXManager.settingsEffectSetEnabled("DOF", $pref::PostFX::EnableDOF);
|
|
PostFXManager.settingsEffectSetEnabled("LightRays", $pref::PostFX::EnableLightRays);
|
|
PostFXManager.settingsEffectSetEnabled("Vignette", $pref::PostFX::EnableVignette);
|
|
|
|
return "Graphics quality settings have been auto detected.";
|
|
}
|
|
|
|
function _makePrettyResString( %resString )
|
|
{
|
|
%width = getWord( %resString, $WORD::RES_X );
|
|
%height = getWord( %resString, $WORD::RES_Y );
|
|
|
|
%aspect = %width / %height;
|
|
%aspect = mRound( %aspect * 100 ) * 0.01;
|
|
|
|
switch$( %aspect )
|
|
{
|
|
case "1.33":
|
|
%aspect = "4:3";
|
|
case "1.78":
|
|
%aspect = "16:9";
|
|
default:
|
|
%aspect = "";
|
|
}
|
|
|
|
%outRes = %width @ " x " @ %height;
|
|
if ( %aspect !$= "" )
|
|
%outRes = %outRes @ " (" @ %aspect @ ")";
|
|
|
|
return %outRes;
|
|
}
|
|
|
|
//
|
|
function GraphicsMenuSetting::init( %this )
|
|
{
|
|
assert( isObject( %this ) );
|
|
//assert( isObject( %this.qualitySettingGroup ) );
|
|
|
|
// Fill it.
|
|
%select = -1;
|
|
%selectedName = "";
|
|
for ( %i=0; %i < %this.qualitySettingGroup.getCount(); %i++ )
|
|
{
|
|
%level = %this.qualitySettingGroup.getObject( %i );
|
|
|
|
%levelName = %level.displayName;
|
|
if ( %level.isCurrent() )
|
|
{
|
|
%select = %i;
|
|
%selectedName = %level.displayName;
|
|
}
|
|
}
|
|
|
|
// Setup a default selection.
|
|
if ( %select == -1 )
|
|
{
|
|
%this-->SettingText.setText( "Custom" );
|
|
%this.selectedLevel = %this.qualitySettingGroup.getCount();
|
|
}
|
|
else
|
|
{
|
|
%this-->SettingText.setText(%selectedName);
|
|
%this.selectedLevel = %select;
|
|
}
|
|
}
|
|
|
|
function GraphicsQualityLevel::isCurrent( %this )
|
|
{
|
|
// Test each pref to see if the current value
|
|
// equals our stored value.
|
|
|
|
for ( %i=0; %i < %this.count(); %i++ )
|
|
{
|
|
%pref = %this.getKey( %i );
|
|
%value = %this.getValue( %i );
|
|
|
|
if ( getVariable( %pref ) !$= %value )
|
|
return false;
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
function GraphicsQualityLevel::apply( %this )
|
|
{
|
|
for ( %i=0; %i < %this.count(); %i++ )
|
|
{
|
|
%pref = %this.getKey( %i );
|
|
%value = %this.getValue( %i );
|
|
setVariable( %pref, %value );
|
|
}
|
|
|
|
// If we have an overloaded onApply method then
|
|
// call it now to finalize the changes.
|
|
if ( %this.isMethod( "onApply" ) )
|
|
%this.onApply();
|
|
else
|
|
{
|
|
%group = %this.getGroup();
|
|
if ( isObject( %group ) && %group.isMethod( "onApply" ) )
|
|
%group.onApply( %this );
|
|
}
|
|
}
|
|
|
|
function GraphicsOptionsMenuGroup::applySetting(%this, %settingName)
|
|
{
|
|
for(%i=0; %i < %this.getCount(); %i++)
|
|
{
|
|
%setting = %this.getObject(%i);
|
|
if(%setting.displayName $= %settingName)
|
|
{
|
|
for ( %s=0; %s < %setting.count(); %s++ )
|
|
{
|
|
%pref = %setting.getKey( %s );
|
|
%value = %setting.getValue( %s );
|
|
setVariable( %pref, %value );
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
function GraphicsMenu::apply(%this)
|
|
{
|
|
%newAdapter = GraphicsMenuDriver.getText();
|
|
%numAdapters = GFXInit::getAdapterCount();
|
|
%newDevice = $pref::Video::displayDevice;
|
|
|
|
for( %i = 0; %i < %numAdapters; %i ++ )
|
|
{
|
|
if( GFXInit::getAdapterName( %i ) $= %newAdapter )
|
|
{
|
|
%newDevice = GFXInit::getAdapterType( %i );
|
|
break;
|
|
}
|
|
}
|
|
|
|
// Change the device.
|
|
if ( %newDevice !$= $pref::Video::displayDevice )
|
|
{
|
|
if ( %testNeedApply )
|
|
return true;
|
|
|
|
$pref::Video::displayDevice = %newDevice;
|
|
if( %newAdapter !$= getDisplayDeviceInformation() )
|
|
MessageBoxOK( "Change requires restart", "Please restart the game for a display device change to take effect." );
|
|
}
|
|
|
|
GraphicsMenuShadowQlty.apply();
|
|
GraphicsMenuSoftShadow.apply();
|
|
|
|
GraphicsMenuModelDtl.apply();
|
|
GraphicsMenuTextureDtl.apply();
|
|
GraphicsMenuTerrainDtl.apply();
|
|
GraphicsMenuDecalLife.apply();
|
|
GraphicsMenuGroundClutter.apply();
|
|
|
|
GraphicsMenuMaterialQlty.apply();
|
|
|
|
//Update Textures
|
|
reloadTextures();
|
|
|
|
//Update lighting
|
|
// Set the light manager. This should do nothing
|
|
// if its already set or if its not compatible.
|
|
setLightManager( $pref::lightManager );
|
|
|
|
PostFXManager.settingsEffectSetEnabled("SSAO", $pref::PostFX::EnableSSAO);
|
|
PostFXManager.settingsEffectSetEnabled("HDR", $pref::PostFX::EnableHDR);
|
|
PostFXManager.settingsEffectSetEnabled("DOF", $pref::PostFX::EnableDOF);
|
|
PostFXManager.settingsEffectSetEnabled("LightRays", $pref::PostFX::EnableLightRays);
|
|
PostFXManager.settingsEffectSetEnabled("Vignette", $pref::PostFX::EnableVignette);
|
|
|
|
$pref::Video::disableParallaxMapping = !GraphicsMenuParallax.isStateOn();
|
|
|
|
//water reflections
|
|
$pref::Water::disableTrueReflections = !GraphicsMenuWaterRefl.isStateOn();
|
|
|
|
//Update the display settings now
|
|
$pref::Video::Resolution = getWords( Canvas.getMode( GraphicsMenuResolution.getSelected() ), $WORD::RES_X, $WORD::RES_Y );
|
|
%newBpp = 32; // ... its not 1997 anymore.
|
|
$pref::Video::FullScreen = GraphicsMenuFullScreen.isStateOn() ? "true" : "false";
|
|
$pref::Video::RefreshRate = GraphicsMenuRefreshRate.getSelected();
|
|
$pref::Video::disableVerticalSync = !GraphicsMenuVSync.isStateOn();
|
|
$pref::Video::AA = GraphicsMenuAA.getSelected();
|
|
|
|
if ( %newFullScreen $= "false" )
|
|
{
|
|
// If we're in windowed mode switch the fullscreen check
|
|
// if the resolution is bigger than the desktop.
|
|
%deskRes = getDesktopResolution();
|
|
%deskResX = getWord(%deskRes, $WORD::RES_X);
|
|
%deskResY = getWord(%deskRes, $WORD::RES_Y);
|
|
if ( getWord( %newRes, $WORD::RES_X ) > %deskResX ||
|
|
getWord( %newRes, $WORD::RES_Y ) > %deskResY )
|
|
{
|
|
$pref::Video::FullScreen = "true";
|
|
GraphicsMenuFullScreen.setStateOn( true );
|
|
}
|
|
}
|
|
|
|
// Build the final mode string.
|
|
%newMode = $pref::Video::Resolution SPC $pref::Video::FullScreen SPC %newBpp SPC $pref::Video::RefreshRate SPC $pref::Video::AA;
|
|
|
|
// Change the video mode.
|
|
if ( %newMode !$= $pref::Video::mode ||
|
|
%newVsync != $pref::Video::disableVerticalSync )
|
|
{
|
|
if ( %testNeedApply )
|
|
return true;
|
|
|
|
$pref::Video::mode = %newMode;
|
|
$pref::Video::disableVerticalSync = %newVsync;
|
|
configureCanvas();
|
|
}
|
|
|
|
// Check the anisotropic filtering.
|
|
%level = GraphicsMenuAniso.getSelected();
|
|
if ( %level != $pref::Video::defaultAnisotropy )
|
|
{
|
|
if ( %testNeedApply )
|
|
return true;
|
|
|
|
$pref::Video::defaultAnisotropy = %level;
|
|
}
|
|
|
|
echo("Exporting client prefs");
|
|
%prefPath = getPrefpath();
|
|
export("$pref::*", %prefPath @ "/clientPrefs.cs", false);
|
|
} |