2568 lines
84 KiB
C++
2568 lines
84 KiB
C++
![]() |
#if RSG_PC || RSG_DURANGO || RSG_ORBIS
|
||
|
|
||
|
#include "SettingsManager.h"
|
||
|
#include "SettingsManager_parser.h"
|
||
|
|
||
|
#include "bank/bkmgr.h"
|
||
|
#include "bank/combo.h"
|
||
|
#include "grcore/device.h"
|
||
|
#include "grcore/texturepc.h"
|
||
|
#include "grprofile/timebars.h"
|
||
|
#include "frontend/ProfileSettings.h"
|
||
|
#include "system/exception.h"
|
||
|
|
||
|
#include "control/replay/replay.h"
|
||
|
#include "modelinfo/VehicleModelInfo.h"
|
||
|
#include "peds/ped.h"
|
||
|
#include "renderer/Deferred/DeferredLighting.h"
|
||
|
#include "renderer/Lights/LightEntity.h"
|
||
|
#include "renderer/Lights/TiledLighting.h"
|
||
|
#include "renderer/PostProcessFX.h"
|
||
|
#include "renderer/RenderPhases/RenderPhaseCascadeShadows.h"
|
||
|
#include "renderer/RenderPhases/RenderPhaseReflection.h"
|
||
|
#include "renderer/SSAO.h"
|
||
|
#include "renderer/PlantsGrassRenderer.h"
|
||
|
#include "scene/lod/LodMgr.h"
|
||
|
#include "scene/EntityBatch.h"
|
||
|
#include "streaming/streaming.h"
|
||
|
#include "timecycle/TimeCycle.h"
|
||
|
#include "vehicles/vehicle.h"
|
||
|
|
||
|
#include "system/SettingsDefaults.h"
|
||
|
|
||
|
#include "vfx/misc/FogVolume.h"
|
||
|
#include "vfx/misc/Puddles.h"
|
||
|
#include "vfx/decals/DecalManager.h"
|
||
|
#include "vfx/misc/TerrainGrid.h"
|
||
|
|
||
|
const char* CSettingsManager::sm_presetsPath = "platform:/data/presets.meta";
|
||
|
|
||
|
#if RSG_PC
|
||
|
#define ONLY_MATCHING_MULTIMONITOR_WINDOW 0
|
||
|
#define ALLOW_MULTIMONITOR_WINDOW 0
|
||
|
#define CENTER_MULTIMONITOR_WINDOW 0
|
||
|
|
||
|
const char* CSettingsManager::sm_settingsPath = "user:/settings.xml";
|
||
|
#else
|
||
|
const char* CSettingsManager::sm_settingsPath = "platform:/data/settings.xml";
|
||
|
#endif
|
||
|
|
||
|
#if RSG_PC || RSG_DURANGO || RSG_ORBIS
|
||
|
//PARAM(graphicsSettings, "Set all settings to the value specified");
|
||
|
|
||
|
#if __DEV && RSG_PC
|
||
|
PARAM(testDeviceReset, "have device reset called periodically without having to resize the window");
|
||
|
PARAM(dumpRenderTargetSizes, "Dump out the calculated and actual render target sizes");
|
||
|
PARAM(deviceResetLogPath, "Set a path to send the files too. Default is x:/");
|
||
|
#endif
|
||
|
|
||
|
#if __BANK && RSG_PC
|
||
|
PARAM(useConsoleSettings, "Use the console-level graphics settings");
|
||
|
PARAM(settingsFile, "Custom settings file");
|
||
|
#endif // __BANK && RSG_PC
|
||
|
|
||
|
NOSTRIP_PARAM(tessellation,"[QUALITY SETTINGS] Set tessellation on or off (0-3)");
|
||
|
NOSTRIP_PARAM(lodScale,"[QUALITY SETTINGS] Set Lod Distance Level (0.0-1.0f)");
|
||
|
NOSTRIP_PARAM(pedLodBias,"[QUALITY SETTINGS] Set Pedestrians Lod Distance Bias (0.0-1.0f)");
|
||
|
NOSTRIP_PARAM(vehicleLodBias,"[QUALITY SETTINGS] Set Vehicles Lod Distance Bias (0.0-1.0f)");
|
||
|
NOSTRIP_PARAM(shadowQuality,"[QUALITY SETTINGS] Set shadow quality (0-3)");
|
||
|
NOSTRIP_PARAM(reflectionQuality,"[QUALITY SETTINGS] Set reflection quality (0-3)");
|
||
|
NOSTRIP_PARAM(reflectionMSAA,"[QUALITY SETTINGS] Set reflection MSAA level (0, 2, 4, or 8)");
|
||
|
NOSTRIP_PARAM(SSAO,"[QUALITY SETTINGS] Set SSAO quality (0-2)");
|
||
|
NOSTRIP_PARAM(anisotropicQualityLevel, "[QUALITY SETTINGS] Set anisotropic Filter Quality Level (0-16)");
|
||
|
NOSTRIP_PARAM(textureQuality,"[QUALITY SETTINGS] Set texture quality (0-2)");
|
||
|
NOSTRIP_PARAM(particleQuality,"[QUALITY SETTINGS] Set particle quality (0-2)");
|
||
|
NOSTRIP_PARAM(waterQuality,"[QUALITY SETTINGS] Set water quality (0-1)");
|
||
|
NOSTRIP_PARAM(grassQuality,"[QUALITY SETTINGS] Set grass quality (0-3)");
|
||
|
NOSTRIP_PARAM(shaderQuality, "[QUALITY SETTINGS] Set shader quality (0-2)");
|
||
|
NOSTRIP_PARAM(shadowSoftness, "Selects between linear, rpdb, box 4x4, soft 16, NVIDIA PCSS and AMD ContactLess (0-5)");
|
||
|
NOSTRIP_PARAM(particleShadows, "[QUALITY SETTINGS] Enable particle shadows");
|
||
|
NOSTRIP_PARAM(shadowDistance, "[QUALITY SETTINGS] Shadow distance scaler (1.0 - 4.0)");
|
||
|
NOSTRIP_PARAM(shadowLongShadows, "[QUALITY SETTINGS] Enable shadow rendering for dusk and dawn");
|
||
|
NOSTRIP_PARAM(shadowSplitZStart, "[QUALITY SETTINGS] ** shadow something something **");
|
||
|
NOSTRIP_PARAM(shadowSplitZEnd, "[QUALITY SETTINGS] ** shadow something something **");
|
||
|
NOSTRIP_PARAM(shadowAircraftWeight, "[QUALITY SETTINGS] ** shadow something something **");
|
||
|
NOSTRIP_PARAM(shadowDisableScreenSizeCheck, "[QUALITY SETTINGS] Disable screen size check when rendering shadows");
|
||
|
NOSTRIP_PARAM(ultraShadows, "[QUALITY SETTINGS] Enable extra-large shadow resolution");
|
||
|
NOSTRIP_PARAM(reflectionBlur, "[QUALITY SETTINGS] Enable reflection map blur");
|
||
|
NOSTRIP_PARAM(fxaa, "[QUALITY SETTINGS] Set FXAA quality (0-3)");
|
||
|
NOSTRIP_PARAM(txaa, "[QUALITY SETTINGS] Enable NVIDIA TXAA");
|
||
|
NOSTRIP_PARAM(fogVolumes, "[QUALITY SETTINGS] Enable lights volumetric effects in foggy weather");
|
||
|
NOSTRIP_PARAM(SSA, "[QUALITY SETTINGS] Enable SSA");
|
||
|
NOSTRIP_PARAM(cityDensity, "[QUALITY SETTINGS] Control city density (0.0 - 1.0)");
|
||
|
NOSTRIP_PARAM(pedVariety, "[QUALITY SETTINGS] Control ped variety (0.0 - 1.0)");
|
||
|
NOSTRIP_PARAM(vehicleVariety, "[QUALITY SETTINGS] Control vehicle variety (0.0 - 1.0");
|
||
|
NOSTRIP_PARAM(postFX, "[QUALITY SETTINGS] Set postFX quality (0-3)");
|
||
|
NOSTRIP_PARAM(noInGameDOF, "Disable In-game DOF effects");
|
||
|
NOSTRIP_PARAM(HDStreamingInFlight, "[QUALITY SETTINGS] Enable HD streaming while in flight");
|
||
|
NOSTRIP_PARAM(MaxLODScale, "[QUALITY SETTINGS] Maximum lod scale (0.0-1.0)");
|
||
|
NOSTRIP_PARAM(MotionBlurStrength, "[QUALITY SETTINGS] Overall Motion blur strength (0.0-1.0)");
|
||
|
NOSTRIP_PARAM(samplingMode, "[QUALITY SETTINGS] Down/Super Sampling mode (0-9)");
|
||
|
|
||
|
namespace rage
|
||
|
{
|
||
|
NOSTRIP_XPARAM(width);
|
||
|
NOSTRIP_XPARAM(height);
|
||
|
|
||
|
NOSTRIP_PC_XPARAM(frameLimit);
|
||
|
}
|
||
|
|
||
|
#if RSG_PC
|
||
|
PARAM(WindowedMultiMonitor,"Allow windowed mode resolution spanning multiple monitors");
|
||
|
PARAM(OnlyMatchingMultiMonitor,"Only allow the windowed multimonitor resolution if all monitors are the same dimenions");
|
||
|
PARAM(OnlyCenterMultiMonitor,"Only allow the multimonitor system if it's on the centered monitor");
|
||
|
|
||
|
XPARAM(rag);
|
||
|
XPARAM(ragUseOwnWindow);
|
||
|
|
||
|
NOSTRIP_XPARAM(fullscreen);
|
||
|
NOSTRIP_XPARAM(windowed);
|
||
|
namespace rage
|
||
|
{
|
||
|
NOSTRIP_XPARAM(adapter);
|
||
|
XPARAM(outputMonitor);
|
||
|
XPARAM(monitor);
|
||
|
|
||
|
XPARAM(borderless);
|
||
|
XPARAM(setHwndMain);
|
||
|
XPARAM(nvstereo);
|
||
|
}
|
||
|
|
||
|
NOSTRIP_XPARAM(DX10);
|
||
|
NOSTRIP_XPARAM(DX10_1);
|
||
|
NOSTRIP_XPARAM(DX11);
|
||
|
#endif //RSG_PC
|
||
|
|
||
|
NOSTRIP_PARAM(useMinimumSettings,"Reset settings to the minimum");
|
||
|
NOSTRIP_PARAM(safemode,"Start settings at minimum but don't save it");
|
||
|
NOSTRIP_PARAM(UseAutoSettings,"Use automatic generated settings");
|
||
|
|
||
|
NOSTRIP_PARAM(ignoreDifferentVideoCard, "Don't reset settings with a new card");
|
||
|
|
||
|
PARAM(useMaximumSettings,"Set all but resolution to the max");
|
||
|
#endif // RSG_PC || RSG_DURANGO || RSG_ORBIS
|
||
|
|
||
|
#if DEVICE_MSAA
|
||
|
namespace rage {
|
||
|
NOSTRIP_XPARAM(multiSample);
|
||
|
#if DEVICE_EQAA
|
||
|
NOSTRIP_XPARAM(multiFragment);
|
||
|
#endif
|
||
|
#if __D3D11
|
||
|
XPARAM(multiSampleQuality);
|
||
|
#endif
|
||
|
}
|
||
|
#endif
|
||
|
|
||
|
//Increase this define by one every time you make changes where everyone should rebuild from default autoconfigure
|
||
|
#define FILE_VERSION_NUMBER 27
|
||
|
|
||
|
#define DEFAULT_SETTING_VALUE (CSettings::Ultra)
|
||
|
|
||
|
#if RSG_PC
|
||
|
void HandleUnknownDeviceChange()
|
||
|
{
|
||
|
CSettingsManager::GetInstance().HandlePossibleAdapterChange();
|
||
|
}
|
||
|
|
||
|
void CSettingsManager::DeviceLost()
|
||
|
{
|
||
|
|
||
|
}
|
||
|
|
||
|
void CSettingsManager::DeviceReset()
|
||
|
{
|
||
|
GetInstance().ApplyResetSettings();
|
||
|
}
|
||
|
|
||
|
void CSettingsManager::ApplyResetSettings()
|
||
|
{
|
||
|
if ((m_settings.m_graphics == m_settingsOnReset.m_graphics) && (m_settings.m_video == m_settingsOnReset.m_video))
|
||
|
{
|
||
|
GetInstance().ResolveDeviceChanged();
|
||
|
m_settingsOnReset = m_settings;
|
||
|
GetInstance().InitResolutionIndex();
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
bool resetTheShaders = (m_settings.m_graphics.m_MSAA != m_settingsOnReset.m_graphics.m_MSAA) || (m_settings.m_graphics.m_PostFX != m_settingsOnReset.m_graphics.m_PostFX);
|
||
|
m_settings = m_settingsOnReset;
|
||
|
|
||
|
RefreshRate refreshRate = GRCDEVICE.GetRefreshRate();
|
||
|
m_settings.m_video.m_RefreshRate = refreshRate.Numerator / refreshRate.Denominator;
|
||
|
|
||
|
CPopulationHelpers::OnSystemCpuRatingChanged();
|
||
|
|
||
|
ApplySettings();
|
||
|
if (resetTheShaders) ResetShaders();
|
||
|
}
|
||
|
|
||
|
void CSettingsManager::ResetShaders()
|
||
|
{
|
||
|
{
|
||
|
#if __ASSERT
|
||
|
// Disable assert on late loaded shaders.
|
||
|
grcEffect::SetAllowShaderLoading(true);
|
||
|
#endif // __ASSERT
|
||
|
|
||
|
DeferredLighting::DeleteShaders();
|
||
|
DeferredLighting::InitShaders();
|
||
|
DeferredLighting::TerminateRenderStates();
|
||
|
DeferredLighting::InitRenderStates();
|
||
|
CTiledLighting::SetupShader();
|
||
|
CRenderPhaseCascadeShadowsInterface::ResetShaders();
|
||
|
SSAO::ResetShaders();
|
||
|
#if SUPPORT_HDAO
|
||
|
SSAO::Reset_HDAOShaders();
|
||
|
#endif
|
||
|
#if SUPPORT_HDAO2
|
||
|
SSAO::Reset_HDAO2Shaders();
|
||
|
#endif
|
||
|
PostFX::ResetMSAAShaders();
|
||
|
|
||
|
CFogVolumeMgr::ResetShaders();
|
||
|
CDecalManager::ResetShaders();
|
||
|
|
||
|
PuddlePassSingleton::InstanceRef().ResetShaders();
|
||
|
|
||
|
TerrainGrid::GetInstance().InitShaders();
|
||
|
|
||
|
#if __BANK
|
||
|
DebugRenderingMgr::Init();
|
||
|
#endif
|
||
|
|
||
|
#if __ASSERT
|
||
|
// Enable assert on late loaded shaders.
|
||
|
grcEffect::SetAllowShaderLoading(false);
|
||
|
#endif // __ASSERT
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void CSettingsManager::ApplyVideoSettings(CVideoSettings& videoSettings, bool centerWindow, bool deviceReset, bool initialization)
|
||
|
{
|
||
|
GRCDEVICE.SetAdapterOrdinal(videoSettings.m_AdapterIndex);
|
||
|
GRCDEVICE.SetOutputMonitor(videoSettings.m_OutputIndex);
|
||
|
|
||
|
float fTripleHeadAspectMultiplier = 1.0f;
|
||
|
float fAspectRatio = 0.0f;
|
||
|
|
||
|
#if SUPPORT_MULTI_MONITOR
|
||
|
float fWidth = (float)videoSettings.m_ScreenWidth;
|
||
|
float fHeight = (float)videoSettings.m_ScreenHeight;
|
||
|
bool bMultihead = (fWidth / fHeight) > 3.5f; // 3x1 cutoff as defined in monitor.cpp
|
||
|
|
||
|
if(bMultihead)
|
||
|
fTripleHeadAspectMultiplier = 3.0f;
|
||
|
#endif // SUPPORT_MULTI_MONITOR
|
||
|
|
||
|
switch(videoSettings.m_AspectRatio)
|
||
|
{
|
||
|
case AR_AUTO:
|
||
|
fAspectRatio = 0.0f;
|
||
|
break;
|
||
|
case AR_3to2:
|
||
|
fAspectRatio = (3.0f / 2.0f);
|
||
|
break;
|
||
|
case AR_4to3:
|
||
|
fAspectRatio = (4.0f / 3.0f);
|
||
|
break;
|
||
|
case AR_5to3:
|
||
|
fAspectRatio = (5.0f / 3.0f);
|
||
|
break;
|
||
|
case AR_5to4:
|
||
|
fAspectRatio = (5.0f / 4.0f);
|
||
|
break;
|
||
|
case AR_16to9:
|
||
|
fAspectRatio = (16.0f / 9.0f);
|
||
|
break;
|
||
|
case AR_16to10:
|
||
|
fAspectRatio = (16.0f / 10.0f);
|
||
|
break;
|
||
|
case AR_17to9:
|
||
|
fAspectRatio = (17.0f / 9.0f);
|
||
|
break;
|
||
|
case AR_21to9:
|
||
|
fAspectRatio = (21.0f / 9.0f);
|
||
|
break;
|
||
|
default:
|
||
|
Assertf(false, "Invalid aspect enum for aspect ratio");
|
||
|
fAspectRatio = 0.0f;
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
fAspectRatio *= fTripleHeadAspectMultiplier;
|
||
|
GRCDEVICE.SetAspectRatio(fAspectRatio);
|
||
|
|
||
|
if (!IsFullscreenAllowed(videoSettings))
|
||
|
{
|
||
|
if (videoSettings.m_Windowed == 0)
|
||
|
videoSettings.m_Windowed = 2;
|
||
|
}
|
||
|
|
||
|
if (videoSettings.m_Windowed == 1)
|
||
|
{
|
||
|
GRCDEVICE.SetDesireBorderless(false);
|
||
|
|
||
|
bool needRecenter = centerWindow;
|
||
|
|
||
|
#if !__FINAL
|
||
|
if( (PARAM_rag.Get() || PARAM_setHwndMain.Get()) && !PARAM_ragUseOwnWindow.Get() )
|
||
|
needRecenter = false;
|
||
|
#endif
|
||
|
if( needRecenter )
|
||
|
{
|
||
|
GRCDEVICE.SetRecenterWindow(true);
|
||
|
}
|
||
|
}
|
||
|
else if (videoSettings.m_Windowed == 2)
|
||
|
{
|
||
|
GRCDEVICE.SetDesireBorderless(true);
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
GRCDEVICE.SetDesireBorderless(false);
|
||
|
}
|
||
|
|
||
|
grcDisplayWindow newWindow;
|
||
|
newWindow.uWidth = videoSettings.m_ScreenWidth;
|
||
|
newWindow.uHeight = videoSettings.m_ScreenHeight;
|
||
|
newWindow.uRefreshRate = videoSettings.m_RefreshRate;
|
||
|
newWindow.bFullscreen = !videoSettings.m_Windowed;
|
||
|
|
||
|
extern s32 gFrameLimit;
|
||
|
gFrameLimit = newWindow.uFrameLock = videoSettings.m_VSync;
|
||
|
#if !__FINAL
|
||
|
//assert when the window is docked in rag not using -ragUseOwnWindow
|
||
|
//as it may mean that some settings are not actually updated until a restart
|
||
|
if(PARAM_rag.Get() && m_initialised)
|
||
|
{
|
||
|
AssertMsg(PARAM_ragUseOwnWindow.Get(), "Settings may not be applied without -ragUseOwnWindow");
|
||
|
}
|
||
|
#endif
|
||
|
|
||
|
if (initialization)
|
||
|
{
|
||
|
GRCDEVICE.InitializeWindow(newWindow);
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
if (deviceReset)
|
||
|
{
|
||
|
GRCDEVICE.SetRequireDeviceRestoreCallbacks(true); //We require that the deviceRestore callbacks occur regardless of rebuilding the backbuffer
|
||
|
GRCDEVICE.SetFullscreenWindow(newWindow);
|
||
|
GRCDEVICE.ChangeDevice(newWindow);
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
DeviceReset();
|
||
|
CPauseMenu::DeviceReset();
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
#endif
|
||
|
|
||
|
#if NV_SUPPORT
|
||
|
void CSettingsManager::ChangeStereoSeparation(float fSep)
|
||
|
{
|
||
|
// update pause menu setting
|
||
|
//CPauseMenu::SetMenuPreference(PREF_VID_STEREO_SEPARATION, (s32)fSep);
|
||
|
|
||
|
// save this setting
|
||
|
CSettingsManager::GetInstance().Load();
|
||
|
if (fSep < 0.0f) // stereo deactivated
|
||
|
{
|
||
|
m_settings.m_video.m_Stereo = 0; // assume stereo is deactivated
|
||
|
CSettingsManager::GetInstance().Save(m_settings);
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
m_settings.m_video.m_Separation = fSep;
|
||
|
m_settings.m_video.m_Stereo = 1; // assume stereo is activated
|
||
|
CSettingsManager::GetInstance().Save(m_settings);
|
||
|
}
|
||
|
m_settingsOnReset = m_settings;
|
||
|
}
|
||
|
void CSettingsManager::ChangeStereoConvergence(float fConv)
|
||
|
{
|
||
|
// update pause menu setting
|
||
|
//CPauseMenu::SetMenuPreference(PREF_VID_STEREO_SEPARATION, (s32)fSep);
|
||
|
|
||
|
// save this setting
|
||
|
CSettingsManager::GetInstance().Load();
|
||
|
if (fConv < 0.0f) // stereo deactivated
|
||
|
{
|
||
|
m_settings.m_video.m_Stereo = 0; // assume stereo is deactivated
|
||
|
CSettingsManager::GetInstance().Save(m_settings);
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
m_settings.m_video.m_Convergence = fConv;
|
||
|
m_settings.m_video.m_Stereo = 1; // assume stereo is activated
|
||
|
CSettingsManager::GetInstance().Save(m_settings);
|
||
|
CPauseMenu::SetStereoOverride(true);
|
||
|
}
|
||
|
m_settingsOnReset = m_settings;
|
||
|
}
|
||
|
#endif
|
||
|
|
||
|
bool CSettingsManager::ApplySettings()
|
||
|
{
|
||
|
/*************** User settings ***************/
|
||
|
|
||
|
#if RSG_PC
|
||
|
InitResolutionIndex();
|
||
|
|
||
|
GRCDEVICE.LockContextIfInitialized();
|
||
|
#endif
|
||
|
|
||
|
#if RSG_PC
|
||
|
m_IsLowQualitySystem = SettingsDefaults::IsLowQualitySystem(m_settings);
|
||
|
|
||
|
GRCDEVICE.SetSeparationPercentage((float)m_settings.m_video.m_Separation);
|
||
|
GRCDEVICE.SetDefaultConvergenceDistance(m_settings.m_video.m_Convergence);
|
||
|
|
||
|
//Lodscale
|
||
|
const float finalRootScale = CalcFinalLodRootScale();
|
||
|
g_LodScale.SetRootScale(finalRootScale);
|
||
|
|
||
|
const bool allowOrphanScaling = !(m_settings.m_graphics.m_LodScale <= 0.2f);
|
||
|
fwMapDataContents::SetAllowOrphanScaling(allowOrphanScaling);
|
||
|
|
||
|
const bool enableInstancedGrass = m_settings.m_graphics.m_GrassQuality > CSettings::Low;
|
||
|
fwMapDataContents::SetEnableInstancedGrass(enableInstancedGrass);
|
||
|
|
||
|
CStreaming::SetForceEnableHdMapStreaming(m_settings.m_graphics.m_HdStreamingInFlight);
|
||
|
|
||
|
const bool forceLowestPriority = (m_settings.m_graphics.m_LodScale <= 0.2f);
|
||
|
CInstancePriority::SetForceLowestPriority(forceLowestPriority);
|
||
|
|
||
|
const float pedMemoryMult = m_settings.m_graphics.m_PedVarietyMultiplier*(SettingsDefaults::sm_fPedVarietyMultMaxRange-SettingsDefaults::sm_fPedVarietyMultMinRange)+SettingsDefaults::sm_fPedVarietyMultMinRange;
|
||
|
CPedPopulation::ms_pedMemoryBudgetMultiplierNG = Clamp(pedMemoryMult,0.05f,10.0f);
|
||
|
|
||
|
const float vehMemoryMult = m_settings.m_graphics.m_VehicleVarietyMultiplier*(SettingsDefaults::sm_fVehVarietyMultMaxRange-SettingsDefaults::sm_fVehVarietyMultMinRange)+SettingsDefaults::sm_fVehVarietyMultMinRange;
|
||
|
CVehiclePopulation::ms_vehicleMemoryBudgetMultiplierNG = Clamp(vehMemoryMult,0.05f,10.0f);
|
||
|
|
||
|
#endif // RSG_PC
|
||
|
CPed::SetLodMultiplierBias(m_settings.m_graphics.m_PedLodBias);
|
||
|
CVehicleModelInfo::SetLodMultiplierBias(m_settings.m_graphics.m_VehicleLodBias);
|
||
|
|
||
|
//Tessellation
|
||
|
#if RAGE_SUPPORT_TESSELLATION_TECHNIQUES
|
||
|
CRenderer::SetTessellationQuality(m_settings.m_graphics.m_Tessellation * (m_settings.m_graphics.m_DX_Version >= 2));
|
||
|
#endif
|
||
|
|
||
|
//Anisotropic filtering
|
||
|
grcTextureFactory::SetMaxAnisotropy(m_settings.m_graphics.m_AnisotropicFiltering);
|
||
|
#if __D3D11 || RSG_ORBIS
|
||
|
grcStateBlock::SetAnisotropicValue(m_settings.m_graphics.m_AnisotropicFiltering);
|
||
|
#endif
|
||
|
|
||
|
//disable this temporarily so we have a consistency across the platforms, using the defaults in replaysettings.h
|
||
|
//can be reenabled when settings manager is know to work correctly on all platforms
|
||
|
//re-enable the block count setting as this shouldn't cause problems.
|
||
|
#if GTA_REPLAY
|
||
|
//CReplayMgr::SetBytesPerReplayBlock((u32)settings.m_system.m_numBytesPerReplayBlock);
|
||
|
#if !__FINAL
|
||
|
if (rage::sysParam::FindCommandLineArg("@useDecreasedReplayMemory"))
|
||
|
{
|
||
|
m_settings.m_system.m_numReplayBlocks = 30;
|
||
|
}
|
||
|
#endif // !__FINAL
|
||
|
CReplayMgr::SetNumberOfReplayBlocksFromSettings((u16)m_settings.m_system.m_numReplayBlocks);
|
||
|
//CReplayMgr::SetMaxSizeOfStreamingReplay((u32)settings.m_system.m_maxSizeOfStreamingReplay);
|
||
|
#endif // GTA_REPLAY
|
||
|
|
||
|
#if RAGE_TIMEBARS
|
||
|
const float fRefreshRate = static_cast<float>( grcDevice::GetRefreshRate() );
|
||
|
const float fVSync = static_cast<float>( m_settings.m_video.m_VSync );
|
||
|
const float fTargetFrameRate = (fVSync > 0.0f) && (fRefreshRate > 0.0f) ? (fRefreshRate / fVSync) : (DESIRED_FRAME_RATE);
|
||
|
::rage::g_pfTB.UpdateRatedFrameRateBasedOnSettings(fTargetFrameRate);
|
||
|
#endif
|
||
|
|
||
|
/*************** Advanced settings ***************/
|
||
|
|
||
|
//SHADOW QUALITY
|
||
|
//Soft shadows
|
||
|
Displayf ("APPLY SOFT SHADOWS IN APPLY SETTINGS");
|
||
|
CRenderPhaseCascadeShadowsInterface::SetSoftShadowProperties();
|
||
|
//Particle shadows (DX11 Only)
|
||
|
//Disable particle shadows in medium or less
|
||
|
if (!m_settings.m_graphics.IsParticleShadowsEnabled())
|
||
|
{
|
||
|
CRenderPhaseCascadeShadowsInterface::SetParticleShadowsEnabled(false);
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
CRenderPhaseCascadeShadowsInterface::SetParticleShadowsEnabled(m_settings.m_graphics.m_Shadow_ParticleShadows);
|
||
|
}
|
||
|
//Scene light shadows
|
||
|
u32 useSceneShadows = m_settings.m_graphics.m_ShadowQuality ? 1 : 0;
|
||
|
Lights::SetUseSceneShadows(useSceneShadows);
|
||
|
Lights::SetupForceSceneLightFlags(useSceneShadows);
|
||
|
Lights::SetMapLightFadeDistance(m_settings.m_graphics.m_LodScale);
|
||
|
//Headlight shadows
|
||
|
//Shadow Distance
|
||
|
#if ALLOW_SHADOW_DISTANCE_SETTING
|
||
|
float shadowDistance = m_settings.m_graphics.m_ShadowQuality > CSettings::eSettingsLevel::High ? m_settings.m_graphics.m_Shadow_Distance : 1.0f;
|
||
|
|
||
|
if(m_settings.m_graphics.m_Shadow_SoftShadows >= 4)
|
||
|
{
|
||
|
// Don't mess the shadow distance when using AMD or NVidia PCSS
|
||
|
shadowDistance = 1.0f;
|
||
|
}
|
||
|
|
||
|
CRenderPhaseCascadeShadowsInterface::SetDistanceMultiplierSetting(shadowDistance, m_settings.m_graphics.m_Shadow_SplitZStart, m_settings.m_graphics.m_Shadow_SplitZEnd, m_settings.m_graphics.m_Shadow_aircraftExpWeight);
|
||
|
#endif
|
||
|
//Long shadows
|
||
|
#if ALLOW_LONG_SHADOWS_SETTING
|
||
|
CRenderPhaseCascadeShadowsInterface::SetShadowDirectionClamp(!m_settings.m_graphics.m_Shadow_LongShadows);
|
||
|
g_timeCycle.SetLongShadowsEnabled(m_settings.m_graphics.m_Shadow_LongShadows);
|
||
|
#endif
|
||
|
|
||
|
#if __D3D11
|
||
|
//REFLECTION QUALITY
|
||
|
//Compute shader mip map blur
|
||
|
|
||
|
//Standard mip blur (if compute not on)
|
||
|
CRenderPhaseReflection::ms_EnableMipBlur = m_settings.m_graphics.m_Reflection_MipBlur;
|
||
|
#endif // __D3D11
|
||
|
|
||
|
//FXAA QUALITY
|
||
|
//FXAA enabled
|
||
|
PostFX::SetFXAA(m_settings.m_graphics.m_FXAA_Enabled);
|
||
|
|
||
|
#if USE_NV_TXAA
|
||
|
// TXAA Quality
|
||
|
// TXAA enabled
|
||
|
PostFX::SetTXAA(m_settings.m_graphics.m_TXAA_Enabled);
|
||
|
#endif // USE_NV_TXAA
|
||
|
|
||
|
#if __D3D11 && RSG_PC
|
||
|
//TEXTURE QUALITY
|
||
|
//Texture quality level
|
||
|
bool bUseHDSwap = true;
|
||
|
u32 uTexQuality = m_settings.m_graphics.m_TextureQuality;
|
||
|
if (uTexQuality < CSettings::High)
|
||
|
{
|
||
|
uTexQuality++;
|
||
|
bUseHDSwap = false;
|
||
|
}
|
||
|
CTexLod::EnableStateSwapper(bUseHDSwap);
|
||
|
grcTexturePC::SetTextureQuality(uTexQuality);
|
||
|
#endif
|
||
|
#if RSG_PC
|
||
|
grcEffect::SetShaderQuality(m_settings.m_graphics.m_ShaderQuality);
|
||
|
if(m_settings.m_graphics.m_ShaderQuality >= CSettings::eSettingsLevel::Medium)
|
||
|
m_settings.m_graphics.m_Shader_SSA = true;
|
||
|
else
|
||
|
m_settings.m_graphics.m_Shader_SSA = false;
|
||
|
#endif // RSG_PC
|
||
|
//SHADER QUALITY
|
||
|
//Sub sampled alpha
|
||
|
PostFX::SetUseSubSampledAlpha(m_settings.m_graphics.m_Shader_SSA && ((m_settings.m_graphics.m_MSAA == 0) || (m_settings.m_graphics.m_MSAAFragments == 1)));
|
||
|
|
||
|
//LIGHTING QUALITY
|
||
|
//Fog Volumes
|
||
|
CLightEntity::ms_enableFogVolumes = m_settings.m_graphics.m_Lighting_FogVolumes;
|
||
|
CGrassBatch::SetQuality(m_settings.m_graphics.m_GrassQuality);
|
||
|
CFileLoader::SetPtfxSetting(m_settings.m_graphics.m_ParticleQuality);
|
||
|
|
||
|
#if PLANTS_USE_LOD_SETTINGS
|
||
|
//GRASS QUALITY
|
||
|
switch (m_settings.m_graphics.m_GrassQuality)
|
||
|
{
|
||
|
case CSettings::Low:
|
||
|
{
|
||
|
CGrassRenderer::SetPlantLODToUse(PLANTLOD_LOW);
|
||
|
break;
|
||
|
}
|
||
|
case CSettings::Medium:
|
||
|
{
|
||
|
CGrassRenderer::SetPlantLODToUse(PLANTLOD_LOW);
|
||
|
break;
|
||
|
}
|
||
|
case CSettings::High:
|
||
|
{
|
||
|
CGrassRenderer::SetPlantLODToUse(PLANTLOD_HIGH);
|
||
|
break;
|
||
|
}
|
||
|
case CSettings::Ultra:
|
||
|
{
|
||
|
CGrassRenderer::SetPlantLODToUse(PLANTLOD_HIGH);
|
||
|
break;
|
||
|
}
|
||
|
default:
|
||
|
{
|
||
|
CGrassRenderer::SetPlantLODToUse(PLANTLOD_LOW);
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
#endif
|
||
|
|
||
|
#if __BANK
|
||
|
CRenderTargets::UpdateBank(true);
|
||
|
#endif
|
||
|
|
||
|
#if RSG_PC
|
||
|
GRCDEVICE.SetSamplesAndFragments(m_settings.m_graphics.m_MSAA
|
||
|
#if DEVICE_EQAA
|
||
|
, m_settings.m_graphics.m_MSAAFragments
|
||
|
#endif
|
||
|
);
|
||
|
GRCDEVICE.SetMSAAQuality(m_settings.m_graphics.m_MSAAQuality);
|
||
|
VideoResManager::SetScalingMode(m_settings.m_graphics.m_SamplingMode);
|
||
|
#endif
|
||
|
|
||
|
#if RSG_PC
|
||
|
GRCDEVICE.UnlockContextIfInitialized();
|
||
|
#endif
|
||
|
|
||
|
#if BACKTRACE_ENABLED && RSG_PC
|
||
|
auto AddSettingLevelAnnotation = [](const char* name, CSettings::eSettingsLevel level)
|
||
|
{
|
||
|
const char* levelString = "unknown";
|
||
|
switch (level)
|
||
|
{
|
||
|
case CSettings::eSettingsLevel::Low: levelString = "low"; break;
|
||
|
case CSettings::eSettingsLevel::Medium: levelString = "medium"; break;
|
||
|
case CSettings::eSettingsLevel::High: levelString = "high"; break;
|
||
|
case CSettings::eSettingsLevel::Ultra: levelString = "ultra"; break;
|
||
|
case CSettings::eSettingsLevel::Custom: levelString = "custom"; break;
|
||
|
case CSettings::eSettingsLevel::Special: levelString = "special"; break;
|
||
|
default:
|
||
|
levelString = "unknown";
|
||
|
}
|
||
|
sysException::SetAnnotation(name, levelString);
|
||
|
};
|
||
|
|
||
|
auto AddIntAnnotation = [](const char* name, int value)
|
||
|
{
|
||
|
char buffer[32];
|
||
|
formatf(buffer, "%d", value);
|
||
|
sysException::SetAnnotation(name, buffer);
|
||
|
};
|
||
|
|
||
|
auto AddFloatAnnotation = [](const char* name, float value)
|
||
|
{
|
||
|
char buffer[32];
|
||
|
formatf(buffer, "%f", value);
|
||
|
sysException::SetAnnotation(name, buffer);
|
||
|
};
|
||
|
|
||
|
auto AddU32Annotation = [](const char* name, u32 value)
|
||
|
{
|
||
|
char buffer[32];
|
||
|
formatf(buffer, "%u", value);
|
||
|
sysException::SetAnnotation(name, buffer);
|
||
|
};
|
||
|
|
||
|
auto AddBoolAnnotation = [](const char* name, bool value)
|
||
|
{
|
||
|
sysException::SetAnnotation(name, value ? "true" : "false");
|
||
|
};
|
||
|
|
||
|
// Video Settings
|
||
|
rage::grcAdapterD3D11* pAdapter = (rage::grcAdapterD3D11*)grcAdapterManager::GetInstance()->GetAdapter(m_settings.m_video.m_AdapterIndex);
|
||
|
DXGI_ADAPTER_DESC desc;
|
||
|
pAdapter->GetDeviceAdapter()->GetDesc(&desc);
|
||
|
char adapterDesc[128];
|
||
|
WideToUtf8(adapterDesc, (rage::char16*) desc.Description, 128);
|
||
|
|
||
|
sysException::SetAnnotation("VID_adapter", adapterDesc);
|
||
|
AddU32Annotation("VID_manufacturer", pAdapter->GetManufacturer());
|
||
|
sysException::SetAnnotation("VID_driver", pAdapter->GetDriverString());
|
||
|
AddIntAnnotation("VID_GPU_Count", pAdapter->GetGPUCount());
|
||
|
AddIntAnnotation("VID_Output_Count", pAdapter->GetOutputCount());
|
||
|
AddIntAnnotation("VID_AdapterIndex", m_settings.m_video.m_AdapterIndex);
|
||
|
AddIntAnnotation("VID_OutputIndex", m_settings.m_video.m_OutputIndex);
|
||
|
|
||
|
AddIntAnnotation("VID_ScreenWidth", m_settings.m_video.m_ScreenWidth);
|
||
|
AddIntAnnotation("VID_ScreenHeight", m_settings.m_video.m_ScreenHeight);
|
||
|
AddIntAnnotation("VID_RefreshRate", m_settings.m_video.m_RefreshRate);
|
||
|
AddIntAnnotation("VID_Windowed", m_settings.m_video.m_Windowed);
|
||
|
AddIntAnnotation("VID_VSync", m_settings.m_video.m_VSync);
|
||
|
AddIntAnnotation("VID_Stereo", m_settings.m_video.m_Stereo);
|
||
|
|
||
|
// Graphics
|
||
|
AddIntAnnotation("GFX_DXVersion", m_settings.m_graphics.m_DX_Version);
|
||
|
AddSettingLevelAnnotation("GFX_Tessellation", m_settings.m_graphics.m_Tessellation);
|
||
|
AddFloatAnnotation("GFX_LODScale", m_settings.m_graphics.m_LodScale);
|
||
|
AddFloatAnnotation("GFX_PEDLODBias", m_settings.m_graphics.m_PedLodBias);
|
||
|
AddFloatAnnotation("GFX_VehicleLODBias", m_settings.m_graphics.m_VehicleLodBias);
|
||
|
AddSettingLevelAnnotation("GFX_ShadowQuality", m_settings.m_graphics.m_ShadowQuality);
|
||
|
AddSettingLevelAnnotation("GFX_ReflectionQuality", m_settings.m_graphics.m_ReflectionQuality);
|
||
|
AddIntAnnotation("GFX_ReflectionMSAA", m_settings.m_graphics.m_ReflectionMSAA);
|
||
|
AddSettingLevelAnnotation("GFX_SSAO", m_settings.m_graphics.m_SSAO );
|
||
|
AddIntAnnotation("GFX_Anisotropic", m_settings.m_graphics.m_AnisotropicFiltering);
|
||
|
AddIntAnnotation("GFX_MSAA", m_settings.m_graphics.m_MSAA);
|
||
|
AddIntAnnotation("GFX_MSAAQuality", m_settings.m_graphics.m_MSAAQuality);
|
||
|
AddIntAnnotation("GFX_SampleMode", m_settings.m_graphics.m_SamplingMode);
|
||
|
|
||
|
AddSettingLevelAnnotation("GFX_TextureQuality", m_settings.m_graphics.m_TextureQuality);
|
||
|
AddSettingLevelAnnotation("GFX_ParticleQuality", m_settings.m_graphics.m_ParticleQuality);
|
||
|
AddSettingLevelAnnotation("GFX_WaterQuality", m_settings.m_graphics.m_WaterQuality);
|
||
|
AddSettingLevelAnnotation("GFX_GrassQuality", m_settings.m_graphics.m_GrassQuality);
|
||
|
AddSettingLevelAnnotation("GFX_ShaderQuality", m_settings.m_graphics.m_ShaderQuality);
|
||
|
AddSettingLevelAnnotation("GFX_PostFX", m_settings.m_graphics.m_PostFX);
|
||
|
AddBoolAnnotation("GFX_DOF", m_settings.m_graphics.m_DoF);
|
||
|
|
||
|
// Advanced graphics settings
|
||
|
AddSettingLevelAnnotation("GFX_SoftShadows", m_settings.m_graphics.m_Shadow_SoftShadows);
|
||
|
AddBoolAnnotation("GFX_UltraShadows", m_settings.m_graphics.m_UltraShadows_Enabled);
|
||
|
AddBoolAnnotation("GFX_ParticleShadows", m_settings.m_graphics.m_Shadow_ParticleShadows);
|
||
|
AddFloatAnnotation("GFX_ShadowDistance", m_settings.m_graphics.m_Shadow_Distance);
|
||
|
AddBoolAnnotation("GFX_LongShadows", m_settings.m_graphics.m_Shadow_LongShadows);
|
||
|
AddBoolAnnotation("GFX_DisableScreenSizeCheck", m_settings.m_graphics.m_Shadow_DisableScreenSizeCheck);
|
||
|
AddBoolAnnotation("GFX_ReflectionMipBlur", m_settings.m_graphics.m_Reflection_MipBlur);
|
||
|
|
||
|
AddBoolAnnotation("GFX_FXAA", m_settings.m_graphics.m_FXAA_Enabled);
|
||
|
AddBoolAnnotation("GFX_TXAA", m_settings.m_graphics.m_TXAA_Enabled);
|
||
|
AddBoolAnnotation("GFX_FogVolumes", m_settings.m_graphics.m_Lighting_FogVolumes);
|
||
|
AddBoolAnnotation("GFX_SSA", m_settings.m_graphics.m_Shader_SSA);
|
||
|
AddFloatAnnotation("GFX_CityDensity", m_settings.m_graphics.m_CityDensity);
|
||
|
AddFloatAnnotation("GFX_PedVariety", m_settings.m_graphics.m_PedVarietyMultiplier);
|
||
|
AddFloatAnnotation("GFX_VehicleVariety", m_settings.m_graphics.m_VehicleVarietyMultiplier);
|
||
|
AddBoolAnnotation("GFX_HDStreamingInFlight", m_settings.m_graphics.m_HdStreamingInFlight);
|
||
|
AddFloatAnnotation("GFX_MaxLODScale", m_settings.m_graphics.m_MaxLodScale);
|
||
|
AddFloatAnnotation("GFX_MotionStrength", m_settings.m_graphics.m_MotionBlurStrength);
|
||
|
#endif
|
||
|
|
||
|
return true;
|
||
|
}
|
||
|
|
||
|
#if RSG_DURANGO || RSG_ORBIS || RSG_BANK
|
||
|
void CSettingsManager::InitializeConsoleSettings()
|
||
|
{
|
||
|
//Graphics
|
||
|
m_settings.m_graphics.m_DX_Version = 2;
|
||
|
m_settings.m_graphics.m_Tessellation = CSettings::High;
|
||
|
m_settings.m_graphics.m_LodScale = 1.0f;
|
||
|
m_settings.m_graphics.m_PedLodBias = 0.2f;
|
||
|
m_settings.m_graphics.m_VehicleLodBias = 0.15f;
|
||
|
m_settings.m_graphics.m_ShadowQuality = CSettings::High;
|
||
|
m_settings.m_graphics.m_ReflectionQuality = CSettings::High;
|
||
|
m_settings.m_graphics.m_ReflectionMSAA = 2;
|
||
|
|
||
|
m_settings.m_graphics.m_SSAO = CSettings::High;
|
||
|
m_settings.m_graphics.m_AnisotropicFiltering = 0;
|
||
|
|
||
|
m_settings.m_graphics.m_MSAA = 4; //Not sure on these
|
||
|
m_settings.m_graphics.m_MSAAFragments = 1; //Not sure on these
|
||
|
m_settings.m_graphics.m_MSAAQuality = 4; //Not sure on these
|
||
|
m_settings.m_graphics.m_SamplingMode = 0;
|
||
|
|
||
|
m_settings.m_graphics.m_TextureQuality = CSettings::High;
|
||
|
m_settings.m_graphics.m_ParticleQuality = CSettings::High;
|
||
|
m_settings.m_graphics.m_WaterQuality = CSettings::High;
|
||
|
m_settings.m_graphics.m_GrassQuality = CSettings::High;
|
||
|
|
||
|
m_settings.m_graphics.m_ShaderQuality = CSettings::High;
|
||
|
m_settings.m_graphics.m_PostFX = CSettings::Ultra;
|
||
|
m_settings.m_graphics.m_DoF = true;
|
||
|
|
||
|
// Advanced settings
|
||
|
m_settings.m_graphics.m_Shadow_SoftShadows = CSettings::Low;
|
||
|
m_settings.m_graphics.m_UltraShadows_Enabled = false;
|
||
|
m_settings.m_graphics.m_Shadow_ParticleShadows = true;
|
||
|
m_settings.m_graphics.m_Shadow_Distance = 1.0f;
|
||
|
m_settings.m_graphics.m_Shadow_LongShadows = false;
|
||
|
m_settings.m_graphics.m_Shadow_SplitZStart = 0.93f;
|
||
|
m_settings.m_graphics.m_Shadow_SplitZEnd = 0.89f;
|
||
|
m_settings.m_graphics.m_Shadow_aircraftExpWeight = 0.99f;
|
||
|
m_settings.m_graphics.m_Shadow_DisableScreenSizeCheck = false;
|
||
|
m_settings.m_graphics.m_Reflection_MipBlur = true;
|
||
|
m_settings.m_graphics.m_FXAA_Enabled = true;
|
||
|
m_settings.m_graphics.m_TXAA_Enabled = false;
|
||
|
m_settings.m_graphics.m_Lighting_FogVolumes = true;
|
||
|
m_settings.m_graphics.m_Shader_SSA = true;
|
||
|
m_settings.m_graphics.m_CityDensity = 1.0f;
|
||
|
m_settings.m_graphics.m_PedVarietyMultiplier = 0.8f;
|
||
|
m_settings.m_graphics.m_VehicleVarietyMultiplier = 0.8f;
|
||
|
m_settings.m_graphics.m_HdStreamingInFlight = false;
|
||
|
m_settings.m_graphics.m_MaxLodScale = 0.0f;
|
||
|
m_settings.m_graphics.m_MotionBlurStrength = 0.0f;
|
||
|
|
||
|
//System
|
||
|
m_settings.m_system.m_numBytesPerReplayBlock = 9000000;
|
||
|
m_settings.m_system.m_numReplayBlocks = 36;
|
||
|
m_settings.m_system.m_maxSizeOfStreamingReplay = 1024;
|
||
|
m_settings.m_system.m_maxFileStoreSize = 65536;
|
||
|
|
||
|
|
||
|
//Audio
|
||
|
m_settings.m_audio.m_Audio3d = false;
|
||
|
|
||
|
|
||
|
//Video
|
||
|
m_settings.m_video.m_AdapterIndex = 0;
|
||
|
m_settings.m_video.m_OutputIndex = 0;
|
||
|
m_settings.m_video.m_ScreenWidth = 1280;
|
||
|
m_settings.m_video.m_ScreenHeight = 720;
|
||
|
m_settings.m_video.m_RefreshRate = 60;
|
||
|
m_settings.m_video.m_Windowed = 0;
|
||
|
m_settings.m_video.m_VSync = 0;
|
||
|
m_settings.m_video.m_Stereo = 0;
|
||
|
m_settings.m_video.m_Convergence = 0.1f;
|
||
|
m_settings.m_video.m_Separation = 1.0f;
|
||
|
m_settings.m_video.m_PauseOnFocusLoss = 1;
|
||
|
|
||
|
#if RSG_DURANGO
|
||
|
// Apply Durango-specific overrides (if ever needed) ... for example:
|
||
|
// m_settings.m_graphics.m_Shadow_SoftShadows = CSettings::High;
|
||
|
#elif RSG_ORBIS
|
||
|
// Apply Orbis-specific overrides (if ever needed) ... for example:
|
||
|
// m_settings.m_graphics.m_Shadow_SoftShadows = CSettings::Low;
|
||
|
#endif // RSG_DURANGO / RSG_ORBIS
|
||
|
}
|
||
|
#endif //
|
||
|
|
||
|
#if RSG_PC
|
||
|
Settings CSettingsManager::GetSafeModeSettings()
|
||
|
{
|
||
|
Settings minimumSettings;
|
||
|
//Graphics
|
||
|
minimumSettings.m_graphics.m_Tessellation = CSettings::Low;
|
||
|
minimumSettings.m_graphics.m_LodScale = 0.0f;
|
||
|
minimumSettings.m_graphics.m_PedLodBias = 0.0f;
|
||
|
minimumSettings.m_graphics.m_VehicleLodBias = 0.0f;
|
||
|
minimumSettings.m_graphics.m_ShadowQuality = CSettings::Medium;
|
||
|
minimumSettings.m_graphics.m_ReflectionQuality = CSettings::Low;
|
||
|
minimumSettings.m_graphics.m_ReflectionMSAA = 0;
|
||
|
|
||
|
minimumSettings.m_graphics.m_SSAO = CSettings::Low;
|
||
|
minimumSettings.m_graphics.m_AnisotropicFiltering = 0;
|
||
|
|
||
|
minimumSettings.m_graphics.m_MSAA = 0; //Not sure on these
|
||
|
minimumSettings.m_graphics.m_MSAAFragments = 0; //Not sure on these
|
||
|
minimumSettings.m_graphics.m_MSAAQuality = 0; //Not sure on these
|
||
|
minimumSettings.m_graphics.m_SamplingMode = 0;
|
||
|
|
||
|
minimumSettings.m_graphics.m_TextureQuality = CSettings::Low;
|
||
|
minimumSettings.m_graphics.m_ParticleQuality = CSettings::Low;
|
||
|
minimumSettings.m_graphics.m_WaterQuality = CSettings::Low;
|
||
|
minimumSettings.m_graphics.m_GrassQuality = CSettings::Low;
|
||
|
|
||
|
minimumSettings.m_graphics.m_ShaderQuality = CSettings::Low;
|
||
|
minimumSettings.m_graphics.m_PostFX = CSettings::Low;
|
||
|
minimumSettings.m_graphics.m_DoF = false;
|
||
|
minimumSettings.m_graphics.m_MotionBlurStrength = 0.0f;
|
||
|
|
||
|
minimumSettings.m_graphics.m_Shadow_SoftShadows = CSettings::Low;
|
||
|
minimumSettings.m_graphics.m_UltraShadows_Enabled = false;
|
||
|
minimumSettings.m_graphics.m_Shadow_ParticleShadows = false;
|
||
|
minimumSettings.m_graphics.m_Shadow_Distance = 1.0f; // No GUI or Command line control
|
||
|
minimumSettings.m_graphics.m_Shadow_LongShadows = false;
|
||
|
minimumSettings.m_graphics.m_Shadow_SplitZStart = 0.93f; // No GUI or Command line control
|
||
|
minimumSettings.m_graphics.m_Shadow_SplitZEnd = 0.89f; // No GUI or Command line control
|
||
|
minimumSettings.m_graphics.m_Shadow_aircraftExpWeight = 0.99f; // No GUI or Command line control
|
||
|
minimumSettings.m_graphics.m_Shadow_DisableScreenSizeCheck = false;
|
||
|
minimumSettings.m_graphics.m_Reflection_MipBlur = true;
|
||
|
minimumSettings.m_graphics.m_FXAA_Enabled = false;
|
||
|
minimumSettings.m_graphics.m_TXAA_Enabled = false;
|
||
|
minimumSettings.m_graphics.m_Lighting_FogVolumes = false;
|
||
|
minimumSettings.m_graphics.m_Shader_SSA = false;
|
||
|
minimumSettings.m_graphics.m_CityDensity = 0.0f;
|
||
|
minimumSettings.m_graphics.m_PedVarietyMultiplier = 0.8f;
|
||
|
minimumSettings.m_graphics.m_VehicleVarietyMultiplier = 0.8f;
|
||
|
|
||
|
minimumSettings.m_graphics.m_DX_Version = 2;
|
||
|
|
||
|
minimumSettings.m_graphics.m_HdStreamingInFlight = false;
|
||
|
minimumSettings.m_graphics.m_MaxLodScale = 0.0f;
|
||
|
|
||
|
//System
|
||
|
minimumSettings.m_system.m_numBytesPerReplayBlock = 9000000;
|
||
|
minimumSettings.m_system.m_numReplayBlocks = 36;
|
||
|
minimumSettings.m_system.m_maxSizeOfStreamingReplay = 1024;
|
||
|
minimumSettings.m_system.m_maxFileStoreSize = 65536;
|
||
|
|
||
|
//Audio
|
||
|
minimumSettings.m_audio.m_Audio3d = false;
|
||
|
|
||
|
//Video
|
||
|
minimumSettings.m_video.m_AdapterIndex = 0;
|
||
|
minimumSettings.m_video.m_OutputIndex = 0;
|
||
|
minimumSettings.m_video.m_ScreenWidth = 800;
|
||
|
minimumSettings.m_video.m_ScreenHeight = 600;
|
||
|
minimumSettings.m_video.m_RefreshRate = 60;
|
||
|
minimumSettings.m_video.m_Windowed = 1;
|
||
|
minimumSettings.m_video.m_VSync = 2;
|
||
|
minimumSettings.m_video.m_Stereo = 0;
|
||
|
minimumSettings.m_video.m_Convergence = 0.1f;
|
||
|
minimumSettings.m_video.m_Separation = 1.0f;
|
||
|
minimumSettings.m_video.m_PauseOnFocusLoss = 1;
|
||
|
minimumSettings.m_video.m_AspectRatio = AR_AUTO;
|
||
|
|
||
|
minimumSettings.m_configSource = SMC_SAFE;
|
||
|
|
||
|
return minimumSettings;
|
||
|
}
|
||
|
#endif
|
||
|
|
||
|
#define ApplyCLISettingsI(cmd,setting,min,max)\
|
||
|
int cmd;\
|
||
|
if (PARAM_##cmd.Get(cmd))\
|
||
|
{\
|
||
|
m_settings.m_graphics.setting = (CSettings::eSettingsLevel)(Clamp(cmd,min,max));\
|
||
|
}
|
||
|
|
||
|
#define ApplyCLISettingsF(cmd,setting,min,max)\
|
||
|
float cmd;\
|
||
|
if (PARAM_##cmd.Get(cmd))\
|
||
|
{\
|
||
|
m_settings.m_graphics.setting = (Clamp(cmd,min,max));\
|
||
|
}
|
||
|
|
||
|
#define ApplyCLISettingsB(cmd,setting)\
|
||
|
int cmd;\
|
||
|
if (PARAM_##cmd.Get(cmd))\
|
||
|
{\
|
||
|
m_settings.m_graphics.setting = (cmd == 1);\
|
||
|
}
|
||
|
|
||
|
void CSettingsManager::ApplyCommandLineOverrides()
|
||
|
{
|
||
|
ApplyCLISettingsI(tessellation,m_Tessellation,0,3);
|
||
|
ApplyCLISettingsF(lodScale,m_LodScale,0.0f,1.0f);
|
||
|
ApplyCLISettingsF(pedLodBias,m_PedLodBias,0.0f,1.0f);
|
||
|
ApplyCLISettingsF(vehicleLodBias,m_VehicleLodBias,0.0f,1.0f);
|
||
|
|
||
|
int shadowQuality;
|
||
|
if (PARAM_shadowQuality.Get(shadowQuality))
|
||
|
{
|
||
|
m_settings.m_graphics.m_ShadowQuality = (CSettings::eSettingsLevel)(Clamp(shadowQuality,0,2));
|
||
|
m_settings.m_graphics.m_ShadowQuality=(CSettings::eSettingsLevel)((int)m_settings.m_graphics.m_ShadowQuality+1);
|
||
|
}
|
||
|
|
||
|
ApplyCLISettingsI(reflectionQuality,m_ReflectionQuality,0,3);
|
||
|
ApplyCLISettingsI(reflectionMSAA, m_ReflectionMSAA,0,8);
|
||
|
ApplyCLISettingsI(SSAO,m_SSAO,0,2);
|
||
|
ApplyCLISettingsI(anisotropicQualityLevel,m_AnisotropicFiltering,0,16);
|
||
|
#if DEVICE_MSAA
|
||
|
ApplyCLISettingsI(multiSample,m_MSAA,0,8);
|
||
|
#if RSG_PC
|
||
|
ApplyCLISettingsI(multiSampleQuality,m_MSAAQuality,0,16);
|
||
|
ApplyCLISettingsI(samplingMode,m_SamplingMode,0,9);
|
||
|
#endif
|
||
|
#endif
|
||
|
ApplyCLISettingsI(textureQuality,m_TextureQuality,0,2);
|
||
|
ApplyCLISettingsI(particleQuality,m_ParticleQuality,0,2);
|
||
|
ApplyCLISettingsI(waterQuality,m_WaterQuality,0,1);
|
||
|
ApplyCLISettingsI(grassQuality,m_GrassQuality,0,3);
|
||
|
ApplyCLISettingsI(shaderQuality,m_ShaderQuality,0,2);
|
||
|
ApplyCLISettingsB(ultraShadows, m_UltraShadows_Enabled);
|
||
|
ApplyCLISettingsI(shadowSoftness,m_Shadow_SoftShadows,0,5);
|
||
|
ApplyCLISettingsB(particleShadows,m_Shadow_ParticleShadows);
|
||
|
ApplyCLISettingsF(shadowDistance,m_Shadow_Distance,1.0f,4.0f);
|
||
|
ApplyCLISettingsB(shadowLongShadows,m_Shadow_LongShadows);
|
||
|
ApplyCLISettingsF(shadowSplitZStart,m_Shadow_SplitZStart,0.0f,1.0f);
|
||
|
ApplyCLISettingsF(shadowSplitZEnd,m_Shadow_SplitZEnd,0.0f,1.0f);
|
||
|
ApplyCLISettingsF(shadowAircraftWeight,m_Shadow_aircraftExpWeight,0.0f,1.0f);
|
||
|
ApplyCLISettingsB(shadowDisableScreenSizeCheck,m_Shadow_DisableScreenSizeCheck);
|
||
|
ApplyCLISettingsB(reflectionBlur,m_Reflection_MipBlur);
|
||
|
ApplyCLISettingsB(fxaa,m_FXAA_Enabled);
|
||
|
ApplyCLISettingsB(txaa,m_TXAA_Enabled);
|
||
|
ApplyCLISettingsB(fogVolumes,m_Lighting_FogVolumes);
|
||
|
ApplyCLISettingsB(SSA,m_Shader_SSA);
|
||
|
ApplyCLISettingsF(cityDensity,m_CityDensity,0.0f,1.0f);
|
||
|
ApplyCLISettingsF(pedVariety,m_PedVarietyMultiplier,0.0f,1.0f);
|
||
|
ApplyCLISettingsF(vehicleVariety,m_VehicleVarietyMultiplier,0.0f,1.0f);
|
||
|
ApplyCLISettingsI(postFX,m_PostFX,0,3);
|
||
|
ApplyCLISettingsB(noInGameDOF,m_DoF);
|
||
|
ApplyCLISettingsB(HDStreamingInFlight,m_HdStreamingInFlight);
|
||
|
ApplyCLISettingsF(MaxLODScale,m_MaxLodScale,0.0f,1.0f);
|
||
|
ApplyCLISettingsF(MotionBlurStrength, m_MotionBlurStrength, 0.0f, 1.0f);
|
||
|
|
||
|
#if RSG_PC
|
||
|
if (PARAM_DX11.Get())
|
||
|
{
|
||
|
m_settings.m_graphics.m_DX_Version = 2;
|
||
|
}
|
||
|
else if (PARAM_DX10_1.Get())
|
||
|
{
|
||
|
m_settings.m_graphics.m_DX_Version = 1;
|
||
|
}
|
||
|
else if (PARAM_DX10.Get())
|
||
|
{
|
||
|
m_settings.m_graphics.m_DX_Version = 0;
|
||
|
m_settings.m_graphics.m_MSAA = 0;
|
||
|
}
|
||
|
#endif // RSG_PC
|
||
|
|
||
|
#if RSG_PC && RSG_BANK
|
||
|
if (PARAM_useConsoleSettings.Get())
|
||
|
{
|
||
|
// Default
|
||
|
InitializeConsoleSettings();
|
||
|
m_settings.m_configSource = SMC_FIXED;
|
||
|
}
|
||
|
#endif // RSG_PC && RSG_BANK
|
||
|
|
||
|
int frameLimit;
|
||
|
if (PARAM_frameLimit.Get(frameLimit))
|
||
|
{
|
||
|
m_settings.m_video.m_VSync = rage::Min(frameLimit, 2);
|
||
|
}
|
||
|
|
||
|
#if RSG_PC
|
||
|
if (PARAM_fullscreen.Get())
|
||
|
{
|
||
|
m_settings.m_video.m_Windowed = 0;
|
||
|
GRCDEVICE.SetDesireBorderless(false);
|
||
|
}
|
||
|
else if (PARAM_borderless.Get())
|
||
|
{
|
||
|
m_settings.m_video.m_Windowed = 2;
|
||
|
GRCDEVICE.SetDesireBorderless(true);
|
||
|
}
|
||
|
else if (PARAM_windowed.Get())
|
||
|
{
|
||
|
m_settings.m_video.m_Windowed = 1;
|
||
|
GRCDEVICE.SetDesireBorderless(false);
|
||
|
}
|
||
|
|
||
|
|
||
|
int monitorIndex = 0;
|
||
|
int adapterOrdinal = -1;
|
||
|
int outputMonitor = -1;
|
||
|
if (PARAM_monitor.Get(monitorIndex))
|
||
|
{
|
||
|
ConvertFromMonitorIndex(monitorIndex, adapterOrdinal, outputMonitor);
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
PARAM_adapter.Get(adapterOrdinal);
|
||
|
PARAM_outputMonitor.Get(outputMonitor);
|
||
|
}
|
||
|
|
||
|
if (adapterOrdinal != -1) m_settings.m_video.m_AdapterIndex = adapterOrdinal;
|
||
|
if (outputMonitor != -1) m_settings.m_video.m_OutputIndex = outputMonitor;
|
||
|
|
||
|
if (m_settings.m_video.m_AdapterIndex >= grcAdapterManager::GetInstance()->GetAdapterCount())
|
||
|
{
|
||
|
m_settings.m_video.m_AdapterIndex = 0;
|
||
|
}
|
||
|
|
||
|
const grcAdapterD3D11* adapterTest = (grcAdapterD3D11*)grcAdapterManager::GetInstance()->GetAdapter(m_settings.m_video.m_AdapterIndex);
|
||
|
if (m_settings.m_video.m_OutputIndex >= adapterTest->GetOutputCount()) {
|
||
|
m_settings.m_video.m_OutputIndex = 0;
|
||
|
}
|
||
|
|
||
|
int useStereo;
|
||
|
if (PARAM_nvstereo.Get(useStereo))
|
||
|
{
|
||
|
m_settings.m_video.m_Stereo = useStereo;
|
||
|
}
|
||
|
#endif
|
||
|
|
||
|
m_CommandLineWindow.uRefreshRate = 60;
|
||
|
m_WidthHeightOverride = false;
|
||
|
if (PARAM_width.Get(m_settings.m_video.m_ScreenWidth))
|
||
|
{
|
||
|
m_WidthHeightOverride = true;
|
||
|
}
|
||
|
if (PARAM_height.Get(m_settings.m_video.m_ScreenHeight))
|
||
|
{
|
||
|
m_WidthHeightOverride = true;
|
||
|
}
|
||
|
m_CommandLineWindow.uWidth = m_settings.m_video.m_ScreenWidth;
|
||
|
m_CommandLineWindow.uHeight = m_settings.m_video.m_ScreenHeight;
|
||
|
|
||
|
if (PARAM_useMaximumSettings.Get())
|
||
|
{
|
||
|
m_settings.m_graphics.m_Tessellation = (CSettings::eSettingsLevel) 3;
|
||
|
m_settings.m_graphics.m_LodScale = 1.0f;
|
||
|
m_settings.m_graphics.m_PedLodBias = 1.0f;
|
||
|
m_settings.m_graphics.m_VehicleLodBias = 1.0f;
|
||
|
m_settings.m_graphics.m_ShadowQuality = (CSettings::eSettingsLevel) 3;
|
||
|
m_settings.m_graphics.m_ReflectionQuality = (CSettings::eSettingsLevel) 3;
|
||
|
m_settings.m_graphics.m_ReflectionMSAA = 4;
|
||
|
|
||
|
m_settings.m_graphics.m_SSAO = (CSettings::eSettingsLevel) 2;
|
||
|
m_settings.m_graphics.m_AnisotropicFiltering = (CSettings::eSettingsLevel) 16;
|
||
|
|
||
|
m_settings.m_graphics.m_TextureQuality = (CSettings::eSettingsLevel) 2;
|
||
|
m_settings.m_graphics.m_ParticleQuality= (CSettings::eSettingsLevel) 2;
|
||
|
m_settings.m_graphics.m_WaterQuality = (CSettings::eSettingsLevel) 1;
|
||
|
m_settings.m_graphics.m_GrassQuality = (CSettings::eSettingsLevel) 3;
|
||
|
m_settings.m_graphics.m_ShaderQuality = (CSettings::eSettingsLevel) 2;
|
||
|
|
||
|
// Advanced settings
|
||
|
m_settings.m_graphics.m_Shadow_SoftShadows = (CSettings::eSettingsLevel) 3;
|
||
|
m_settings.m_graphics.m_UltraShadows_Enabled = false;
|
||
|
m_settings.m_graphics.m_Shadow_ParticleShadows = true;
|
||
|
m_settings.m_graphics.m_Shadow_DisableScreenSizeCheck = true;
|
||
|
m_settings.m_graphics.m_Shadow_LongShadows = true;
|
||
|
m_settings.m_graphics.m_Reflection_MipBlur = true;
|
||
|
m_settings.m_graphics.m_FXAA_Enabled = true;
|
||
|
m_settings.m_graphics.m_Lighting_FogVolumes = true;
|
||
|
m_settings.m_graphics.m_CityDensity = 1.0f;
|
||
|
m_settings.m_graphics.m_PedVarietyMultiplier = 0.8f;
|
||
|
m_settings.m_graphics.m_VehicleVarietyMultiplier = 0.8f;
|
||
|
m_settings.m_graphics.m_PostFX = (CSettings::eSettingsLevel) 3;
|
||
|
m_settings.m_graphics.m_DoF = true;
|
||
|
m_settings.m_graphics.m_HdStreamingInFlight = true;
|
||
|
m_settings.m_graphics.m_MaxLodScale = 1.0f;
|
||
|
m_settings.m_graphics.m_MotionBlurStrength = 1.0f;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void CSettingsManager::Initialize()
|
||
|
{
|
||
|
#if RSG_DURANGO || RSG_ORBIS
|
||
|
InitializeConsoleSettings();
|
||
|
#elif RSG_PC
|
||
|
Load();
|
||
|
#endif
|
||
|
|
||
|
ApplyCommandLineOverrides();
|
||
|
|
||
|
#if RSG_PC
|
||
|
ApplyStartupSettings();
|
||
|
|
||
|
InitializeResolutionLists();
|
||
|
|
||
|
InitializeMultiMonitor();
|
||
|
|
||
|
bool ignoreWindowLimits = false;
|
||
|
if (m_WidthHeightOverride && m_settings.m_video.m_ScreenWidth == (int)m_CommandLineWindow.uWidth && m_settings.m_video.m_ScreenHeight == (int)m_CommandLineWindow.uHeight) ignoreWindowLimits = true;
|
||
|
if (m_MultiMonitorAvailable && m_settings.m_video.m_ScreenWidth == (int)m_MultiMonitorWindow.uWidth && m_settings.m_video.m_ScreenHeight == (int)m_MultiMonitorWindow.uHeight) ignoreWindowLimits = true;
|
||
|
GRCDEVICE.SetIngoreWindowLimits(ignoreWindowLimits);
|
||
|
#endif
|
||
|
|
||
|
ApplyLoadedSettings();
|
||
|
#if RSG_PC
|
||
|
m_OriginalAdapter = m_settings.m_video.m_AdapterIndex;
|
||
|
GRCDEVICE.DeviceChangeHandler = HandleUnknownDeviceChange;
|
||
|
#endif
|
||
|
PrintOutSettings(m_settings);
|
||
|
#if RSG_PC && !__FINAL
|
||
|
m_initialised = true;
|
||
|
#endif
|
||
|
}
|
||
|
|
||
|
#if RSG_PC
|
||
|
|
||
|
|
||
|
void CSettingsManager::ApplyReplaySettings()
|
||
|
{
|
||
|
#if GTA_REPLAY
|
||
|
m_ReplaySettings = m_settings;
|
||
|
|
||
|
PostFX::SetDOFInReplay(m_settings.m_graphics.m_PostFX>=CSettings::High);
|
||
|
|
||
|
m_ReplaySettings.m_graphics.m_PostFX = CSettings::Ultra;
|
||
|
m_ReplaySettings.m_graphics.m_ReflectionQuality = CSettings::Ultra;
|
||
|
m_ReplaySettings.m_graphics.m_ShadowQuality = CSettings::Ultra;
|
||
|
m_ReplaySettings.m_graphics.m_Shadow_SoftShadows = rage::Max(m_settings.m_graphics.m_Shadow_SoftShadows, CSettings::Ultra);
|
||
|
m_ReplaySettings.m_graphics.m_FXAA_Enabled = true;
|
||
|
m_ReplaySettings.m_graphics.m_AnisotropicFiltering = 16;
|
||
|
m_ReplaySettings.m_graphics.m_SSAO = CSettings::High;
|
||
|
m_ReplaySettings.m_graphics.m_Tessellation = rage::Max(CSettings::High, m_ReplaySettings.m_graphics.m_Tessellation);
|
||
|
m_ReplaySettings.m_graphics.m_WaterQuality = CSettings::High;
|
||
|
m_ReplaySettings.m_graphics.m_DoF = true;
|
||
|
m_ReplaySettings.m_graphics.m_PedLodBias = 1.0f;
|
||
|
m_ReplaySettings.m_graphics.m_VehicleLodBias = 1.0f;
|
||
|
|
||
|
GetInstance().RequestNewSettings(m_ReplaySettings);
|
||
|
#endif
|
||
|
}
|
||
|
|
||
|
|
||
|
void CSettingsManager::ApplyStartupSettings()
|
||
|
{
|
||
|
if (SettingsDefaults::GetInstance().GetDefaultGraphics().m_DX_Version < m_settings.m_graphics.m_DX_Version)
|
||
|
{
|
||
|
m_settings.m_graphics.m_DX_Version = SettingsDefaults::GetInstance().GetDefaultGraphics().m_DX_Version;
|
||
|
}
|
||
|
|
||
|
if (m_settings.m_graphics.m_DX_Version == 2)
|
||
|
{
|
||
|
PARAM_DX11.Set("1");
|
||
|
}
|
||
|
else if (m_settings.m_graphics.m_DX_Version == 1)
|
||
|
{
|
||
|
PARAM_DX10_1.Set("1");
|
||
|
}
|
||
|
else if (m_settings.m_graphics.m_DX_Version == 0)
|
||
|
{
|
||
|
PARAM_DX10.Set("1");
|
||
|
PARAM_multiSample.Set("0");
|
||
|
m_settings.m_graphics.m_MSAA = 0;
|
||
|
}
|
||
|
GRCDEVICE.SetRequestStereoDesired(m_settings.m_video.m_Stereo ? 1 : 0);
|
||
|
}
|
||
|
#endif // RSG_PC
|
||
|
|
||
|
void GetFinalConfigFilePath(char *finalPath, const char* initialPath)
|
||
|
{
|
||
|
strcpy(finalPath, initialPath);
|
||
|
|
||
|
#if __BANK && RSG_PC
|
||
|
const char *customSettingsPath;
|
||
|
if(PARAM_settingsFile.Get(customSettingsPath))
|
||
|
{
|
||
|
strcpy(finalPath, "user:/");
|
||
|
strcat(finalPath, customSettingsPath);
|
||
|
}
|
||
|
#endif
|
||
|
}
|
||
|
|
||
|
|
||
|
void CSettingsManager::Load()
|
||
|
{
|
||
|
INIT_PARSER;
|
||
|
|
||
|
char settingsFile[255];
|
||
|
GetFinalConfigFilePath(settingsFile, sm_settingsPath);
|
||
|
|
||
|
// Register this object
|
||
|
PARSER.InitObject(*this);
|
||
|
|
||
|
m_settings.m_configSource = SMC_UNKNOWN;
|
||
|
|
||
|
// Parse the user's settings file, checking for errors.
|
||
|
parSettings settings;
|
||
|
settings.SetFlag(parSettings::READ_SAFE_BUT_SLOW, true);
|
||
|
settings.SetFlag(parSettings::WARN_ON_MISSING_DATA, true);
|
||
|
if (PARAM_UseAutoSettings.Get())
|
||
|
{
|
||
|
GenerateDefaultSettings();
|
||
|
}
|
||
|
else if (!rage::ASSET.Exists(settingsFile, ""))
|
||
|
{
|
||
|
Warningf("Settings file missing, regenerating!");
|
||
|
GenerateDefaultSettings();
|
||
|
Save(m_settings);
|
||
|
}
|
||
|
else if (!Verifyf(PARSER.LoadObject(settingsFile, "", m_settings, &settings), "Loading settings failed, regenerating!"))
|
||
|
{
|
||
|
GenerateDefaultSettings();
|
||
|
Save(m_settings);
|
||
|
}
|
||
|
else
|
||
|
Displayf("[settings] Loaded settings successfully.");
|
||
|
|
||
|
#if RSG_PC
|
||
|
if (m_settings.m_video.m_AdapterIndex >= grcAdapterManager::GetInstance()->GetAdapterCount())
|
||
|
{
|
||
|
m_settings.m_video.m_AdapterIndex = 0;
|
||
|
}
|
||
|
|
||
|
const grcAdapterD3D11* adapterTest = (grcAdapterD3D11*)grcAdapterManager::GetInstance()->GetAdapter(m_settings.m_video.m_AdapterIndex);
|
||
|
if (m_settings.m_video.m_OutputIndex >= adapterTest->GetOutputCount()) {
|
||
|
m_settings.m_video.m_OutputIndex = 0;
|
||
|
}
|
||
|
|
||
|
IDXGIAdapter* pDeviceAdapter = adapterTest->GetDeviceAdapter();
|
||
|
AssertMsg(pDeviceAdapter, "Could not get the current device adapter");
|
||
|
|
||
|
DXGI_ADAPTER_DESC oAdapterDesc;
|
||
|
pDeviceAdapter->GetDesc(&oAdapterDesc);
|
||
|
|
||
|
char description[128 * 3];
|
||
|
wchar_t* wideDescription = rage::DXDiag::GetCardName(oAdapterDesc);
|
||
|
WideToAscii((char *)description, (const rage::char16*)wideDescription, (int) wcslen((const rage::char16*)wideDescription)+1);
|
||
|
|
||
|
if (!PARAM_ignoreDifferentVideoCard.Get())
|
||
|
{
|
||
|
if (m_settings.m_version != FILE_VERSION_NUMBER || m_settings.m_VideoCardDescription != description)
|
||
|
{
|
||
|
GenerateDefaultSettings();
|
||
|
Save(m_settings);
|
||
|
}
|
||
|
}
|
||
|
#endif
|
||
|
#if RSG_PC
|
||
|
if (PARAM_useMinimumSettings.Get() || PARAM_safemode.Get())
|
||
|
{
|
||
|
m_settings = GetSafeModeSettings();
|
||
|
m_settings.m_configSource = SMC_SAFE;
|
||
|
}
|
||
|
#endif
|
||
|
|
||
|
SHUTDOWN_PARSER;
|
||
|
}
|
||
|
|
||
|
bool CSettingsManager::Save(Settings& saveSettings)
|
||
|
{
|
||
|
#if RSG_PC
|
||
|
IDXGIAdapter* pDeviceAdapter = ((const grcAdapterD3D11*)grcAdapterManager::GetInstance()->GetAdapter(saveSettings.m_video.m_AdapterIndex))->GetDeviceAdapter();
|
||
|
AssertMsg(pDeviceAdapter, "Could not get the current device adapter");
|
||
|
|
||
|
DXGI_ADAPTER_DESC oAdapterDesc;
|
||
|
pDeviceAdapter->GetDesc(&oAdapterDesc);
|
||
|
|
||
|
char description[128 * 3];
|
||
|
wchar_t* wideDescription = rage::DXDiag::GetCardName(oAdapterDesc);
|
||
|
WideToAscii((char *)description, (const rage::char16*)wideDescription, (int) wcslen((const rage::char16*)wideDescription)+1);
|
||
|
|
||
|
saveSettings.m_VideoCardDescription.Set((char *)description, (int) strlen(description), 0, -1);
|
||
|
#endif
|
||
|
|
||
|
char settingsFile[255];
|
||
|
GetFinalConfigFilePath(settingsFile, sm_settingsPath);
|
||
|
|
||
|
bool success = true;
|
||
|
|
||
|
INIT_PARSER;
|
||
|
#if RSG_PC || __BANK
|
||
|
success = PARSER.SaveObjectAnyBuild(settingsFile, "", &saveSettings);
|
||
|
#else
|
||
|
(void) saveSettings;
|
||
|
#endif
|
||
|
SHUTDOWN_PARSER;
|
||
|
|
||
|
return success;
|
||
|
}
|
||
|
|
||
|
void CSettingsManager::GenerateDefaultSettings()
|
||
|
{
|
||
|
#if RSG_PC && __D3D11
|
||
|
SettingsDefaults::GetInstance().PerformMinSpecTests();
|
||
|
|
||
|
// if( PARAM_UseAutoSettings.Get() )
|
||
|
{
|
||
|
m_settings = GetSafeModeSettings();
|
||
|
m_settings.m_graphics = SettingsDefaults::GetInstance().GetDefaultGraphics();
|
||
|
m_settings.m_video = SettingsDefaults::GetInstance().GetDefaultVideo();
|
||
|
m_settings.m_configSource = SMC_AUTO;
|
||
|
|
||
|
m_settings.m_video.m_Stereo = GRCDEVICE.CanUseStereo();
|
||
|
#if __BANK
|
||
|
m_settings.m_video.m_Windowed = 1;
|
||
|
#endif
|
||
|
}
|
||
|
#elif RSG_DURANGO || RSG_ORBIS
|
||
|
InitializeConsoleSettings();
|
||
|
#endif // RSG_PC && __D3D11
|
||
|
m_settings.m_version = FILE_VERSION_NUMBER;
|
||
|
}
|
||
|
|
||
|
#if RSG_PC
|
||
|
void CSettingsManager::RevertToPreviousSettings()
|
||
|
{
|
||
|
PostFX::SetDOFInReplay(true);
|
||
|
|
||
|
RequestNewSettings(m_PreviousSettings);
|
||
|
}
|
||
|
|
||
|
void AddToListIfNotPresent(grcDisplayWindow &window, atArray<grcDisplayWindow> &list)
|
||
|
{
|
||
|
bool foundMatch = false;
|
||
|
for(int index = 0; index < list.size(); index++)
|
||
|
{
|
||
|
if (list[index].uWidth == window.uWidth && list[index].uHeight == window.uHeight)
|
||
|
foundMatch = true;
|
||
|
}
|
||
|
|
||
|
if (!foundMatch) list.PushAndGrow(window);
|
||
|
}
|
||
|
|
||
|
void CSettingsManager::InitializeMultiMonitor()
|
||
|
{
|
||
|
int iAllowMultiMonitorWindow = 0;
|
||
|
int iOnlyMatchingWindowMonitor = 0;
|
||
|
#if ALLOW_MULTIMONITOR_WINDOW
|
||
|
iAllowMultiMonitorWindow = 1;
|
||
|
#endif
|
||
|
#if ONLY_MATCHING_MULTIMONITOR_WINDOW
|
||
|
iOnlyMatchingWindowMonitor = 1;
|
||
|
#endif
|
||
|
|
||
|
PARAM_WindowedMultiMonitor.Get(iAllowMultiMonitorWindow);
|
||
|
PARAM_OnlyMatchingMultiMonitor.Get(iOnlyMatchingWindowMonitor);
|
||
|
|
||
|
struct MonitorInfo {
|
||
|
RECT DesktopCoordinates;
|
||
|
int monitorIndex;
|
||
|
};
|
||
|
|
||
|
atArray<MonitorInfo> monitors;
|
||
|
|
||
|
const int monitorCount = GetMonitorCount();
|
||
|
|
||
|
if (iAllowMultiMonitorWindow == 0 || monitorCount < 2)
|
||
|
{
|
||
|
m_MultiMonitorAvailable = false;
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
const grcAdapterD3D11* pAdapter = (const grcAdapterD3D11*)grcAdapterManager::GetInstance()->GetAdapter(0);
|
||
|
const grcAdapterD3D11Output* pMonitorOutput = pAdapter->GetOutput(0);
|
||
|
DXGI_OUTPUT_DESC desc;
|
||
|
unsigned int dpiX, dpiY;
|
||
|
grcAdapterD3D11Output::GetDesc(pAdapter->GetHighPart(), pAdapter->GetLowPart(), pMonitorOutput, desc, dpiX, dpiY);
|
||
|
|
||
|
int referenceWidth = desc.DesktopCoordinates.right - desc.DesktopCoordinates.left;
|
||
|
int referenceHeight = desc.DesktopCoordinates.bottom - desc.DesktopCoordinates.top;
|
||
|
int referenceTop = desc.DesktopCoordinates.top;
|
||
|
|
||
|
int smallestMatchingWidth = referenceWidth;
|
||
|
int smallestHeight = referenceHeight;
|
||
|
int smallestIndex = 0;
|
||
|
|
||
|
int lowestTop = referenceTop;
|
||
|
int highestBottom = desc.DesktopCoordinates.bottom;
|
||
|
|
||
|
bool bAllMonitorsMatch = true;
|
||
|
for (int index = 0; index < monitorCount; index++)
|
||
|
{
|
||
|
int adapterOrdinal, outputMonitor;
|
||
|
ConvertFromMonitorIndex(index, adapterOrdinal, outputMonitor);
|
||
|
|
||
|
pAdapter = (const grcAdapterD3D11*)grcAdapterManager::GetInstance()->GetAdapter(adapterOrdinal);
|
||
|
pMonitorOutput = pAdapter->GetOutput(outputMonitor);
|
||
|
|
||
|
grcAdapterD3D11Output::GetDesc(pAdapter->GetHighPart(), pAdapter->GetLowPart(), pMonitorOutput, desc, dpiX, dpiY);
|
||
|
|
||
|
MonitorInfo monitor;
|
||
|
monitor.DesktopCoordinates = desc.DesktopCoordinates;
|
||
|
monitor.monitorIndex = index;
|
||
|
|
||
|
monitors.PushAndGrow(monitor);
|
||
|
|
||
|
int width = desc.DesktopCoordinates.right - desc.DesktopCoordinates.left;
|
||
|
int height = desc.DesktopCoordinates.bottom - desc.DesktopCoordinates.top;
|
||
|
|
||
|
if (width != referenceWidth || height != referenceHeight || referenceTop != desc.DesktopCoordinates.top)
|
||
|
{
|
||
|
bAllMonitorsMatch = false;
|
||
|
}
|
||
|
|
||
|
if (smallestHeight > height || (smallestHeight == height && smallestMatchingWidth > width))
|
||
|
{
|
||
|
smallestHeight = height;
|
||
|
smallestMatchingWidth = width;
|
||
|
smallestIndex = index;
|
||
|
}
|
||
|
|
||
|
if (lowestTop > desc.DesktopCoordinates.top)
|
||
|
{
|
||
|
lowestTop = desc.DesktopCoordinates.top;
|
||
|
}
|
||
|
|
||
|
if (highestBottom < desc.DesktopCoordinates.bottom)
|
||
|
{
|
||
|
highestBottom = desc.DesktopCoordinates.bottom;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
for (long i = 0; i < monitorCount-1; i++)
|
||
|
{
|
||
|
for (long j = 0; j < monitorCount-1; j++)
|
||
|
{
|
||
|
if (monitors[j].DesktopCoordinates.left > monitors[j+1].DesktopCoordinates.left)
|
||
|
{
|
||
|
MonitorInfo swap = monitors[j];
|
||
|
monitors[j] = monitors[j+1];
|
||
|
monitors[j+1] = swap;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
bool windowsAreSequential = true;
|
||
|
|
||
|
for (long i = 0; i < monitorCount - 1; i++)
|
||
|
{
|
||
|
if (monitors[i].DesktopCoordinates.right != monitors[i+1].DesktopCoordinates.left)
|
||
|
{
|
||
|
windowsAreSequential = false;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if ((bAllMonitorsMatch || iOnlyMatchingWindowMonitor == 0) && windowsAreSequential && smallestHeight >= 600)
|
||
|
{
|
||
|
m_MultiMonitorAvailable = true;
|
||
|
m_MultiMonitorWindow.uWidth = smallestMatchingWidth * min(monitorCount, 3);
|
||
|
m_MultiMonitorWindow.uHeight = smallestHeight;
|
||
|
m_MultiMonitorWindow.uRefreshRate = 60;
|
||
|
m_MultiMonitorIndex = monitors[monitorCount / 2].monitorIndex;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
m_MultiMonitorAvailable = false;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void CSettingsManager::InitializeResolutionLists()
|
||
|
{
|
||
|
m_resolutionsLists.clear();
|
||
|
m_resolutionIndex = -1;
|
||
|
|
||
|
const int monitorCount = GetMonitorCount();
|
||
|
|
||
|
for (int index = 0; index < monitorCount; index++)
|
||
|
{
|
||
|
int adapterOrdinal, outputMonitor;
|
||
|
ConvertFromMonitorIndex(index, adapterOrdinal, outputMonitor);
|
||
|
|
||
|
const grcAdapterD3D11* pAdapter = (const grcAdapterD3D11*)grcAdapterManager::GetInstance()->GetAdapter(adapterOrdinal);
|
||
|
const grcAdapterD3D11Output* pMonitorOutput = pAdapter->GetOutput(outputMonitor);
|
||
|
|
||
|
atArray<grcDisplayWindow> list;
|
||
|
|
||
|
int iDisplayModes = pMonitorOutput->GetModeCount();
|
||
|
grcDisplayWindow oDisplayWindow;
|
||
|
for (int mode = 0; mode < iDisplayModes; mode++)
|
||
|
{
|
||
|
pMonitorOutput->GetMode(&oDisplayWindow, mode);
|
||
|
if (oDisplayWindow.uHeight < oDisplayWindow.uWidth)
|
||
|
list.PushAndGrow(oDisplayWindow);
|
||
|
}
|
||
|
|
||
|
if (list.size() == 0)
|
||
|
{
|
||
|
DXGI_OUTPUT_DESC desc;
|
||
|
unsigned int dpiX, dpiY;
|
||
|
grcAdapterD3D11Output::GetDesc(pAdapter->GetHighPart(), pAdapter->GetLowPart(), pMonitorOutput, desc, dpiX, dpiY);
|
||
|
|
||
|
for (int mode = 0; mode < iDisplayModes; mode++)
|
||
|
{
|
||
|
pMonitorOutput->GetMode(&oDisplayWindow, mode);
|
||
|
oDisplayWindow.uHeight = (u32) ((float) oDisplayWindow.uWidth * ((float) oDisplayWindow.uWidth / (float)oDisplayWindow.uHeight));
|
||
|
AddToListIfNotPresent(oDisplayWindow, list);
|
||
|
|
||
|
oDisplayWindow.uHeight = (u32)(oDisplayWindow.uWidth * 0.75f);
|
||
|
AddToListIfNotPresent(oDisplayWindow, list);
|
||
|
|
||
|
oDisplayWindow.uHeight = (u32)(oDisplayWindow.uWidth * 0.5625f);
|
||
|
AddToListIfNotPresent(oDisplayWindow, list);
|
||
|
}
|
||
|
|
||
|
oDisplayWindow.uWidth = desc.DesktopCoordinates.right - desc.DesktopCoordinates.left;
|
||
|
oDisplayWindow.uHeight = (u32)((float)oDisplayWindow.uWidth / grcDevice::sm_minAspectRatio);
|
||
|
|
||
|
AddToListIfNotPresent(oDisplayWindow, list);
|
||
|
}
|
||
|
|
||
|
for(int i = 1; i < list.size(); ++i)
|
||
|
{
|
||
|
if(list[i-1].uWidth == list[i].uWidth && list[i-1].uHeight == list[i].uHeight)
|
||
|
{
|
||
|
list.Delete(i);
|
||
|
i--;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
for(int i = 0; i < list.size(); ++i)
|
||
|
{
|
||
|
if(list[i].uWidth < 800 || list[i].uHeight < 600)
|
||
|
{
|
||
|
list.Delete(i);
|
||
|
i--;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
m_resolutionsLists.PushAndGrow(list);
|
||
|
}
|
||
|
|
||
|
InitResolutionIndex();
|
||
|
}
|
||
|
|
||
|
void CSettingsManager::HandlePossibleAdapterChange()
|
||
|
{
|
||
|
bool result = grcAdapterManager::GetInstance()->VerifyAdapters(DXGI_FORMAT_R8G8B8A8_UNORM);
|
||
|
|
||
|
if (!result)
|
||
|
{
|
||
|
grcAdapterManager::ShutdownClass();
|
||
|
grcAdapterManager::InitClass(DXGI_FORMAT_R8G8B8A8_UNORM);
|
||
|
|
||
|
if (m_settings.m_video.m_AdapterIndex >= grcAdapterManager::GetInstance()->GetAdapterCount())
|
||
|
{
|
||
|
m_settings.m_video.m_AdapterIndex = 0;
|
||
|
GRCDEVICE.SetAdapterOrdinal(0);
|
||
|
}
|
||
|
if (m_settings.m_video.m_OutputIndex >= grcAdapterManager::GetInstance()->GetAdapter(m_settings.m_video.m_AdapterIndex)->GetOutputCount())
|
||
|
{
|
||
|
m_settings.m_video.m_OutputIndex = 0;
|
||
|
GRCDEVICE.SetOutputMonitor(0);
|
||
|
}
|
||
|
m_settings.m_video.m_Windowed = 1;
|
||
|
|
||
|
InitializeResolutionLists();
|
||
|
|
||
|
m_AdapterOutputChanged = true;
|
||
|
|
||
|
RequestNewSettings(m_settings);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void CSettingsManager::ResolveDeviceChanged()
|
||
|
{
|
||
|
if (!GRCDEVICE.IsWindowed())
|
||
|
{
|
||
|
m_settings.m_video.m_Windowed = 0;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
LONG_PTR result = GetWindowLongPtr( g_hwndMain, GWL_STYLE );
|
||
|
if (result & WS_POPUP)
|
||
|
{
|
||
|
m_settings.m_video.m_Windowed = 2;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
m_settings.m_video.m_Windowed = 1;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if (GRCDEVICE.IsWindowDragResized() || m_settings.m_video.m_Windowed == 0)
|
||
|
{
|
||
|
m_settings.m_video.m_ScreenWidth = GRCDEVICE.GetWidth();
|
||
|
m_settings.m_video.m_ScreenHeight = GRCDEVICE.GetHeight();
|
||
|
}
|
||
|
|
||
|
RefreshRate refreshRate = GRCDEVICE.GetRefreshRate();
|
||
|
m_settings.m_video.m_RefreshRate = refreshRate.Numerator / refreshRate.Denominator;
|
||
|
}
|
||
|
|
||
|
void CSettingsManager::InitResolutionIndex()
|
||
|
{
|
||
|
m_resolutionIndex = -1;
|
||
|
int monitorIndex = ConvertToMonitorIndex(m_settings.m_video.m_AdapterIndex, m_settings.m_video.m_OutputIndex);
|
||
|
atArray<grcDisplayWindow> &list = GetResolutionList(monitorIndex);
|
||
|
|
||
|
if (m_settings.m_video.m_Windowed == 0)
|
||
|
list = GetNativeResolutionList(monitorIndex);
|
||
|
|
||
|
for (int index = 0; index < list.size(); index++)
|
||
|
{
|
||
|
if (list[index].uWidth == (u32)m_settings.m_video.m_ScreenWidth && list[index].uHeight == (u32)m_settings.m_video.m_ScreenHeight)
|
||
|
{
|
||
|
m_resolutionIndex = index;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if (m_resolutionIndex == -1 && m_settings.m_video.m_Windowed == 0)
|
||
|
{
|
||
|
for (int index = 0; index < list.size(); index++)
|
||
|
{
|
||
|
if (list[index].uWidth == (u32)GRCDEVICE.GetWidth() && list[index].uHeight == (u32)GRCDEVICE.GetHeight())
|
||
|
{
|
||
|
m_resolutionIndex = index;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if (m_resolutionIndex == -1)
|
||
|
{
|
||
|
m_resolutionIndex = 0;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
atArray<grcDisplayWindow> &CSettingsManager::GetNativeResolutionList(int monitorIndex)
|
||
|
{
|
||
|
return m_resolutionsLists[monitorIndex];
|
||
|
}
|
||
|
|
||
|
atArray<grcDisplayWindow> &CSettingsManager::GetResolutionList(int monitorIndex)
|
||
|
{
|
||
|
m_currentResolutionList = m_resolutionsLists[monitorIndex];
|
||
|
|
||
|
grcDisplayWindow customWindow;
|
||
|
if (CSettingsManager::GetInstance().GetCommandLineResolution(customWindow))
|
||
|
{
|
||
|
AddToListIfNotPresent(customWindow, m_currentResolutionList);
|
||
|
}
|
||
|
if (CSettingsManager::GetInstance().GetMultiMonitorResolution(customWindow, monitorIndex))
|
||
|
{
|
||
|
AddToListIfNotPresent(customWindow, m_currentResolutionList);
|
||
|
}
|
||
|
|
||
|
if (GRCDEVICE.IsWindowDragResized())
|
||
|
{
|
||
|
grcDisplayWindow uniqueWindow;
|
||
|
uniqueWindow.uWidth = GRCDEVICE.GetWidth();
|
||
|
uniqueWindow.uHeight = GRCDEVICE.GetHeight();
|
||
|
uniqueWindow.uRefreshRate = 60;
|
||
|
|
||
|
AddToListIfNotPresent(uniqueWindow, m_currentResolutionList);
|
||
|
}
|
||
|
return m_currentResolutionList;
|
||
|
}
|
||
|
|
||
|
int CSettingsManager::GetResolutionIndex()
|
||
|
{
|
||
|
if (GRCDEVICE.IsWindowDragResized())
|
||
|
{
|
||
|
int monitorIndex = ConvertToMonitorIndex(m_settings.m_video.m_AdapterIndex, m_settings.m_video.m_OutputIndex);
|
||
|
atArray<grcDisplayWindow> &resolutionList = GetResolutionList(monitorIndex);
|
||
|
u32 width = GRCDEVICE.GetWidth();
|
||
|
u32 height = GRCDEVICE.GetHeight();
|
||
|
for (int index = 0; index < resolutionList.size(); index++)
|
||
|
{
|
||
|
if (resolutionList[index].uWidth == width && resolutionList[index].uHeight == height)
|
||
|
{
|
||
|
return index;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
return m_resolutionIndex;
|
||
|
}
|
||
|
|
||
|
int CSettingsManager::ConvertToMonitorIndex(int adapterOrdinal, int outputMonitor)
|
||
|
{
|
||
|
int monitorCount = 0;
|
||
|
for (int adapterIndex = 0; adapterIndex < adapterOrdinal; adapterIndex++)
|
||
|
{
|
||
|
const grcAdapterD3D11* adapter = (grcAdapterD3D11*)grcAdapterManager::GetInstance()->GetAdapter(adapterIndex);
|
||
|
monitorCount += adapter->GetOutputCount();
|
||
|
}
|
||
|
return monitorCount + outputMonitor;
|
||
|
}
|
||
|
|
||
|
void CSettingsManager::ConvertFromMonitorIndex(int monitorIndex, int &adapterOrdinal, int &outputMonitor)
|
||
|
{
|
||
|
int outputIndexTotal = 0;
|
||
|
adapterOrdinal = outputMonitor = 0;
|
||
|
for (int adapterIndex = 0; adapterIndex < grcAdapterManager::GetInstance()->GetAdapterCount(); adapterIndex++)
|
||
|
{
|
||
|
const grcAdapterD3D11* adapter = (grcAdapterD3D11*)grcAdapterManager::GetInstance()->GetAdapter(adapterIndex);
|
||
|
if ((adapter->GetOutputCount() + outputIndexTotal) > monitorIndex)
|
||
|
{
|
||
|
adapterOrdinal = adapterIndex;
|
||
|
outputMonitor = monitorIndex - outputIndexTotal;
|
||
|
break;
|
||
|
}
|
||
|
outputIndexTotal += adapter->GetOutputCount();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
int CSettingsManager::GetMonitorCount()
|
||
|
{
|
||
|
int monitorTotal = 0;
|
||
|
for (int adapterIndex = 0; adapterIndex < grcAdapterManager::GetInstance()->GetAdapterCount(); adapterIndex++)
|
||
|
{
|
||
|
const grcAdapterD3D11* adapter = (grcAdapterD3D11*)grcAdapterManager::GetInstance()->GetAdapter(adapterIndex);
|
||
|
monitorTotal += adapter->GetOutputCount();
|
||
|
}
|
||
|
|
||
|
return monitorTotal;
|
||
|
}
|
||
|
|
||
|
bool CSettingsManager::GetCommandLineResolution(grcDisplayWindow &customWindow)
|
||
|
{
|
||
|
customWindow = m_CommandLineWindow;
|
||
|
return m_WidthHeightOverride;
|
||
|
}
|
||
|
|
||
|
bool CSettingsManager::GetMultiMonitorResolution(grcDisplayWindow &customWindow, int monitorIndex)
|
||
|
{
|
||
|
int iOnlyUseCenterMonitor = 0;
|
||
|
#if CENTER_MULTIMONITOR_WINDOW
|
||
|
iOnlyUseCenterMonitor = 1;
|
||
|
#endif
|
||
|
PARAM_OnlyCenterMultiMonitor.Get(iOnlyUseCenterMonitor);
|
||
|
if (iOnlyUseCenterMonitor == 1 && monitorIndex != m_MultiMonitorIndex)
|
||
|
return false;
|
||
|
|
||
|
customWindow = m_MultiMonitorWindow;
|
||
|
return m_MultiMonitorAvailable;
|
||
|
}
|
||
|
|
||
|
bool CSettingsManager::IsSupportedMonitorResoluion(const CVideoSettings &videoSettings)
|
||
|
{
|
||
|
int monitorIndex = ConvertToMonitorIndex(videoSettings.m_AdapterIndex, videoSettings.m_OutputIndex);
|
||
|
atArray<grcDisplayWindow> &list = GetNativeResolutionList(monitorIndex);
|
||
|
|
||
|
grcDisplayWindow customWindow;
|
||
|
if (CSettingsManager::GetInstance().GetCommandLineResolution(customWindow))
|
||
|
{
|
||
|
AddToListIfNotPresent(customWindow, list);
|
||
|
}
|
||
|
if (CSettingsManager::GetInstance().GetMultiMonitorResolution(customWindow, monitorIndex))
|
||
|
{
|
||
|
AddToListIfNotPresent(customWindow, list);
|
||
|
}
|
||
|
|
||
|
for (int index = 0; index < list.size(); index++)
|
||
|
{
|
||
|
if (list[index].uWidth == (u32)videoSettings.m_ScreenWidth && list[index].uHeight == (u32)videoSettings.m_ScreenHeight)
|
||
|
{
|
||
|
return true;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
bool CSettingsManager::IsFullscreenAllowed(CVideoSettings &videoSettings)
|
||
|
{
|
||
|
const grcAdapterD3D11* pAdapter = (const grcAdapterD3D11*)grcAdapterManager::GetInstance()->GetAdapter(videoSettings.m_AdapterIndex);
|
||
|
const grcAdapterD3D11Output* pMonitorOutput = pAdapter->GetOutput(videoSettings.m_OutputIndex);
|
||
|
|
||
|
int iDisplayModes = pMonitorOutput->GetModeCount();
|
||
|
grcDisplayWindow oDisplayWindow;
|
||
|
for (int mode = 0; mode < iDisplayModes; mode++)
|
||
|
{
|
||
|
pMonitorOutput->GetMode(&oDisplayWindow, mode);
|
||
|
if (oDisplayWindow.uHeight < oDisplayWindow.uWidth)
|
||
|
return true;
|
||
|
}
|
||
|
return false;
|
||
|
}
|
||
|
#endif //RSG_PC
|
||
|
|
||
|
CSettingsManager::CSettingsManager()
|
||
|
{
|
||
|
m_NewSettingsRequested = false;
|
||
|
m_AdapterOutputChanged = false;
|
||
|
#if RSG_PC
|
||
|
m_IsLowQualitySystem = false;
|
||
|
#if !__FINAL
|
||
|
m_initialised = false;
|
||
|
#endif
|
||
|
#endif
|
||
|
}
|
||
|
|
||
|
#if RSG_PC
|
||
|
eDXLevelSupported CSettingsManager::HighestDXVersionSupported()
|
||
|
{
|
||
|
u32 dxFeatureLevel = GRCDEVICE.GetDXFeatureLevelSupported();
|
||
|
switch (dxFeatureLevel)
|
||
|
{
|
||
|
case 1100:
|
||
|
return DXS_11;
|
||
|
break;
|
||
|
case 1010:
|
||
|
return DXS_10_1;
|
||
|
break;
|
||
|
case 1000:
|
||
|
return DXS_10;
|
||
|
break;
|
||
|
default:
|
||
|
Assertf(false, "Unknown DX Feature level encountered in Settings Manager");
|
||
|
return DXS_10;
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
float CSettingsManager::CalcFinalLodRootScale()
|
||
|
{
|
||
|
return SettingsDefaults::CalcFinalLodRootScale(m_settings);
|
||
|
}
|
||
|
|
||
|
void CSettingsManager::VerifyDXVerion()
|
||
|
{
|
||
|
static bool hasBeenDone = false;
|
||
|
if (!hasBeenDone)
|
||
|
{
|
||
|
u32 dxFeatureLevel = GRCDEVICE.GetDxFeatureLevel();
|
||
|
if (dxFeatureLevel)
|
||
|
{
|
||
|
switch (dxFeatureLevel)
|
||
|
{
|
||
|
case 1100:
|
||
|
m_settings.m_graphics.m_DX_Version = 2;
|
||
|
break;
|
||
|
case 1010:
|
||
|
m_settings.m_graphics.m_DX_Version = 1;
|
||
|
break;
|
||
|
case 1000:
|
||
|
m_settings.m_graphics.m_DX_Version = 0;
|
||
|
break;
|
||
|
default:
|
||
|
m_settings.m_graphics.m_DX_Version = 0;
|
||
|
Assertf(false, "Unknown DX Feature level encountered in Settings Manager");
|
||
|
break;
|
||
|
}
|
||
|
hasBeenDone = true;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
Settings CSettingsManager::GetUISettings()
|
||
|
{
|
||
|
Settings internalSettings = GetSettings();
|
||
|
|
||
|
if (!GRCDEVICE.IsWindowed())
|
||
|
{
|
||
|
internalSettings.m_video.m_Windowed = 0;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
LONG_PTR result = GetWindowLongPtr( g_hwndMain, GWL_STYLE );
|
||
|
if (result & WS_POPUP)
|
||
|
{
|
||
|
internalSettings.m_video.m_Windowed = 2;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
internalSettings.m_video.m_Windowed = 1;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// internalSettings.m_video.m_ScreenWidth = GRCDEVICE.GetWidth();
|
||
|
// internalSettings.m_video.m_ScreenHeight = GRCDEVICE.GetHeight();
|
||
|
|
||
|
return internalSettings;
|
||
|
}
|
||
|
#endif //RSG_PC
|
||
|
|
||
|
const Settings& CSettingsManager::GetSettings()
|
||
|
{
|
||
|
#if RSG_PC
|
||
|
VerifyDXVerion();
|
||
|
#endif
|
||
|
return m_settings;
|
||
|
}
|
||
|
|
||
|
#if __BANK
|
||
|
|
||
|
void CSettingsManager::CreateWidgets()
|
||
|
{
|
||
|
const char* bankName = "SettingsManager";
|
||
|
|
||
|
if (BANKMGR.FindBank(bankName))
|
||
|
return;
|
||
|
|
||
|
bkBank& bank = BANKMGR.CreateBank(bankName);
|
||
|
|
||
|
RagSliders& ragSliders = GetRagData();
|
||
|
static const char* settingNames[] =
|
||
|
{
|
||
|
"Low",
|
||
|
"Medium",
|
||
|
"High",
|
||
|
"Ultra",
|
||
|
"Custom"
|
||
|
};
|
||
|
#if RSG_PC
|
||
|
static const char* aspectRatioNames[] =
|
||
|
{
|
||
|
"Auto",
|
||
|
"4:3",
|
||
|
"5:4",
|
||
|
"16:9",
|
||
|
"16:10"
|
||
|
};
|
||
|
#endif
|
||
|
|
||
|
#if RSG_PC
|
||
|
ragSliders.settings = SettingsDefaults::GetInstance().GetDefault();
|
||
|
#else
|
||
|
ragSliders.settings = GetInstance().m_settings;
|
||
|
#endif
|
||
|
ragSliders.editMode = false;
|
||
|
|
||
|
// These are in a nested struct to avoid polluting the game namespace
|
||
|
// with what is essentially little-used debugging code
|
||
|
struct Handlers
|
||
|
{
|
||
|
static void updateSysValue() {}
|
||
|
static void updateAudValue() {}
|
||
|
};
|
||
|
#if RSG_PC
|
||
|
bank.PushGroup("Window Resizing", false);
|
||
|
bank.AddSlider("Maximum Aspect Ratio", &grcDevice::sm_maxAspectRatio, 0.0f, 5.0f, 0.1f);
|
||
|
bank.AddSlider("Minimum Aspect Ratio", &grcDevice::sm_minAspectRatio, 0.0f, 5.0f, 0.1f);
|
||
|
bank.PopGroup();
|
||
|
#endif
|
||
|
bank.PushGroup("User Graphics Settings", false);
|
||
|
|
||
|
CGraphicsSettings& gfx = ragSliders.settings.m_graphics;
|
||
|
|
||
|
bank.AddCombo("Tessellation", (int*)&gfx.m_Tessellation, 5, settingNames);
|
||
|
bank.AddSlider("LOD scale", &gfx.m_LodScale, 0.0f, 10.0f, 0.1f);
|
||
|
bank.AddSlider("Ped LOD bias", &gfx.m_PedLodBias, -0.99f, 3.0f, 0.1f);
|
||
|
bank.AddSlider("Vehicle LOD bias", &gfx.m_VehicleLodBias, -0.99f, 3.0f, 0.1f);
|
||
|
bank.AddCombo ("Shadow Quality", (int*)&gfx.m_ShadowQuality, 5, settingNames);
|
||
|
bank.AddCombo ("Reflection Quality", (int*)&gfx.m_ReflectionQuality, 5, settingNames);
|
||
|
bank.AddSlider("Reflection MSAA", &gfx.m_ReflectionMSAA, 0, 8, 1);
|
||
|
bank.AddSlider("City Density", &gfx.m_CityDensity, 0.1f, 1.0f, 0.1f);
|
||
|
bank.AddSlider("Ped Variety Mutliplier",&gfx.m_PedVarietyMultiplier , 0.0f, 1.0f, 0.1f);
|
||
|
bank.AddSlider("Vehicle Variety Mutliplier",&gfx.m_VehicleVarietyMultiplier, 0.0f, 1.0f, 0.1f);
|
||
|
bank.AddToggle("Allow HD when flying", &gfx.m_HdStreamingInFlight);
|
||
|
bank.AddSlider("LodScale Multiplier", &gfx.m_MaxLodScale,0.0f,1.0f,0.1f);
|
||
|
|
||
|
bank.AddSlider("MotionBlur Strength", &gfx.m_MotionBlurStrength, 0.0f, 1.0f, 0.1f);
|
||
|
bank.AddCombo ("SSAO", (int*)&gfx.m_SSAO, 5, settingNames);
|
||
|
bank.AddSlider("Anisotropic Filtering", &gfx.m_AnisotropicFiltering, 0, 16, 1);
|
||
|
bank.AddSlider("MSAA", &gfx.m_MSAA, 0, 32, 1);
|
||
|
bank.AddSlider("MSAA Fragments", &gfx.m_MSAAFragments, 0, 32, 1);
|
||
|
bank.AddSlider("MSAA Quality", &gfx.m_MSAAQuality, 0, 32, 1);
|
||
|
bank.AddSlider("Sampling Mode", &gfx.m_SamplingMode, 0, 9, 1);
|
||
|
|
||
|
bank.AddToggle ("FXAA", &gfx.m_FXAA_Enabled);
|
||
|
bank.AddToggle ("TXAA", &gfx.m_TXAA_Enabled);
|
||
|
bank.AddCombo ("Texture Quality", (int*)&gfx.m_TextureQuality, 5, settingNames);
|
||
|
bank.AddCombo ("Particle Quality", (int*)&gfx.m_ParticleQuality, 5, settingNames);
|
||
|
bank.AddCombo ("Water Quality", (int*)&gfx.m_WaterQuality, 5, settingNames);
|
||
|
bank.AddCombo ("Grass Quality", (int*)&gfx.m_GrassQuality, 5, settingNames);
|
||
|
|
||
|
bank.AddCombo ("Shader Quality", (int*)&gfx.m_ShaderQuality, 5, settingNames);
|
||
|
bank.AddCombo("Soft Shadows", (int*)&gfx.m_Shadow_SoftShadows, 5, settingNames);
|
||
|
|
||
|
bank.PopGroup();
|
||
|
bank.PushGroup("User System Settings", false);
|
||
|
|
||
|
#if GTA_REPLAY
|
||
|
CSystemSettings& sys = ragSliders.settings.m_system;
|
||
|
|
||
|
if(sys.m_numBytesPerReplayBlock < MIN_BYTES_PER_REPLAY_BLOCK || sys.m_numBytesPerReplayBlock > MAX_BYTES_PER_REPLAY_BLOCK)
|
||
|
sys.m_numBytesPerReplayBlock = MIN_BYTES_PER_REPLAY_BLOCK;
|
||
|
if(sys.m_numReplayBlocks < MIN_NUM_REPLAY_BLOCKS || sys.m_numReplayBlocks > MAX_NUM_REPLAY_BLOCKS)
|
||
|
sys.m_numReplayBlocks = MIN_NUM_REPLAY_BLOCKS;
|
||
|
|
||
|
//bank.AddSlider("Bytes Per Replay Block", &sys.m_numBytesPerReplayBlock, MIN_BYTES_PER_REPLAY_BLOCK, MAX_BYTES_PER_REPLAY_BLOCK, 1000000, Handlers::updateSysValue);
|
||
|
bank.AddSlider("Number of Replay Blocks", &sys.m_numReplayBlocks, MIN_NUM_REPLAY_BLOCKS, MAX_NUM_REPLAY_BLOCKS, 1, Handlers::updateSysValue);
|
||
|
|
||
|
//bank.AddSlider("Max Size of Replay Stream", &sys.m_maxSizeOfStreamingReplay, MIN_REPLAY_STREAMING_SIZE, MAX_REPLAY_STREAMING_SIZE, 500, Handlers::updateSysValue);
|
||
|
#endif // GTA_REPLAY
|
||
|
|
||
|
bank.PopGroup();
|
||
|
bank.PushGroup("User Audio Settings", false);
|
||
|
|
||
|
CAudioSettings& aud = ragSliders.settings.m_audio;
|
||
|
|
||
|
bank.AddToggle("3D audio", &aud.m_Audio3d, Handlers::updateAudValue);
|
||
|
|
||
|
bank.PopGroup();
|
||
|
#if RSG_PC
|
||
|
bank.PushGroup("User Video Settings", false);
|
||
|
|
||
|
CVideoSettings& video = ragSliders.settings.m_video;
|
||
|
|
||
|
bank.AddSlider("Adapter number", &video.m_AdapterIndex, 0, 8, 1);
|
||
|
bank.AddSlider("Output number", &video.m_OutputIndex, 0, 32, 1);
|
||
|
bank.AddSlider("Screen width", &video.m_ScreenWidth, 0, 16384, 8);
|
||
|
bank.AddSlider("Screen height", &video.m_ScreenHeight, 0, 16384, 8);
|
||
|
bank.AddSlider("Refresh rate", &video.m_RefreshRate, 0, 250, 1);
|
||
|
bank.AddSlider("Windowed", &video.m_Windowed, 0, 2, 1);
|
||
|
bank.AddSlider("VSync", &video.m_VSync, 0, 2, 1);
|
||
|
bank.AddCombo ("AspectRatio", (int*)&video.m_AspectRatio, 5, aspectRatioNames);
|
||
|
|
||
|
bank.PopGroup();
|
||
|
#endif
|
||
|
bank.PushGroup("Advanced (XML-only) Settings", false, "These settings will be driven by the above sliders.");
|
||
|
|
||
|
bank.AddSeparator();
|
||
|
bank.AddTitle("Shadow Quality");
|
||
|
bank.AddToggle("Particle Shadows", &gfx.m_Shadow_ParticleShadows);
|
||
|
bank.AddSlider("Shadow Distance", &gfx.m_Shadow_Distance, 1, 10, 0.5f);
|
||
|
bank.AddToggle("Long Shadows", &gfx.m_Shadow_LongShadows);
|
||
|
bank.AddSlider("Shadow Split Z Start", &gfx.m_Shadow_SplitZStart, 0, 5, 0.05f);
|
||
|
bank.AddSlider("Shadow Split Z End", &gfx.m_Shadow_SplitZEnd, 0, 5, 0.05f);
|
||
|
bank.AddSlider("Aircraft Exp Weight", &gfx.m_Shadow_aircraftExpWeight, 0, 5, 0.05f);
|
||
|
bank.AddToggle("Disable Small Object check", &gfx.m_Shadow_DisableScreenSizeCheck);
|
||
|
bank.AddSeparator();
|
||
|
bank.AddTitle("Reflection Quality");
|
||
|
bank.AddToggle("Standard Mip Blur", &gfx.m_Reflection_MipBlur);
|
||
|
bank.AddSeparator();
|
||
|
bank.AddTitle("FXAA Quality");
|
||
|
bank.AddToggle("FXAA Enabled", &gfx.m_FXAA_Enabled);
|
||
|
bank.AddSeparator();
|
||
|
bank.AddTitle("TXAA Quality");
|
||
|
bank.AddToggle("TXAA Enabled", &gfx.m_TXAA_Enabled);
|
||
|
bank.AddSeparator();
|
||
|
bank.AddTitle("Texture Quality");
|
||
|
bank.AddSeparator();
|
||
|
bank.AddTitle("Particle Quality");
|
||
|
bank.AddSeparator();
|
||
|
bank.AddTitle("Water Quality");
|
||
|
bank.AddSeparator();
|
||
|
bank.AddTitle("Lighting Quality");
|
||
|
bank.AddToggle("Lighting_FogVolumes", &gfx.m_Lighting_FogVolumes);
|
||
|
bank.AddSeparator();
|
||
|
bank.AddTitle("Shader Quality");
|
||
|
bank.AddToggle("Sub Sample Alpha", &gfx.m_Shader_SSA);
|
||
|
|
||
|
bank.PopGroup();
|
||
|
|
||
|
bank.AddToggle("Edit Mode", &ragSliders.editMode);
|
||
|
bank.AddButton("Apply", ApplyRagSettings);
|
||
|
bank.AddButton("Save and Apply Settings", SaveAndApplyRagSettings);
|
||
|
bank.AddButton("Reset", UpdateRagData);
|
||
|
bank.AddButton("Reload From Disk", ForceReload);
|
||
|
}
|
||
|
|
||
|
void CSettingsManager::ApplyRagSettings(bool save)
|
||
|
{
|
||
|
RagSliders& sliders = GetRagData();
|
||
|
|
||
|
GetInstance().RequestNewSettings(sliders.settings);
|
||
|
if (save) GetInstance().Save(sliders.settings);
|
||
|
}
|
||
|
|
||
|
void CSettingsManager::ApplyRagSettings()
|
||
|
{
|
||
|
ApplyRagSettings(false);
|
||
|
}
|
||
|
|
||
|
void CSettingsManager::SaveAndApplyRagSettings()
|
||
|
{
|
||
|
ApplyRagSettings(true);
|
||
|
}
|
||
|
|
||
|
CSettingsManager::RagSliders& CSettingsManager::GetRagData()
|
||
|
{
|
||
|
static RagSliders sliders;
|
||
|
return sliders;
|
||
|
}
|
||
|
|
||
|
void CSettingsManager::UpdateRagData()
|
||
|
{
|
||
|
RagSliders& data = GetRagData();
|
||
|
data.settings = GetInstance().m_settings;
|
||
|
|
||
|
for (int i = 0; i < data.combos.GetCount(); i++)
|
||
|
data.combos[i]->SetValue(data.combos[i]->GetValue());
|
||
|
}
|
||
|
|
||
|
void CSettingsManager::ForceReload()
|
||
|
{
|
||
|
GetInstance().Load();
|
||
|
}
|
||
|
#endif // __BANK
|
||
|
|
||
|
#if RSG_PC
|
||
|
void CSettingsManager::GraphicsConfigSource(char* &info) const {
|
||
|
char infostr[50];
|
||
|
|
||
|
strcpy(infostr, "Graphics Config: ");
|
||
|
|
||
|
switch(m_settings.m_configSource)
|
||
|
{
|
||
|
case SMC_AUTO:
|
||
|
{
|
||
|
#if RSG_PC
|
||
|
strcat(infostr, "AUTO");
|
||
|
if (!(m_settings.m_graphics == SettingsDefaults::GetInstance().GetDefaultGraphics()))
|
||
|
{
|
||
|
strcat(infostr, " [MODIFIED]");
|
||
|
}
|
||
|
#endif
|
||
|
break;
|
||
|
}
|
||
|
default:
|
||
|
{
|
||
|
strcat(infostr, "UNKNOWN");
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
size_t len = strlen(infostr);
|
||
|
info = rage_new char[len + 1];
|
||
|
strcpy(info, infostr);
|
||
|
}
|
||
|
#endif // RSG_PC
|
||
|
|
||
|
bool CSettingsManager::DoNewSettingsRequireRestart(const Settings& settings)
|
||
|
{
|
||
|
#if RSG_PC
|
||
|
if (settings.m_video.m_AdapterIndex != m_OriginalAdapter && !settings.m_video.m_Windowed) return true;
|
||
|
#endif
|
||
|
return settings.NeedsGameRestartComparedTo(m_settings);
|
||
|
}
|
||
|
|
||
|
bool CSettingsManager::DoNewSettingsRequiresDeviceReset(const Settings& settings)
|
||
|
{
|
||
|
return settings.NeedsDeviceResetComparedTo(m_settings);
|
||
|
}
|
||
|
|
||
|
void CSettingsManager::RequestNewSettings(const Settings settings)
|
||
|
{
|
||
|
#if RSG_PC
|
||
|
m_settingsOnReset = settings;
|
||
|
m_NewSettingsRequested = true;
|
||
|
|
||
|
m_PreviousSettings = m_settings;
|
||
|
if (GRCDEVICE.IsWindowDragResized())
|
||
|
{
|
||
|
m_PreviousSettings.m_video.m_ScreenWidth = GRCDEVICE.GetWidth();
|
||
|
m_PreviousSettings.m_video.m_ScreenHeight = GRCDEVICE.GetHeight();
|
||
|
}
|
||
|
|
||
|
GRCDEVICE.SetWindowDragResized(!IsSupportedMonitorResoluion(settings.m_video));
|
||
|
|
||
|
bool ignoreWindowLimits = false;
|
||
|
if (GRCDEVICE.IsWindowDragResized()) ignoreWindowLimits = true;
|
||
|
if (m_WidthHeightOverride && settings.m_video.m_ScreenWidth == (int)m_CommandLineWindow.uWidth && settings.m_video.m_ScreenHeight == (int)m_CommandLineWindow.uHeight) ignoreWindowLimits = true;
|
||
|
if (m_MultiMonitorAvailable && settings.m_video.m_ScreenWidth == (int)m_MultiMonitorWindow.uWidth && settings.m_video.m_ScreenHeight == (int)m_MultiMonitorWindow.uHeight) ignoreWindowLimits = true;
|
||
|
GRCDEVICE.SetIngoreWindowLimits(ignoreWindowLimits);
|
||
|
#else
|
||
|
m_settings = settings;
|
||
|
ApplySettings();
|
||
|
#endif
|
||
|
}
|
||
|
|
||
|
#if RSG_PC
|
||
|
void CSettingsManager::SafeUpdate()
|
||
|
{
|
||
|
if (m_NewSettingsRequested)
|
||
|
{
|
||
|
bool bCenterWindow = ((m_settingsOnReset.m_video.m_Windowed != m_settings.m_video.m_Windowed) ||
|
||
|
(m_settingsOnReset.m_video.m_AdapterIndex != m_settings.m_video.m_AdapterIndex) ||
|
||
|
(m_settingsOnReset.m_video.m_OutputIndex != m_settings.m_video.m_OutputIndex) ||
|
||
|
(m_settingsOnReset.m_video.m_ScreenHeight != m_settings.m_video.m_ScreenHeight) ||
|
||
|
(m_settingsOnReset.m_video.m_ScreenWidth != m_settings.m_video.m_ScreenWidth));
|
||
|
|
||
|
ApplyVideoSettings(m_settingsOnReset.m_video, bCenterWindow || m_AdapterOutputChanged, DoNewSettingsRequiresDeviceReset(m_settingsOnReset) || m_AdapterOutputChanged);
|
||
|
m_NewSettingsRequested = false;
|
||
|
m_AdapterOutputChanged = false;
|
||
|
}
|
||
|
}
|
||
|
#endif
|
||
|
|
||
|
void CSettingsManager::ApplyLoadedSettings()
|
||
|
{
|
||
|
ApplySettings();
|
||
|
#if RSG_PC
|
||
|
m_settingsOnReset = m_settings;
|
||
|
ApplyVideoSettings(m_settings.m_video, false, false, true);
|
||
|
#endif
|
||
|
}
|
||
|
|
||
|
bool CGraphicsSettings::AreVideoMemorySettingsSame(CGraphicsSettings& settings) const
|
||
|
{
|
||
|
return m_LodScale == settings.m_LodScale &&
|
||
|
m_PedLodBias == settings.m_PedLodBias &&
|
||
|
m_VehicleLodBias == settings.m_VehicleLodBias &&
|
||
|
m_ShadowQuality == settings.m_ShadowQuality &&
|
||
|
m_ReflectionQuality == settings.m_ReflectionQuality &&
|
||
|
m_ReflectionMSAA == settings.m_ReflectionMSAA &&
|
||
|
m_SSAO == settings.m_SSAO &&
|
||
|
m_MSAA == settings.m_MSAA &&
|
||
|
m_MSAAFragments == settings.m_MSAAFragments &&
|
||
|
m_MSAAQuality == settings.m_MSAAQuality &&
|
||
|
m_SamplingMode == settings.m_SamplingMode &&
|
||
|
m_TextureQuality == settings.m_TextureQuality &&
|
||
|
m_ParticleQuality == settings.m_ParticleQuality &&
|
||
|
m_WaterQuality == settings.m_WaterQuality &&
|
||
|
m_GrassQuality == settings.m_GrassQuality &&
|
||
|
m_ShaderQuality == settings.m_ShaderQuality &&
|
||
|
m_Shadow_SoftShadows == settings.m_Shadow_SoftShadows &&
|
||
|
m_UltraShadows_Enabled == settings.m_UltraShadows_Enabled &&
|
||
|
m_Shadow_ParticleShadows == settings.m_Shadow_ParticleShadows &&
|
||
|
m_Shadow_Distance == settings.m_Shadow_Distance &&
|
||
|
m_Shadow_LongShadows == settings.m_Shadow_LongShadows &&
|
||
|
m_Shadow_SplitZStart == settings.m_Shadow_SplitZStart &&
|
||
|
m_Shadow_SplitZEnd == settings.m_Shadow_SplitZEnd &&
|
||
|
m_Shadow_aircraftExpWeight == settings.m_Shadow_aircraftExpWeight &&
|
||
|
m_Shadow_DisableScreenSizeCheck == settings.m_Shadow_DisableScreenSizeCheck &&
|
||
|
m_Reflection_MipBlur == settings.m_Reflection_MipBlur &&
|
||
|
m_TXAA_Enabled == settings.m_TXAA_Enabled &&
|
||
|
m_Lighting_FogVolumes == settings.m_Lighting_FogVolumes &&
|
||
|
m_Shader_SSA == settings.m_Shader_SSA &&
|
||
|
m_PedVarietyMultiplier == settings.m_PedVarietyMultiplier &&
|
||
|
m_VehicleVarietyMultiplier == settings.m_VehicleVarietyMultiplier &&
|
||
|
m_DX_Version == settings.m_DX_Version &&
|
||
|
m_PostFX == settings.m_PostFX &&
|
||
|
m_DoF == settings.m_DoF &&
|
||
|
m_HdStreamingInFlight == settings.m_HdStreamingInFlight &&
|
||
|
m_MaxLodScale == settings.m_MaxLodScale;
|
||
|
}
|
||
|
|
||
|
bool CGraphicsSettings::NeedsDeviceResetComparedTo(CGraphicsSettings& settings) const
|
||
|
{
|
||
|
return (settings.m_ShadowQuality != m_ShadowQuality) ||
|
||
|
(settings.m_ReflectionQuality != m_ReflectionQuality) ||
|
||
|
(settings.m_ReflectionMSAA != m_ReflectionMSAA) ||
|
||
|
(settings.m_WaterQuality != m_WaterQuality) ||
|
||
|
(settings.m_Shadow_SoftShadows != m_Shadow_SoftShadows) ||
|
||
|
(settings.m_MSAA != m_MSAA) ||
|
||
|
(settings.m_TXAA_Enabled != m_TXAA_Enabled) ||
|
||
|
(settings.m_MSAAFragments != m_MSAAFragments) ||
|
||
|
(settings.m_ReflectionMSAA != m_ReflectionMSAA) ||
|
||
|
(settings.m_SamplingMode != m_SamplingMode) ||
|
||
|
(settings.m_UltraShadows_Enabled != m_UltraShadows_Enabled) ||
|
||
|
(settings.m_PostFX != m_PostFX) ||
|
||
|
(settings.m_SSAO != m_SSAO);
|
||
|
}
|
||
|
|
||
|
bool CGraphicsSettings::NeedsGameRestartComparedTo(CGraphicsSettings& settings) const
|
||
|
{
|
||
|
return (settings.m_DX_Version != m_DX_Version) ||
|
||
|
(settings.m_ShaderQuality != m_ShaderQuality) ||
|
||
|
(settings.m_TextureQuality != m_TextureQuality) ||
|
||
|
(settings.m_ParticleQuality != m_ParticleQuality) ||
|
||
|
(settings.m_GrassQuality != m_GrassQuality);
|
||
|
}
|
||
|
|
||
|
bool CVideoSettings::AreVideoMemorySettingsSame(CVideoSettings& settings) const
|
||
|
{
|
||
|
return m_ScreenWidth == settings.m_ScreenWidth &&
|
||
|
m_ScreenHeight == settings.m_ScreenHeight &&
|
||
|
m_Stereo == settings.m_Stereo;
|
||
|
}
|
||
|
|
||
|
bool CVideoSettings::NeedsDeviceResetComparedTo(CVideoSettings& settings) const
|
||
|
{
|
||
|
return (settings.m_RefreshRate != m_RefreshRate) ||
|
||
|
(settings.m_AspectRatio != m_AspectRatio) ||
|
||
|
(settings.m_Windowed != m_Windowed) ||
|
||
|
(settings.m_OutputIndex != m_OutputIndex) ||
|
||
|
(settings.m_AdapterIndex != m_AdapterIndex) ||
|
||
|
(settings.m_VSync != m_VSync) ||
|
||
|
(settings.m_ScreenHeight != m_ScreenHeight) ||
|
||
|
(settings.m_ScreenWidth != m_ScreenWidth);
|
||
|
}
|
||
|
|
||
|
bool CVideoSettings::NeedsGameRestartComparedTo(CVideoSettings& settings) const
|
||
|
{
|
||
|
return settings.m_Stereo != m_Stereo || (settings.m_Stereo && m_Windowed);
|
||
|
}
|
||
|
|
||
|
void CVideoSettings::PrintOutSettings() const
|
||
|
{
|
||
|
#if !__NO_OUTPUT
|
||
|
for (int i = 0; parser_CVideoSettings__MemberNames[i] != NULL; i++)
|
||
|
{
|
||
|
rage::parMemberSimpleData* data = (rage::parMemberSimpleData*)parser_CVideoSettings__Members[i];
|
||
|
const char* name = parser_CVideoSettings__MemberNames[i];
|
||
|
void* value = (void*)(((size_t)this) + ((size_t)parser_MemberOffsets[i]));
|
||
|
if (data->m_Type == rage::parMemberType::TYPE_BOOL)
|
||
|
Displayf("[settings] %s: %s", name, (*((bool*)value)) ? "true" : "false");
|
||
|
else if (data->m_Type == rage::parMemberType::TYPE_INT)
|
||
|
Displayf("[settings] %s: %d", name, *((int*)value));
|
||
|
else if (data->m_Type == rage::parMemberType::TYPE_UINT)
|
||
|
Displayf("[settings] %s: %u", name, *((int*)value));
|
||
|
else if (data->m_Type == rage::parMemberType::TYPE_FLOAT)
|
||
|
Displayf("[settings] %s: %f", name, *((float*)value));
|
||
|
else if (data->m_Type == rage::parMemberType::TYPE_ENUM)
|
||
|
{
|
||
|
if (data->m_Subtype == parMemberEnumSubType::SUBTYPE_32BIT)
|
||
|
Displayf("[settings] %s: %u", name, *((int*)value));
|
||
|
else if (data->m_Subtype == parMemberEnumSubType::SUBTYPE_16BIT)
|
||
|
Displayf("[settings] %s: %u", name, (int)*((short*)value));
|
||
|
else if (data->m_Subtype == parMemberEnumSubType::SUBTYPE_8BIT)
|
||
|
Displayf("[settings] %s: %u", name, (int)*((char*)value));
|
||
|
}
|
||
|
}
|
||
|
#endif // !__NO_OUTPUT
|
||
|
}
|
||
|
|
||
|
void CGraphicsSettings::PrintOutSettings() const
|
||
|
{
|
||
|
#if !__NO_OUTPUT
|
||
|
for (int i = 0; parser_CGraphicsSettings__MemberNames[i] != NULL; i++)
|
||
|
{
|
||
|
rage::parMemberSimpleData* data = (rage::parMemberSimpleData*)parser_CGraphicsSettings__Members[i];
|
||
|
const char* name = parser_CGraphicsSettings__MemberNames[i];
|
||
|
void* value = (void*)(((size_t)this) + ((size_t)parser_MemberOffsets[i]));
|
||
|
if (data->m_Type == rage::parMemberType::TYPE_BOOL)
|
||
|
Displayf("[settings] %s: %s", name, (*((bool*)value)) ? "true" : "false");
|
||
|
else if (data->m_Type == rage::parMemberType::TYPE_INT)
|
||
|
Displayf("[settings] %s: %d", name, *((int*)value));
|
||
|
else if (data->m_Type == rage::parMemberType::TYPE_UINT)
|
||
|
Displayf("[settings] %s: %u", name, *((int*)value));
|
||
|
else if (data->m_Type == rage::parMemberType::TYPE_FLOAT)
|
||
|
Displayf("[settings] %s: %f", name, *((float*)value));
|
||
|
else if (data->m_Type == rage::parMemberType::TYPE_ENUM)
|
||
|
{
|
||
|
if (data->m_Subtype == parMemberEnumSubType::SUBTYPE_32BIT)
|
||
|
Displayf("[settings] %s: %u", name, *((int*)value));
|
||
|
else if (data->m_Subtype == parMemberEnumSubType::SUBTYPE_16BIT)
|
||
|
Displayf("[settings] %s: %u", name, (int)*((short*)value));
|
||
|
else if (data->m_Subtype == parMemberEnumSubType::SUBTYPE_8BIT)
|
||
|
Displayf("[settings] %s: %u", name, (int)*((char*)value));
|
||
|
}
|
||
|
}
|
||
|
#endif // !__NO_OUTPUT
|
||
|
}
|
||
|
|
||
|
void CGraphicsSettings::OutputSettings(fiStream * outHandle) const
|
||
|
{
|
||
|
for (int i = 0; parser_CGraphicsSettings__MemberNames[i] != NULL; i++)
|
||
|
{
|
||
|
rage::parMemberSimpleData* data = (rage::parMemberSimpleData*)parser_CGraphicsSettings__Members[i];
|
||
|
const char* name = parser_CGraphicsSettings__MemberNames[i];
|
||
|
void* value = (void*)(((size_t)this) + ((size_t)parser_MemberOffsets[i]));
|
||
|
if (data->m_Type == rage::parMemberType::TYPE_BOOL)
|
||
|
fprintf(outHandle,"%s: %s\n", name, (*((bool*)value)) ? "true" : "false");
|
||
|
else if (data->m_Type == rage::parMemberType::TYPE_INT)
|
||
|
fprintf(outHandle,"%s: %d\n", name, *((int*)value));
|
||
|
else if (data->m_Type == rage::parMemberType::TYPE_UINT)
|
||
|
fprintf(outHandle,"%s: %u\n", name, *((int*)value));
|
||
|
else if (data->m_Type == rage::parMemberType::TYPE_FLOAT)
|
||
|
fprintf(outHandle,"%s: %f\n", name, *((float*)value));
|
||
|
else if (data->m_Type == rage::parMemberType::TYPE_ENUM)
|
||
|
{
|
||
|
if (data->m_Subtype == parMemberEnumSubType::SUBTYPE_32BIT)
|
||
|
fprintf(outHandle,"%s: %u\n", name, *((int*)value));
|
||
|
else if (data->m_Subtype == parMemberEnumSubType::SUBTYPE_16BIT)
|
||
|
fprintf(outHandle,"%s: %u\n", name, (int)*((short*)value));
|
||
|
else if (data->m_Subtype == parMemberEnumSubType::SUBTYPE_8BIT)
|
||
|
fprintf(outHandle,"%s: %u\n", name, (int)*((char*)value));
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void CSettingsManager::PrintOutSettings(const Settings& settings)
|
||
|
{
|
||
|
Displayf("[settings] Using Settings:");
|
||
|
settings.m_graphics.PrintOutSettings();
|
||
|
settings.m_video.PrintOutSettings();
|
||
|
}
|
||
|
|
||
|
#if __DEV && RSG_PC
|
||
|
bool CSettingsManager::sm_ResetTestsActive = true;
|
||
|
|
||
|
void CSettingsManager::ProcessTests()
|
||
|
{
|
||
|
if (!sm_ResetTestsActive)
|
||
|
return;
|
||
|
|
||
|
if (!PARAM_testDeviceReset.Get())
|
||
|
return;
|
||
|
|
||
|
static s32 timeTillNextReset = 15000;
|
||
|
|
||
|
static bool performingDeviceReset = false;
|
||
|
|
||
|
static fiStream* calculatedSizeStream = NULL;
|
||
|
static fiStream* actualSizeStream = NULL;
|
||
|
static fiStream* deviceResetLogStream = NULL;
|
||
|
|
||
|
static int testNumber = 0;
|
||
|
|
||
|
//Initialize file streams (should only run the first time)
|
||
|
if (!deviceResetLogStream)
|
||
|
{
|
||
|
char defaultPathname[] = "x:/";
|
||
|
const char* logPathname = defaultPathname;
|
||
|
PARAM_deviceResetLogPath.Get(logPathname);
|
||
|
ASSET.PushFolder(logPathname);
|
||
|
|
||
|
char resetFilename[] = "DeviceResetLog";
|
||
|
deviceResetLogStream = ASSET.Create(resetFilename, "txt");
|
||
|
ASSET.PopFolder();
|
||
|
}
|
||
|
|
||
|
//If currently doing device reset test check if it has completed, and if so close up log files.
|
||
|
if (performingDeviceReset && !GRCDEVICE.GetDeviceResetTestActive())
|
||
|
{
|
||
|
GRCDEVICE.StopLoggingResets();
|
||
|
char endOfResetMessage[40] = "";
|
||
|
formatf(endOfResetMessage, 40, "\r\nEnd of test %d\r\n\r\n", testNumber);
|
||
|
deviceResetLogStream->Write(endOfResetMessage, (int)strlen(endOfResetMessage));
|
||
|
deviceResetLogStream->Flush();
|
||
|
|
||
|
if (PARAM_dumpRenderTargetSizes.Get())
|
||
|
{
|
||
|
grcTextureFactoryDX11::StopLogging();
|
||
|
actualSizeStream->Flush();
|
||
|
actualSizeStream->Close();
|
||
|
actualSizeStream = NULL;
|
||
|
|
||
|
|
||
|
char defaultPathname[] = "x:/";
|
||
|
const char* logPathname = defaultPathname;
|
||
|
PARAM_deviceResetLogPath.Get(logPathname);
|
||
|
ASSET.PushFolder(logPathname);
|
||
|
|
||
|
char calculatedFilename[200] = "";
|
||
|
formatf(calculatedFilename, 200, "CalculatedRenderTargetSizes%d", testNumber);
|
||
|
// ASSET.CreateLeadingPath(calculatedFilename);
|
||
|
calculatedSizeStream = ASSET.Create(calculatedFilename, "txt");
|
||
|
ASSET.PopFolder();
|
||
|
|
||
|
SettingsDefaults &defaults = SettingsDefaults::GetInstance();
|
||
|
SettingsDefaults::StartLogging(calculatedSizeStream);
|
||
|
defaults.renderTargetMemSizeFor(CSettingsManager::GetInstance().GetSettings());
|
||
|
SettingsDefaults::StopLogging();
|
||
|
calculatedSizeStream->Flush();
|
||
|
calculatedSizeStream->Close();
|
||
|
calculatedSizeStream = NULL;
|
||
|
}
|
||
|
|
||
|
timeTillNextReset = 10000;
|
||
|
performingDeviceReset = false;
|
||
|
}
|
||
|
|
||
|
//Exit out if not enough time has elapsed till next reset
|
||
|
if (timeTillNextReset > 0)
|
||
|
{
|
||
|
timeTillNextReset -= fwTimer::GetTimeStepInMilliseconds();
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
//if busy performing a test then exit
|
||
|
if (performingDeviceReset) return;
|
||
|
|
||
|
//Set all variables as test active, activate the log files for the test
|
||
|
performingDeviceReset = true;
|
||
|
GRCDEVICE.SetDeviceResetTestActive(true);
|
||
|
|
||
|
Settings newSettings;
|
||
|
switch (++testNumber)
|
||
|
{
|
||
|
case 1:
|
||
|
newSettings = CSettingsManager::GetInstance().GetUISettings();
|
||
|
newSettings.m_video.m_ScreenHeight = 800;
|
||
|
newSettings.m_video.m_ScreenWidth = 1280;
|
||
|
newSettings.m_video.m_Windowed = 1;
|
||
|
break;
|
||
|
case 2:
|
||
|
newSettings = CSettingsManager::GetInstance().GetUISettings();
|
||
|
newSettings.m_video.m_ScreenHeight = 720;
|
||
|
newSettings.m_video.m_ScreenWidth = 1280;
|
||
|
newSettings.m_video.m_Windowed = 2;
|
||
|
break;
|
||
|
case 3:
|
||
|
newSettings = CSettingsManager::GetInstance().GetUISettings();
|
||
|
newSettings.m_video.m_ScreenHeight = 1200;
|
||
|
newSettings.m_video.m_ScreenWidth = 1920;
|
||
|
newSettings.m_video.m_Windowed = 0;
|
||
|
break;
|
||
|
case 4:
|
||
|
newSettings = CSettingsManager::GetInstance().GetUISettings();
|
||
|
newSettings.m_video.m_ScreenHeight = 720;
|
||
|
newSettings.m_video.m_ScreenWidth = 1280;
|
||
|
newSettings.m_video.m_Windowed = 0;
|
||
|
break;
|
||
|
case 5:
|
||
|
newSettings = CSettingsManager::GetInstance().GetUISettings();
|
||
|
newSettings.m_video.m_ScreenHeight = 900;
|
||
|
newSettings.m_video.m_ScreenWidth = 1200;
|
||
|
newSettings.m_video.m_Windowed = 1;
|
||
|
break;
|
||
|
case 6:
|
||
|
char endOfTestMessage[] = "\r\n\r\nTest successfully completed";
|
||
|
deviceResetLogStream->Write(endOfTestMessage, (int)strlen(endOfTestMessage));
|
||
|
//TestDone, close the log files
|
||
|
if (calculatedSizeStream) {calculatedSizeStream->Close(); calculatedSizeStream = NULL;}
|
||
|
if (actualSizeStream) {actualSizeStream->Close(); actualSizeStream = NULL;}
|
||
|
if (deviceResetLogStream) {deviceResetLogStream->Close(); deviceResetLogStream = NULL;}
|
||
|
performingDeviceReset = false;
|
||
|
sm_ResetTestsActive = false;
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
//Call the apply settings with whatever the new tests values are
|
||
|
if (sm_ResetTestsActive)
|
||
|
{
|
||
|
GRCDEVICE.StartLoggingResets(deviceResetLogStream);
|
||
|
if (PARAM_dumpRenderTargetSizes.Get())
|
||
|
{
|
||
|
char defaultPathname[] = "x:/";
|
||
|
const char* logPathname = defaultPathname;
|
||
|
PARAM_deviceResetLogPath.Get(logPathname);
|
||
|
ASSET.PushFolder(logPathname);
|
||
|
|
||
|
char actualFilename[40] = "";
|
||
|
formatf(actualFilename, 40, "ActualRenderTargetSizes%d", testNumber);
|
||
|
ASSET.CreateLeadingPath(actualFilename);
|
||
|
actualSizeStream = ASSET.Create(actualFilename, "txt");
|
||
|
ASSET.PopFolder();
|
||
|
|
||
|
grcTextureFactoryDX11::StartLogging(actualSizeStream);
|
||
|
}
|
||
|
|
||
|
CSettingsManager::GetInstance().RequestNewSettings(newSettings);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
bool CSettingsManager::ResetTestsCompleted() {
|
||
|
if (PARAM_testDeviceReset.Get())
|
||
|
{
|
||
|
return !sm_ResetTestsActive;
|
||
|
}
|
||
|
return false;
|
||
|
}
|
||
|
#endif
|
||
|
|
||
|
#endif // RSG_PC || RSG_DURANGO || RSG_ORBIS
|