Add VSync switch to Device tab
parent
abb7d54ef5
commit
359abf9a82
|
@ -817,9 +817,15 @@ bool CApplication::CreateVideoSurface()
|
|||
int vsync = 0;
|
||||
if (GetConfigFile().GetIntProperty("Experimental", "VSync", vsync))
|
||||
{
|
||||
SDL_GL_SetSwapInterval(vsync);
|
||||
if (SDL_GL_SetSwapInterval(vsync) == -1)
|
||||
{
|
||||
GetLogger()->Warn("Adaptive sync not supported.\n");
|
||||
vsync = 1;
|
||||
SDL_GL_SetSwapInterval(vsync);
|
||||
GetConfigFile().SetIntProperty("Experimental", "VSync", vsync);
|
||||
}
|
||||
|
||||
GetLogger()->Info("Using Vsync: %s\n", (vsync ? "true" : "false"));
|
||||
GetLogger()->Info("Using Vsync: %s\n", (vsync == -1 ? "adaptive" : (vsync ? "true" : "false")));
|
||||
}
|
||||
|
||||
return true;
|
||||
|
@ -832,6 +838,12 @@ bool CApplication::ChangeVideoConfig(const Gfx::DeviceConfig &newConfig)
|
|||
// TODO: Somehow this doesn't work for maximized windows (at least on Ubuntu)
|
||||
SDL_SetWindowSize(m_private->window, m_deviceConfig.size.x, m_deviceConfig.size.y);
|
||||
SDL_SetWindowFullscreen(m_private->window, m_deviceConfig.fullScreen ? SDL_WINDOW_FULLSCREEN : 0);
|
||||
if( SDL_GL_SetSwapInterval(m_engine->GetVSync()) == -1 )
|
||||
{
|
||||
GetLogger()->Warn("Adaptive sync not supported.\n");
|
||||
m_engine->SetVSync(1);
|
||||
SDL_GL_SetSwapInterval(1);
|
||||
}
|
||||
|
||||
m_device->ConfigChanged(m_deviceConfig);
|
||||
|
||||
|
|
|
@ -232,6 +232,7 @@ void InitializeEventTypeTexts()
|
|||
EVENT_TYPE_TEXT[EVENT_INTERFACE_SHADOW_MAPPING_QUALITY] = "EVENT_INTERFACE_SHADOW_MAPPING_QUALITY";
|
||||
EVENT_TYPE_TEXT[EVENT_INTERFACE_SHADOW_MAPPING_BUFFER] = "EVENT_INTERFACE_SHADOW_MAPPING_BUFFER";
|
||||
EVENT_TYPE_TEXT[EVENT_INTERFACE_LANGUAGE] = "EVENT_INTERFACE_LANGUAGE";
|
||||
EVENT_TYPE_TEXT[EVENT_INTERFACE_VSYNC] = "EVENT_INTERFACE_VSYNC";
|
||||
|
||||
EVENT_TYPE_TEXT[EVENT_INTERFACE_KINFO1] = "EVENT_INTERFACE_KINFO1";
|
||||
EVENT_TYPE_TEXT[EVENT_INTERFACE_KINFO2] = "EVENT_INTERFACE_KINFO2";
|
||||
|
|
|
@ -268,6 +268,7 @@ enum EventType
|
|||
EVENT_INTERFACE_SHADOW_MAPPING_QUALITY = 788,
|
||||
EVENT_INTERFACE_SHADOW_MAPPING_BUFFER = 789,
|
||||
EVENT_INTERFACE_LANGUAGE = 790,
|
||||
EVENT_INTERFACE_VSYNC = 791,
|
||||
|
||||
EVENT_INTERFACE_KINFO1 = 500,
|
||||
EVENT_INTERFACE_KINFO2 = 501,
|
||||
|
|
|
@ -216,6 +216,7 @@ void InitializeRestext()
|
|||
stringsEvent[EVENT_INTERFACE_SHADOW_MAPPING] = TR("Dynamic shadows\\Beautiful shadows!");
|
||||
stringsEvent[EVENT_INTERFACE_SHADOW_MAPPING_QUALITY]= TR("Dynamic shadows ++\\Dynamic shadows + self shadowing");
|
||||
stringsEvent[EVENT_INTERFACE_SHADOW_MAPPING_BUFFER] = TR("Shadow resolution\\Higher means better range and quality, but slower");
|
||||
stringsEvent[EVENT_INTERFACE_VSYNC] = TR("Vertical Synchronization\\Limits the number of frames per second to display frequency");
|
||||
|
||||
stringsEvent[EVENT_INTERFACE_KDEF] = TR("Standard controls\\Standard key functions");
|
||||
assert(INPUT_SLOT_MAX < EVENT_INTERFACE_KEY_END-EVENT_INTERFACE_KEY);
|
||||
|
|
|
@ -112,6 +112,7 @@ void CSettings::SaveSettings()
|
|||
|
||||
// Experimental settings
|
||||
GetConfigFile().SetBoolProperty("Experimental", "TerrainShadows", engine->GetTerrainShadows());
|
||||
GetConfigFile().SetIntProperty("Experimental", "VSync", engine->GetVSync());
|
||||
|
||||
CInput::GetInstancePointer()->SaveKeyBindings();
|
||||
|
||||
|
@ -274,6 +275,10 @@ void CSettings::LoadSettings()
|
|||
|
||||
if (GetConfigFile().GetBoolProperty("Experimental", "TerrainShadows", bValue))
|
||||
engine->SetTerrainShadows(bValue);
|
||||
if (GetConfigFile().GetIntProperty("Experimental", "VSync", iValue))
|
||||
{
|
||||
engine->SetVSync(iValue);
|
||||
}
|
||||
|
||||
CInput::GetInstancePointer()->LoadKeyBindings();
|
||||
|
||||
|
|
|
@ -197,6 +197,7 @@ CEngine::CEngine(CApplication *app, CSystemUtils* systemUtils)
|
|||
m_terrainShadows = false;
|
||||
m_shadowRange = 0.0f;
|
||||
m_multisample = 2;
|
||||
m_vsync = 0;
|
||||
|
||||
m_backForce = true;
|
||||
m_lightMode = true;
|
||||
|
@ -323,6 +324,7 @@ bool CEngine::Create()
|
|||
SetShadowMappingOffscreen(m_offscreenShadowRendering);
|
||||
SetShadowMappingOffscreenResolution(m_offscreenShadowRenderingResolution);
|
||||
SetMultiSample(m_multisample);
|
||||
SetVSync(m_vsync);
|
||||
|
||||
m_modelManager = MakeUnique<COldModelManager>(this);
|
||||
m_pyroManager = MakeUnique<CPyroManager>();
|
||||
|
@ -3023,6 +3025,19 @@ bool CEngine::GetTerrainShadows()
|
|||
return m_terrainShadows;
|
||||
}
|
||||
|
||||
void CEngine::SetVSync(int value)
|
||||
{
|
||||
if (value < -1) value = -1;
|
||||
if (value > 1) value = 1;
|
||||
if(m_vsync == value) return;
|
||||
m_vsync = value;
|
||||
}
|
||||
|
||||
int CEngine::GetVSync()
|
||||
{
|
||||
return m_vsync;
|
||||
}
|
||||
|
||||
void CEngine::SetBackForce(bool present)
|
||||
{
|
||||
m_backForce = present;
|
||||
|
|
|
@ -1072,6 +1072,13 @@ public:
|
|||
bool GetTerrainShadows();
|
||||
//@}
|
||||
|
||||
//@{
|
||||
//! Management of vertical synchronization
|
||||
// NOTE: This is an user configuration setting
|
||||
void SetVSync(int value);
|
||||
int GetVSync();
|
||||
//@}
|
||||
|
||||
//@{
|
||||
//! Management of shadow color
|
||||
// NOTE: This is a setting configurable only in INI file
|
||||
|
@ -1336,6 +1343,9 @@ protected:
|
|||
//! Texture bias for sampling shadow maps
|
||||
Math::Matrix m_shadowBias;
|
||||
|
||||
//! Vertical synchronization controll
|
||||
int m_vsync;
|
||||
|
||||
//! World matrix for 2D interface
|
||||
Math::Matrix m_matWorldInterface;
|
||||
//! Projection matrix for 2D interface
|
||||
|
|
|
@ -101,6 +101,36 @@ void CScreenSetupDisplay::CreateInterface()
|
|||
pc->SetState(STATE_SHADOW);
|
||||
pc->SetState(STATE_CHECK, m_setupFull);
|
||||
|
||||
pos.x = ox+sx*10;
|
||||
pos.y = oy+sy*9;
|
||||
ddim.x = dim.x*6;
|
||||
ddim.y = dim.y*1;
|
||||
GetResource(RES_EVENT, EVENT_INTERFACE_VSYNC, name);
|
||||
pl = pw->CreateLabel(pos, ddim, 0, EVENT_LABEL2, name);
|
||||
pl->SetTextAlign(Gfx::TEXT_ALIGN_LEFT);
|
||||
|
||||
pos.x = ox+sx*10;
|
||||
pos.y = oy+sy*7.97f;
|
||||
ddim.x = dim.x*6;
|
||||
ddim.y = dim.y*1.8f;
|
||||
pli = pw->CreateList(pos, ddim, 0, EVENT_INTERFACE_VSYNC);
|
||||
pli->SetState(STATE_SHADOW);
|
||||
pli->SetItemName(0, "Off");
|
||||
pli->SetItemName(1, "Adaptive");
|
||||
pli->SetItemName(2, "On");
|
||||
switch(m_engine->GetVSync())
|
||||
{
|
||||
case -1: //Adaptive?
|
||||
pli->SetSelect(1);
|
||||
break;
|
||||
case 0: //Off?
|
||||
pli->SetSelect(0);
|
||||
break;
|
||||
case 1: //On?
|
||||
pli->SetSelect(2);
|
||||
break;
|
||||
}
|
||||
|
||||
ddim.x = dim.x*6;
|
||||
ddim.y = dim.y*1;
|
||||
pos.x = ox+sx*10;
|
||||
|
@ -117,6 +147,7 @@ bool CScreenSetupDisplay::EventProcess(const Event &event)
|
|||
CWindow* pw;
|
||||
CCheck* pc;
|
||||
CButton* pb;
|
||||
CList* pl;
|
||||
|
||||
switch( event.type )
|
||||
{
|
||||
|
@ -153,6 +184,27 @@ bool CScreenSetupDisplay::EventProcess(const Event &event)
|
|||
UpdateApply();
|
||||
break;
|
||||
|
||||
case EVENT_INTERFACE_VSYNC:
|
||||
pw = static_cast<CWindow*>(m_interface->SearchControl(EVENT_WINDOW5));
|
||||
if ( pw == nullptr ) break;
|
||||
pl = static_cast<CList*>(pw->SearchControl(EVENT_INTERFACE_VSYNC));
|
||||
if (pl == nullptr ) break;
|
||||
switch(pl->GetSelect())
|
||||
{
|
||||
case 0: //Off?
|
||||
m_engine->SetVSync(0);
|
||||
break;
|
||||
case 1: //Adaptive?
|
||||
m_engine->SetVSync(-1);
|
||||
break;
|
||||
case 2: //On?
|
||||
m_engine->SetVSync(1);
|
||||
break;
|
||||
}
|
||||
ChangeDisplay();
|
||||
UpdateApply();
|
||||
break;
|
||||
|
||||
default:
|
||||
return true;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue