mirror of
https://github.com/TorqueGameEngines/Torque3D.git
synced 2026-01-24 14:44:45 +00:00
This makes some tweaks to the engine to support this, specifically, it tweaks the hardcoded shaderpaths to defer to a pref variable, so none of the shader paths are hardcoded. Also tweaks how post effects read in texture files, removing a bizzare filepath interpretation choice, where if the file path didn't start with "/" it forcefully appended the script's file path. This made it impossible to have images not in the same dir as the script file defining the post effect. This was changed and the existing template's post effects tweaked for now to just add "./" to those few paths impacted, as well as the perf vars to support the non-hardcoded shader paths in the engine.
474 lines
13 KiB
C#
474 lines
13 KiB
C#
//options settings
|
|
|
|
//Screen and Display menu
|
|
//Renderer Mode
|
|
//Screen resolution
|
|
//Windowed/fullscreen(borderless?)
|
|
//VSync
|
|
|
|
//Screen brightness
|
|
//screen brightness
|
|
//screen gamma
|
|
|
|
//Lighting Menu
|
|
//Shadow Distance(Distance shadows are drawn to. Also affects shadowmap slices)
|
|
//Shadow Quality(Resolution of shadows rendered, setting to none disables dynamic shadows)
|
|
//Soft Shadows(Whether shadow softening is used)
|
|
//Shadow caching(If the lights enable it, shadow caching is activated)
|
|
//Light Draw Distance(How far away lights are still drawn. Doesn't impact vector lights like the sun)
|
|
|
|
//Mesh and Textures Menu
|
|
//Draw distance(Overall draw distance) -slider
|
|
//Object draw distance(Draw distance from small/unimportant objects) -slider
|
|
//Mesh quality
|
|
//Texture quality
|
|
//Foliage draw distance
|
|
//Terrain Quality
|
|
//Decal Quality
|
|
|
|
//Effects Menu
|
|
//Parallax
|
|
//HDR
|
|
//Light shafts
|
|
//Motion Blur
|
|
//Depth of Field
|
|
//SSAO
|
|
//AA(ModelXAmount)[defualt is FXAA]
|
|
//Anisotropic filtering
|
|
|
|
//Keybinds
|
|
|
|
//Camera
|
|
//horizontal mouse sensitivity
|
|
//vert mouse sensitivity
|
|
//invert vertical
|
|
//zoom mouse sensitivities(both horz/vert)
|
|
//headbob
|
|
//FOV
|
|
|
|
function OptionsMenu::onWake(%this)
|
|
{
|
|
OptionsMain.hidden = false;
|
|
ControlsMenu.hidden = true;
|
|
GraphicsMenu.hidden = true;
|
|
AudioMenu.hidden = true;
|
|
CameraMenu.hidden = true;
|
|
ScreenBrightnessMenu.hidden = true;
|
|
|
|
OptionsOKButton.hidden = false;
|
|
OptionsCancelButton.hidden = false;
|
|
OptionsDefaultsButton.hidden = false;
|
|
}
|
|
|
|
function OptionsMenuOKButton::onClick(%this)
|
|
{
|
|
//save the settings and then back out
|
|
|
|
OptionsMenu.backOut();
|
|
}
|
|
|
|
function OptionsMenuCancelButton::onClick(%this)
|
|
{
|
|
//we don't save, so go straight to backing out of the menu
|
|
OptionsMenu.backOut();
|
|
}
|
|
|
|
function OptionsMenuDefaultsButton::onClick(%this)
|
|
{
|
|
//we don't save, so go straight to backing out of the menu
|
|
OptionsMenu.backOut();
|
|
}
|
|
|
|
function ControlsSettingsMenuButton::onClick(%this)
|
|
{
|
|
OptionsMain.hidden = true;
|
|
ControlsMenu.hidden = false;
|
|
|
|
KeyboardControlPanel.hidden = false;
|
|
MouseControlPanel.hidden = true;
|
|
|
|
ControlsMenu.reload();
|
|
}
|
|
|
|
function GraphicsSettingsMenuButton::onClick(%this)
|
|
{
|
|
OptionsMain.hidden = true;
|
|
GraphicsMenu.hidden = false;
|
|
}
|
|
|
|
function CameraSettingsMenuButton::onClick(%this)
|
|
{
|
|
OptionsMain.hidden = true;
|
|
CameraMenu.hidden = false;
|
|
|
|
CameraMenu.loadSettings();
|
|
}
|
|
|
|
function AudioSettingsMenuButton::onClick(%this)
|
|
{
|
|
OptionsMain.hidden = true;
|
|
AudioMenu.hidden = false;
|
|
AudioMenu.loadSettings();
|
|
}
|
|
|
|
function ScreenBrSettingsMenuButton::onClick(%this)
|
|
{
|
|
OptionsMain.hidden = true;
|
|
ScreenBrightnessMenu.hidden = false;
|
|
}
|
|
|
|
function OptionsMenu::backOut(%this)
|
|
{
|
|
//save the settings and then back out
|
|
if(OptionsMain.hidden == false)
|
|
{
|
|
//we're not in a specific menu, so we're actually exiting
|
|
Canvas.popDialog(OptionsMenu);
|
|
|
|
if(isObject(OptionsMenu.returnGui) && OptionsMenu.returnGui.isMethod("onReturnTo"))
|
|
OptionsMenu.returnGui.onReturnTo();
|
|
}
|
|
else
|
|
{
|
|
OptionsMain.hidden = false;
|
|
ControlsMenu.hidden = true;
|
|
GraphicsMenu.hidden = true;
|
|
CameraMenu.hidden = true;
|
|
AudioMenu.hidden = true;
|
|
ScreenBrightnessMenu.hidden = true;
|
|
}
|
|
}
|
|
|
|
function OptionsMenu::addSettingOption(%this, %arrayTarget)
|
|
{
|
|
%graphicsOption = OptionsMenu.tamlReader.read("data/ui/scripts/guis/graphicsMenuSettingsCtrl.taml");
|
|
|
|
%arrayTarget.add(%graphicsOption);
|
|
|
|
return %graphicsOption;
|
|
}
|
|
|
|
function OptionsMenu::addSliderOption(%this, %arrayTarget, %range, %ticks, %variable, %value, %class)
|
|
{
|
|
%graphicsOption = OptionsMenu.tamlReader.read("data/ui/scripts/guis/graphicsMenuSettingsSlider.taml");
|
|
|
|
%arrayTarget.add(%graphicsOption);
|
|
|
|
if(%range !$= "")
|
|
{
|
|
%graphicsOption-->slider.range = %range;
|
|
}
|
|
|
|
if(%ticks !$= "")
|
|
{
|
|
%graphicsOption-->slider.ticks = %ticks;
|
|
}
|
|
|
|
if(%variable !$= "")
|
|
{
|
|
%graphicsOption-->slider.variable = %variable;
|
|
}
|
|
|
|
if(%value !$= "")
|
|
{
|
|
%graphicsOption-->slider.setValue(%value);
|
|
}
|
|
|
|
if(%class !$= "")
|
|
{
|
|
%graphicsOption-->slider.className = %class;
|
|
}
|
|
else
|
|
%graphicsOption-->slider.className = OptionsMenuSlider;
|
|
|
|
%graphicsOption-->slider.snap = true;
|
|
|
|
%graphicsOption-->slider.onValueSet();
|
|
|
|
return %graphicsOption;
|
|
}
|
|
|
|
function OptionsMenuSlider::onMouseDragged(%this)
|
|
{
|
|
%this.onValueSet();
|
|
}
|
|
|
|
function OptionsMenuSlider::onValueSet(%this)
|
|
{
|
|
%this.getParent().getParent()-->valueText.setText(mRound(%this.value * 10));
|
|
}
|
|
|
|
function FOVOptionSlider::onMouseDragged(%this)
|
|
{
|
|
%this.onValueSet();
|
|
}
|
|
|
|
function FOVOptionSlider::onValueSet(%this)
|
|
{
|
|
%this.getParent().getParent()-->valueText.setText(mRound(%this.value));
|
|
}
|
|
|
|
/// Returns true if the current quality settings equal
|
|
/// this graphics quality level.
|
|
function OptionsMenuSettingLevel::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 );
|
|
|
|
%prefVarValue = getVariable( %pref );
|
|
if ( getVariable( %pref ) !$= %value )
|
|
return false;
|
|
}
|
|
|
|
return true;
|
|
}
|
|
// =============================================================================
|
|
// CAMERA MENU
|
|
// =============================================================================
|
|
function CameraMenu::onWake(%this)
|
|
{
|
|
|
|
}
|
|
|
|
function CameraMenu::apply(%this)
|
|
{
|
|
setFOV($pref::Player::defaultFov);
|
|
}
|
|
|
|
function CameraMenu::loadSettings(%this)
|
|
{
|
|
CameraMenuOptionsArray.clear();
|
|
|
|
%option = OptionsMenu.addSettingOption(CameraMenuOptionsArray);
|
|
%option-->nameText.setText("Invert Vertical");
|
|
%option.qualitySettingGroup = InvertVerticalMouse;
|
|
%option.init();
|
|
|
|
%option = OptionsMenu.addSliderOption(CameraMenuOptionsArray, "0.1 1", 8, "$pref::Input::VertMouseSensitivity", $pref::Input::VertMouseSensitivity);
|
|
%option-->nameText.setText("Vertical Sensitivity");
|
|
|
|
%option = OptionsMenu.addSliderOption(CameraMenuOptionsArray, "0.1 1", 8, "$pref::Input::HorzMouseSensitivity", $pref::Input::HorzMouseSensitivity);
|
|
%option-->nameText.setText("Horizontal Sensitivity");
|
|
|
|
%option = OptionsMenu.addSliderOption(CameraMenuOptionsArray, "0.1 1", 8, "$pref::Input::ZoomVertMouseSensitivity", $pref::Input::ZoomVertMouseSensitivity);
|
|
%option-->nameText.setText("Zoom Vertical Sensitivity");
|
|
|
|
%option = OptionsMenu.addSliderOption(CameraMenuOptionsArray, "0.1 1", 8, "$pref::Input::ZoomHorzMouseSensitivity", $pref::Input::ZoomHorzMouseSensitivity);
|
|
%option-->nameText.setText("Zoom Horizontal Sensitivity");
|
|
|
|
%option = OptionsMenu.addSliderOption(CameraMenuOptionsArray, "65 90", 25, "$pref::Player::defaultFov", $pref::Player::defaultFov, FOVOptionSlider);
|
|
%option-->nameText.setText("Field of View");
|
|
|
|
CameraMenuOptionsArray.refresh();
|
|
}
|
|
|
|
function CameraMenuOKButton::onClick(%this)
|
|
{
|
|
//save the settings and then back out
|
|
CameraMenu.apply();
|
|
OptionsMenu.backOut();
|
|
}
|
|
|
|
function CameraMenuDefaultsButton::onClick(%this)
|
|
{
|
|
|
|
}
|
|
// =============================================================================
|
|
// AUDIO MENU
|
|
// =============================================================================
|
|
$AudioTestHandle = 0;
|
|
// Description to use for playing the volume test sound. This isn't
|
|
// played with the description of the channel that has its volume changed
|
|
// because we know nothing about the playback state of the channel. If it
|
|
// is paused or stopped, the test sound would not play then.
|
|
$AudioTestDescription = new SFXDescription()
|
|
{
|
|
sourceGroup = AudioChannelMaster;
|
|
};
|
|
|
|
function AudioMenu::loadSettings(%this)
|
|
{
|
|
// Audio
|
|
//OptAudioHardwareToggle.setStateOn($pref::SFX::useHardware);
|
|
//OptAudioHardwareToggle.setActive( true );
|
|
|
|
%this-->OptAudioVolumeMaster.setValue( $pref::SFX::masterVolume );
|
|
%this-->OptAudioVolumeShell.setValue( $pref::SFX::channelVolume[ $GuiAudioType] );
|
|
%this-->OptAudioVolumeSim.setValue( $pref::SFX::channelVolume[ $SimAudioType ] );
|
|
%this-->OptAudioVolumeMusic.setValue( $pref::SFX::channelVolume[ $MusicAudioType ] );
|
|
|
|
AudioMenuSoundDriver.clear();
|
|
%buffer = sfxGetAvailableDevices();
|
|
%count = getRecordCount( %buffer );
|
|
for(%i = 0; %i < %count; %i++)
|
|
{
|
|
%record = getRecord(%buffer, %i);
|
|
%provider = getField(%record, 0);
|
|
|
|
if ( AudioMenuSoundDriver.findText( %provider ) == -1 )
|
|
AudioMenuSoundDriver.add( %provider, %i );
|
|
}
|
|
|
|
AudioMenuSoundDriver.sort();
|
|
|
|
%selId = AudioMenuSoundDriver.findText($pref::SFX::provider);
|
|
if ( %selId == -1 )
|
|
AudioMenuSoundDriver.setFirstSelected();
|
|
else
|
|
AudioMenuSoundDriver.setSelected( %selId );
|
|
}
|
|
|
|
function AudioMenu::loadDevices(%this)
|
|
{
|
|
if(!isObject(SoundDeviceGroup))
|
|
{
|
|
new SimGroup( SoundDeviceGroup );
|
|
}
|
|
else
|
|
{
|
|
SoundDeviceGroup.clear();
|
|
}
|
|
|
|
%buffer = sfxGetAvailableDevices();
|
|
%count = getRecordCount( %buffer );
|
|
for (%i = 0; %i < %count; %i++)
|
|
{
|
|
%record = getRecord(%buffer, %i);
|
|
%provider = getField(%record, 0);
|
|
%device = getField(%record, 1);
|
|
|
|
if($pref::SFX::provider !$= %provider)
|
|
continue;
|
|
|
|
%setting = new ArrayObject()
|
|
{
|
|
class = "OptionsMenuSettingLevel";
|
|
caseSensitive = true;
|
|
|
|
displayName = %device;
|
|
|
|
key["$pref::SFX::Device"] = %device;
|
|
};
|
|
|
|
SoundDeviceGroup.add(%setting);
|
|
}
|
|
}
|
|
|
|
function AudioMenu::apply(%this)
|
|
{
|
|
sfxSetMasterVolume( $pref::SFX::masterVolume );
|
|
|
|
sfxSetChannelVolume( $GuiAudioType, $pref::SFX::channelVolume[ $GuiAudioType ] );
|
|
sfxSetChannelVolume( $SimAudioType, $pref::SFX::channelVolume[ $SimAudioType ] );
|
|
sfxSetChannelVolume( $MusicAudioType, $pref::SFX::channelVolume[ $MusicAudioType ] );
|
|
|
|
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 AudioMenuOKButton::onClick(%this)
|
|
{
|
|
//save the settings and then back out
|
|
AudioMenu.apply();
|
|
OptionsMenu.backOut();
|
|
}
|
|
|
|
function AudioMenuDefaultsButton::onClick(%this)
|
|
{
|
|
sfxInit();
|
|
AudioMenu.loadSettings();
|
|
}
|
|
|
|
function OptAudioUpdateMasterVolume( %volume )
|
|
{
|
|
if( %volume == $pref::SFX::masterVolume )
|
|
return;
|
|
|
|
sfxSetMasterVolume( %volume );
|
|
$pref::SFX::masterVolume = %volume;
|
|
|
|
if( !isObject( $AudioTestHandle ) )
|
|
$AudioTestHandle = sfxPlayOnce( AudioChannel, "art/sound/ui/volumeTest.wav" );
|
|
}
|
|
|
|
function OptAudioUpdateChannelVolume( %description, %volume )
|
|
{
|
|
%channel = sfxGroupToOldChannel( %description.sourceGroup );
|
|
|
|
if( %volume == $pref::SFX::channelVolume[ %channel ] )
|
|
return;
|
|
|
|
sfxSetChannelVolume( %channel, %volume );
|
|
$pref::SFX::channelVolume[ %channel ] = %volume;
|
|
|
|
if( !isObject( $AudioTestHandle ) )
|
|
{
|
|
$AudioTestDescription.volume = %volume;
|
|
$AudioTestHandle = sfxPlayOnce( $AudioTestDescription, "art/sound/ui/volumeTest.wav" );
|
|
}
|
|
}
|
|
|
|
function AudioMenuSoundDriver::onSelect( %this, %id, %text )
|
|
{
|
|
// Skip empty provider selections.
|
|
if ( %text $= "" )
|
|
return;
|
|
|
|
$pref::SFX::provider = %text;
|
|
AudioMenuSoundDevice.clear();
|
|
|
|
%buffer = sfxGetAvailableDevices();
|
|
%count = getRecordCount( %buffer );
|
|
for(%i = 0; %i < %count; %i++)
|
|
{
|
|
%record = getRecord(%buffer, %i);
|
|
%provider = getField(%record, 0);
|
|
%device = getField(%record, 1);
|
|
|
|
if (%provider !$= %text)
|
|
continue;
|
|
|
|
if ( AudioMenuSoundDevice.findText( %device ) == -1 )
|
|
AudioMenuSoundDevice.add( %device, %i );
|
|
}
|
|
|
|
// Find the previous selected device.
|
|
%selId = AudioMenuSoundDevice.findText($pref::SFX::device);
|
|
if ( %selId == -1 )
|
|
AudioMenuSoundDevice.setFirstSelected();
|
|
else
|
|
AudioMenuSoundDevice.setSelected( %selId );
|
|
}
|
|
|
|
function AudioMenuSoundDevice::onSelect( %this, %id, %text )
|
|
{
|
|
// Skip empty selections.
|
|
if ( %text $= "" )
|
|
return;
|
|
|
|
$pref::SFX::device = %text;
|
|
|
|
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 );
|
|
}
|