Add support for non-adaptive VSync (feature 7129)

update_gitlab_rules
Andrei Kortunov 1 year ago
parent 83d15ef786
commit be488649c3

@ -56,6 +56,7 @@
Feature #7058: Implement TestModels (T3D) console command
Feature #7087: Block resolution change in the Windowed Fullscreen mode
Feature #7125: Remembering console commands between sessions
Feature #7129: Add support for non-adaptive VSync
Feature #7130: Ability to set MyGUI logging verbosity
Feature #7148: Optimize string literal lookup in mwscript
Feature #7194: Ori to show texture paths

@ -93,13 +93,18 @@ bool Launcher::GraphicsPage::loadSettings()
return false;
// Visuals
if (Settings::Manager::getBool("vsync", "Video"))
vSyncCheckBox->setCheckState(Qt::Checked);
int vsync = Settings::Manager::getInt("vsync mode", "Video");
if (vsync < 0 || vsync > 2)
vsync = 0;
vSyncComboBox->setCurrentIndex(vsync);
size_t windowMode = static_cast<size_t>(Settings::Manager::getInt("window mode", "Video"));
if (windowMode > static_cast<size_t>(Settings::WindowMode::Windowed))
windowMode = 0;
windowModeComboBox->setCurrentIndex(windowMode);
slotFullScreenChanged(windowMode);
if (Settings::Manager::getBool("window border", "Video"))
windowBorderCheckBox->setCheckState(Qt::Checked);
@ -185,9 +190,9 @@ void Launcher::GraphicsPage::saveSettings()
// Ensure we only set the new settings if they changed. This is to avoid cluttering the
// user settings file (which by definition should only contain settings the user has touched)
bool cVSync = vSyncCheckBox->checkState();
if (cVSync != Settings::Manager::getBool("vsync", "Video"))
Settings::Manager::setBool("vsync", "Video", cVSync);
int cVSync = vSyncComboBox->currentIndex();
if (cVSync != Settings::Manager::getInt("vsync mode", "Video"))
Settings::Manager::setInt("vsync mode", "Video", cVSync);
int cWindowMode = windowModeComboBox->currentIndex();
if (cWindowMode != Settings::Manager::getInt("window mode", "Video"))

@ -473,7 +473,7 @@ void OMW::Engine::createWindow()
Settings::WindowMode windowMode
= static_cast<Settings::WindowMode>(Settings::Manager::getInt("window mode", "Video"));
bool windowBorder = Settings::Manager::getBool("window border", "Video");
bool vsync = Settings::Manager::getBool("vsync", "Video");
int vsync = Settings::Manager::getInt("vsync mode", "Video");
unsigned int antialiasing = std::max(0, Settings::Manager::getInt("antialiasing", "Video"));
int pos_x = SDL_WINDOWPOS_CENTERED_DISPLAY(screen), pos_y = SDL_WINDOWPOS_CENTERED_DISPLAY(screen);
@ -560,10 +560,10 @@ void OMW::Engine::createWindow()
traits->windowName = SDL_GetWindowTitle(mWindow);
traits->windowDecoration = !(SDL_GetWindowFlags(mWindow) & SDL_WINDOW_BORDERLESS);
traits->screenNum = SDL_GetWindowDisplayIndex(mWindow);
traits->vsync = vsync;
traits->vsync = 0;
traits->inheritedWindowData = new SDLUtil::GraphicsWindowSDL2::WindowData(mWindow);
graphicsWindow = new SDLUtil::GraphicsWindowSDL2(traits);
graphicsWindow = new SDLUtil::GraphicsWindowSDL2(traits, vsync);
if (!graphicsWindow->valid())
throw std::runtime_error("Failed to create GraphicsContext");

@ -256,6 +256,7 @@ namespace MWGui
getWidget(mOkButton, "OkButton");
getWidget(mResolutionList, "ResolutionList");
getWidget(mWindowModeList, "WindowModeList");
getWidget(mVSyncModeList, "VSyncModeList");
getWidget(mWindowBorderButton, "WindowBorderButton");
getWidget(mTextureFilteringButton, "TextureFilteringButton");
getWidget(mControlsBox, "ControlsBox");
@ -315,6 +316,7 @@ namespace MWGui
mMaxLights->eventComboChangePosition += MyGUI::newDelegate(this, &SettingsWindow::onMaxLightsChanged);
mWindowModeList->eventComboChangePosition += MyGUI::newDelegate(this, &SettingsWindow::onWindowModeChanged);
mVSyncModeList->eventComboChangePosition += MyGUI::newDelegate(this, &SettingsWindow::onVSyncModeChanged);
mKeyboardSwitch->eventMouseButtonClick += MyGUI::newDelegate(this, &SettingsWindow::onKeyboardSwitchClicked);
mControllerSwitch->eventMouseButtonClick
@ -562,6 +564,16 @@ namespace MWGui
Settings::Manager::setStringArray("preferred locales", "General", currentLocales);
}
void SettingsWindow::onVSyncModeChanged(MyGUI::ComboBox* _sender, size_t pos)
{
if (pos == MyGUI::ITEM_NONE)
return;
int index = static_cast<int>(_sender->getIndexSelected());
Settings::Manager::setInt("vsync mode", "Video", index);
apply();
}
void SettingsWindow::onWindowModeChanged(MyGUI::ComboBox* _sender, size_t pos)
{
if (pos == MyGUI::ITEM_NONE)
@ -870,6 +882,16 @@ namespace MWGui
mResolutionList->setEnabled(false);
}
void SettingsWindow::updateVSyncModeSettings()
{
int index = static_cast<size_t>(Settings::Manager::getInt("vsync mode", "Video"));
if (index < 0 || index > 2)
index = 0;
mVSyncModeList->setIndexSelected(index);
}
void SettingsWindow::layoutControlsBox()
{
const int h = MWBase::Environment::get().getWindowManager()->getFontHeight() + 2;
@ -1033,6 +1055,7 @@ namespace MWGui
updateControlsBox();
updateLightSettings();
updateWindowModeSettings();
updateVSyncModeSettings();
resetScrollbars();
renderScriptSettings();
MWBase::Environment::get().getWindowManager()->setKeyFocusWidget(mOkButton);

@ -18,6 +18,8 @@ namespace MWGui
void updateLightSettings();
void updateVSyncModeSettings();
void updateWindowModeSettings();
void onResChange(int, int) override;
@ -29,6 +31,7 @@ namespace MWGui
// graphics
MyGUI::ListBox* mResolutionList;
MyGUI::ComboBox* mWindowModeList;
MyGUI::ComboBox* mVSyncModeList;
MyGUI::Button* mWindowBorderButton;
MyGUI::ComboBox* mTextureFilteringButton;
@ -83,6 +86,7 @@ namespace MWGui
void onLanguageChanged(size_t langPriority, MyGUI::ComboBox* _sender, size_t pos);
void onWindowModeChanged(MyGUI::ComboBox* _sender, size_t pos);
void onVSyncModeChanged(MyGUI::ComboBox* _sender, size_t pos);
void onRebindAction(MyGUI::Widget* _sender);
void onInputTabMouseWheel(MyGUI::Widget* _sender, int _rel);

@ -1148,8 +1148,8 @@ namespace MWGui
|| setting.second == "window mode" || setting.second == "window border"))
changeRes = true;
else if (setting.first == "Video" && setting.second == "vsync")
mVideoWrapper->setSyncToVBlank(Settings::Manager::getBool("vsync", "Video"));
else if (setting.first == "Video" && setting.second == "vsync mode")
mVideoWrapper->setSyncToVBlank(Settings::Manager::getInt("vsync mode", "Video"));
else if (setting.first == "Video" && (setting.second == "gamma" || setting.second == "contrast"))
mVideoWrapper->setGammaContrast(
Settings::Manager::getFloat("gamma", "Video"), Settings::Manager::getFloat("contrast", "Video"));

@ -14,7 +14,7 @@ namespace SDLUtil
close(true);
}
GraphicsWindowSDL2::GraphicsWindowSDL2(osg::GraphicsContext::Traits* traits)
GraphicsWindowSDL2::GraphicsWindowSDL2(osg::GraphicsContext::Traits* traits, int vsync)
: mWindow(nullptr)
, mContext(nullptr)
, mValid(false)
@ -23,6 +23,13 @@ namespace SDLUtil
{
_traits = traits;
if (vsync == 2)
mVSyncMode = VSyncMode::Adaptive;
else if (vsync == 1)
mVSyncMode = VSyncMode::Enabled;
else
mVSyncMode = VSyncMode::Disabled;
init();
if (GraphicsWindowSDL2::valid())
{
@ -134,7 +141,7 @@ namespace SDLUtil
openmw_gl4es_init(mWindow);
#endif
setSwapInterval(_traits->vsync);
setSwapInterval(mVSyncMode);
// Update traits with what we've actually been given
// Use intermediate to avoid signed/unsigned mismatch
@ -233,29 +240,41 @@ namespace SDLUtil
}
void GraphicsWindowSDL2::setSyncToVBlank(bool on)
{
throw std::runtime_error(
"setSyncToVBlank with bool argument is not supported. Use the VSyncMode argument instead.");
}
void GraphicsWindowSDL2::setSyncToVBlank(VSyncMode mode)
{
SDL_Window* oldWin = SDL_GL_GetCurrentWindow();
SDL_GLContext oldCtx = SDL_GL_GetCurrentContext();
SDL_GL_MakeCurrent(mWindow, mContext);
setSwapInterval(on);
setSwapInterval(mode);
SDL_GL_MakeCurrent(oldWin, oldCtx);
}
void GraphicsWindowSDL2::setSwapInterval(bool enable)
void GraphicsWindowSDL2::setSwapInterval(VSyncMode mode)
{
if (enable)
mVSyncMode = mode;
if (mode == VSyncMode::Adaptive)
{
if (SDL_GL_SetSwapInterval(-1) == -1)
{
OSG_NOTICE << "Adaptive vsync unsupported" << std::endl;
if (SDL_GL_SetSwapInterval(1) == -1)
{
OSG_NOTICE << "Vertical synchronization unsupported, disabling" << std::endl;
SDL_GL_SetSwapInterval(0);
}
setSwapInterval(VSyncMode::Enabled);
}
}
else if (mode == VSyncMode::Enabled)
{
if (SDL_GL_SetSwapInterval(1) == -1)
{
OSG_NOTICE << "Vertical synchronization unsupported, disabling" << std::endl;
setSwapInterval(VSyncMode::Disabled);
}
}
else

@ -7,6 +7,12 @@
namespace SDLUtil
{
enum VSyncMode
{
Disabled = 0,
Enabled = 1,
Adaptive = 2
};
class GraphicsWindowSDL2 : public osgViewer::GraphicsWindow
{
@ -16,13 +22,14 @@ namespace SDLUtil
bool mValid;
bool mRealized;
bool mOwnsWindow;
VSyncMode mVSyncMode;
void init();
virtual ~GraphicsWindowSDL2();
public:
GraphicsWindowSDL2(osg::GraphicsContext::Traits* traits);
GraphicsWindowSDL2(osg::GraphicsContext::Traits* traits, int vsync);
bool isSameKindAs(const Object* object) const override
{
@ -53,6 +60,7 @@ namespace SDLUtil
/** Set sync-to-vblank. */
void setSyncToVBlank(bool on) override;
void setSyncToVBlank(VSyncMode mode);
/** Set Window decoration.*/
bool setWindowDecorationImplementation(bool flag) override;
@ -87,7 +95,7 @@ namespace SDLUtil
};
private:
void setSwapInterval(bool enable);
void setSwapInterval(VSyncMode mode);
};
}

@ -1,6 +1,7 @@
#include "sdlvideowrapper.hpp"
#include <components/debug/debuglog.hpp>
#include <components/sdlutil/sdlgraphicswindow.hpp>
#include <components/settings/settings.hpp>
#include <osgViewer/Viewer>
@ -29,15 +30,24 @@ namespace SDLUtil
SDL_SetWindowGammaRamp(mWindow, mOldSystemGammaRamp, &mOldSystemGammaRamp[256], &mOldSystemGammaRamp[512]);
}
void VideoWrapper::setSyncToVBlank(bool sync)
void VideoWrapper::setSyncToVBlank(int mode)
{
VSyncMode vsyncMode = VSyncMode::Disabled;
if (mode == 1)
vsyncMode = VSyncMode::Enabled;
else if (mode == 2)
vsyncMode = VSyncMode::Adaptive;
osgViewer::Viewer::Windows windows;
mViewer->getWindows(windows);
mViewer->stopThreading();
for (osgViewer::Viewer::Windows::iterator it = windows.begin(); it != windows.end(); ++it)
{
osgViewer::GraphicsWindow* win = *it;
win->setSyncToVBlank(sync);
if (GraphicsWindowSDL2* sdl2win = dynamic_cast<GraphicsWindowSDL2*>(win))
sdl2win->setSyncToVBlank(vsyncMode);
else
win->setSyncToVBlank(static_cast<bool>(mode));
}
mViewer->startThreading();
}

@ -26,7 +26,7 @@ namespace SDLUtil
VideoWrapper(SDL_Window* window, osg::ref_ptr<osgViewer::Viewer> viewer);
~VideoWrapper();
void setSyncToVBlank(bool sync);
void setSyncToVBlank(int mode);
void setGammaContrast(float gamma, float contrast);

@ -125,22 +125,25 @@ This setting can be configured from a list of valid choices in the Graphics pane
but cannot be changed during game play
due to a technical limitation that may be addressed in a future version of OpenMW.
vsync
-----
vsync mode
----------
:Type: boolean
:Range: True/False
:Default: False
:Type: integer
:Range: 0, 1, 2
:Default: 0
This setting determines whether frame draws are synchronized with the vertical refresh rate of your monitor.
Enabling this setting can reduce screen tearing,
a visual defect caused by updating the image buffer in the middle of a screen draw.
Enabling this option typically implies limiting the framerate to the refresh rate of your monitor,
Enabling this option (1 or 2) typically implies limiting the framerate to the refresh rate of your monitor,
but may also introduce additional delays caused by having to wait until the appropriate time
(the vertical blanking interval) to draw a frame, and a loss in mouse responsiveness known as 'input lag'.
Mode 2 of this option corresponds to the use of adaptive vsync. Adaptive vsync is turned off if the framerate
cannot reach your display's refresh rate. This prevents the input lag from becoming unbearable but may lead to tearing.
Some hardware might not support this mode, in which case traditional vsync will be used.
This setting can be adjusted in game using the VSync button in the Video tab of the Video panel in the Options menu.
It can also be changed by toggling the Vertical Sync check box in the Graphics tab of the OpenMW Launcher.
This setting can be adjusted in game using the VSync combo box in the Video tab of the Video panel in the Options menu.
It can also be changed by toggling the Vertical Sync combo box in the Graphics tab of the OpenMW Launcher.
framerate limit
---------------

@ -77,6 +77,7 @@ TextureFilteringTrilinear: "Trilinear"
ToggleHUD: "Toggle HUD"
TogglePostProcessorHUD: "Toggle Post Processor HUD"
VSync: "VSync"
VSyncAdaptive: "Adaptive"
Water: "Water"
WaterShader: "Water shader"
WaterShaderTextureQuality: "Texture quality"

@ -77,6 +77,7 @@ TextureFilteringTrilinear: "Трилинейная"
ToggleHUD: "Переключить HUD"
TogglePostProcessorHUD: "Меню настроек постобработки"
VSync: "Вертикальная синхронизация"
VSyncAdaptive: "Адаптивная"
Water: "Вода"
WaterShader: "Шейдер воды"
WaterShaderTextureQuality: "Качество текстуры воды"

@ -275,28 +275,28 @@
<Property key="ButtonAutoWidth" value="true"/>
<Widget type="TabItem">
<Property key="Caption" value=" #{sVideo} "/>
<Widget type="ListBox" skin="MW_List" position="0 4 185 225" align="Left Top" name="ResolutionList"/>
<Widget type="TextBox" skin="NormalText" position="197 4 185 18" align="Left Top">
<Widget type="ListBox" skin="MW_List" position="0 4 195 225" align="Left Top" name="ResolutionList"/>
<Widget type="TextBox" skin="NormalText" position="207 4 250 18" align="Left Top">
<Property key="Caption" value="#{OMWEngine:WindowMode}"/>
</Widget>
<Widget type="HBox" position="197 28 400 24">
<Widget type="HBox" position="207 24 400 24">
<Widget type="ComboBox" skin="MW_ComboBox" position="0 0 200 24" align="Left Top" name="WindowModeList">
<Property key="AddItem" value="#{OMWEngine:WindowModeFullscreen}"/>
<Property key="AddItem" value="#{OMWEngine:WindowModeWindowedFullscreen}"/>
<Property key="AddItem" value="#{OMWEngine:WindowModeWindowed}"/>
</Widget>
</Widget>
<Widget type="HBox" position="197 58 400 28">
<Widget type="AutoSizedButton" skin="MW_Button" position="0 0 24 24" align="Left Top" name="VSyncButton">
<UserString key="SettingCategory" value="Video"/>
<UserString key="SettingName" value="vsync"/>
<UserString key="SettingType" value="CheckButton"/>
</Widget>
<Widget type="AutoSizedTextBox" skin="SandText" position="28 4 48 16" align="Left Top">
<Property key="Caption" value="#{OMWEngine:VSync}"/>
<Widget type="TextBox" skin="NormalText" position="207 54 250 18" align="Left Top">
<Property key="Caption" value="#{OMWEngine:VSync}"/>
</Widget>
<Widget type="HBox" position="207 74 400 28">
<Widget type="ComboBox" skin="MW_ComboBox" position="0 0 200 24" align="Left Top" name="VSyncModeList">
<Property key="AddItem" value="#{sOff}"/>
<Property key="AddItem" value="#{sOn}"/>
<Property key="AddItem" value="#{OMWEngine:VSyncAdaptive}"/>
</Widget>
</Widget>
<Widget type="HBox" position="197 88 300 28">
<Widget type="HBox" position="207 108 300 28">
<Widget type="AutoSizedButton" skin="MW_Button" position="0 0 24 24" align="Left Top" name="WindowBorderButton">
<UserString key="SettingCategory" value="Video"/>
<UserString key="SettingName" value="window border"/>
@ -306,7 +306,7 @@
<Property key="Caption" value="#{OMWEngine:WindowBorder}"/>
</Widget>
</Widget>
<Widget type="HBox" position="197 118 300 28">
<Widget type="HBox" position="207 142 300 28">
<Widget type="AutoSizedButton" skin="MW_Button" position="0 0 24 24" align="Left Top" name="WindowBorderButton">
<UserString key="SettingCategory" value="Post Processing"/>
<UserString key="SettingName" value="enabled"/>
@ -320,11 +320,11 @@
</Widget>
</Widget>
<Widget type="AutoSizedTextBox" skin="SandText" position="197 154 300 32" align="Left Top">
<Widget type="AutoSizedTextBox" skin="SandText" position="207 174 300 32" align="Left Top">
<Property key="Caption" value="#{OMWEngine:FrameRateHint}"/>
</Widget>
<Widget type="AutoSizedTextBox" skin="SandText" position="197 196 300 32" align="Left Top" name="WindowModeHint">
<Property key="Caption" value="#{SettingsMenu:WindowModeHint}"/>
<Widget type="AutoSizedTextBox" skin="SandText" position="207 216 300 32" align="Left Top" name="WindowModeHint">
<Property key="Caption" value="#{OMWEngine:WindowModeHint}"/>
</Widget>
<Widget type="TextBox" skin="NormalText" position="0 238 352 18" align="Left Top" name="FovText">

@ -627,8 +627,11 @@ window border = true
# Anti-aliasing reduces jagged polygon edges. (0, 2, 4, 8, 16).
antialiasing = 0
# Enable vertical syncing to reduce tearing defects.
vsync = false
# Vertical syncing to reduce tearing defects.
# 0 = Off
# 1 = On
# 2 = Adaptive
vsync mode = 0
# Maximum frames per second. 0.0 is unlimited, or >0.0 to limit.
framerate limit = 300

@ -7,7 +7,7 @@
<x>0</x>
<y>0</y>
<width>650</width>
<height>340</height>
<height>358</height>
</rect>
</property>
<layout class="QVBoxLayout" name="verticalLayout">
@ -22,190 +22,210 @@
</attribute>
<layout class="QHBoxLayout" name="horizontalLayout_2">
<item>
<widget class="QWidget" name="DisplayWidget">
<layout class="QGridLayout" name="gridLayout_4" columnstretch="1,0">
<item row="3" column="0">
<widget class="QLabel" name="antiAliasingLabel">
<layout class="QGridLayout" name="gridLayout_4" columnstretch="1,0">
<item row="5" column="0">
<widget class="QLabel" name="screenLabel">
<property name="text">
<string>Screen:</string>
</property>
</widget>
</item>
<item row="4" column="1">
<widget class="QComboBox" name="antiAliasingComboBox">
<item>
<property name="text">
<string>Anti-aliasing:</string>
<string>0</string>
</property>
</widget>
</item>
<item row="6" column="0">
<widget class="QCheckBox" name="framerateLimitCheckBox">
</item>
<item>
<property name="text">
<string>Framerate Limit:</string>
<string>2</string>
</property>
</widget>
</item>
<item row="5" column="1">
<layout class="QGridLayout" name="resolutionLayout">
<item row="1" column="2">
<layout class="QHBoxLayout" name="customResolutionLayout" stretch="1,0,1">
<item>
<widget class="QSpinBox" name="customWidthSpinBox">
<property name="minimum">
<number>800</number>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="multiplyLabel">
<property name="text">
<string> x </string>
</property>
</widget>
</item>
<item>
<widget class="QSpinBox" name="customHeightSpinBox">
<property name="minimum">
<number>600</number>
</property>
</widget>
</item>
</layout>
</item>
<item row="1" column="1">
<widget class="QRadioButton" name="customRadioButton">
<property name="text">
<string>Custom:</string>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QRadioButton" name="standardRadioButton">
<property name="text">
<string>Standard:</string>
</property>
<property name="checkable">
<bool>true</bool>
</property>
</widget>
</item>
<item row="0" column="2">
<widget class="QComboBox" name="resolutionComboBox"/>
</item>
</layout>
</item>
<item row="6" column="1">
<widget class="QDoubleSpinBox" name="framerateLimitSpinBox">
<property name="enabled">
<bool>false</bool>
</property>
<property name="suffix">
<string> FPS</string>
</property>
<property name="decimals">
<number>1</number>
</property>
<property name="minimum">
<double>1</double>
</property>
<property name="maximum">
<double>1000</double>
</property>
<property name="singleStep">
<double>15</double>
</property>
<property name="value">
<double>300</double>
</item>
<item>
<property name="text">
<string>4</string>
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QCheckBox" name="windowBorderCheckBox">
</item>
<item>
<property name="text">
<string>Window Border</string>
<string>8</string>
</property>
</widget>
</item>
<item row="2" column="1">
<widget class="QComboBox" name="windowModeComboBox">
<property name="currentIndex">
<number>0</number>
</item>
<item>
<property name="text">
<string>16</string>
</property>
<item>
<property name="text">
<string>Fullscreen</string>
</property>
</item>
<item>
<property name="text">
<string>Windowed Fullscreen</string>
</property>
</item>
<item>
<property name="text">
<string>Windowed</string>
</property>
</item>
</item>
</widget>
</item>
<item row="5" column="1">
<widget class="QComboBox" name="screenComboBox"/>
</item>
<item row="3" column="0">
<widget class="QLabel" name="windowModeLabel">
<property name="text">
<string>Window Mode:</string>
</property>
</widget>
</item>
<item row="6" column="0">
<widget class="QLabel" name="resolutionLabel">
<property name="text">
<string>Resolution:</string>
</property>
<property name="alignment">
<set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop</set>
</property>
</widget>
</item>
<item row="2" column="0">
<widget class="QLabel" name="vSyncLabel">
<property name="text">
<string>Vertical Sync:</string>
</property>
</widget>
</item>
<item row="4" column="0">
<widget class="QLabel" name="antiAliasingLabel">
<property name="text">
<string>Anti-aliasing:</string>
</property>
</widget>
</item>
<item row="6" column="1">
<layout class="QGridLayout" name="resolutionLayout">
<item row="1" column="2">
<layout class="QHBoxLayout" name="customResolutionLayout" stretch="1,0,1">
<item>
<widget class="QSpinBox" name="customWidthSpinBox">
<property name="minimum">
<number>800</number>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="multiplyLabel">
<property name="text">
<string> x </string>
</property>
</widget>
</item>
<item>
<widget class="QSpinBox" name="customHeightSpinBox">
<property name="minimum">
<number>600</number>
</property>
</widget>
</item>
</layout>
</item>
<item row="1" column="1">
<widget class="QRadioButton" name="customRadioButton">
<property name="text">
<string>Custom:</string>
</property>
</widget>
</item>
<item row="2" column="0">
<widget class="QLabel" name="windowModeLabel">
</item>
<item row="0" column="1">
<widget class="QRadioButton" name="standardRadioButton">
<property name="text">
<string>Standard:</string>
</property>
<property name="checkable">
<bool>true</bool>
</property>
</widget>
</item>
<item row="0" column="2">
<widget class="QComboBox" name="resolutionComboBox"/>
</item>
</layout>
</item>
<item row="3" column="1">
<widget class="QComboBox" name="windowModeComboBox">
<property name="currentIndex">
<number>0</number>
</property>
<item>
<property name="text">
<string>Window Mode:</string>
<string>Fullscreen</string>
</property>
</widget>
</item>
<item row="5" column="0">
<widget class="QLabel" name="resolutionLabel">
</item>
<item>
<property name="text">
<string>Resolution:</string>
<string>Windowed Fullscreen</string>
</property>
<property name="alignment">
<set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop</set>
</item>
<item>
<property name="text">
<string>Windowed</string>
</property>
</widget>
</item>
<item row="4" column="1">
<widget class="QComboBox" name="screenComboBox"/>
</item>
<item row="4" column="0">
<widget class="QLabel" name="screenLabel">
</item>
</widget>
</item>
<item row="0" column="0">
<widget class="QCheckBox" name="windowBorderCheckBox">
<property name="text">
<string>Window Border</string>
</property>
</widget>
</item>
<item row="2" column="1">
<widget class="QComboBox" name="vSyncComboBox">
<property name="currentIndex">
<number>0</number>
</property>
<item>
<property name="text">
<string>Screen:</string>
<string>Disabled</string>
</property>
</widget>
</item>
<item row="3" column="1">
<widget class="QComboBox" name="antiAliasingComboBox">
<item>
<property name="text">
<string>0</string>
</property>
</item>
<item>
<property name="text">
<string>2</string>
</property>
</item>
<item>
<property name="text">
<string>4</string>
</property>
</item>
<item>
<property name="text">
<string>8</string>
</property>
</item>
<item>
<property name="text">
<string>16</string>
</property>
</item>
</widget>
</item>
<item row="0" column="0">
<widget class="QCheckBox" name="vSyncCheckBox">
</item>
<item>
<property name="text">
<string>Vertical Sync</string>
<string>Enabled</string>
</property>
</widget>
</item>
</layout>
</widget>
</item>
<item>
<property name="text">
<string>Adaptive</string>
</property>
</item>
</widget>
</item>
<item row="1" column="0">
<widget class="QCheckBox" name="framerateLimitCheckBox">
<property name="text">
<string>Framerate Limit:</string>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="QDoubleSpinBox" name="framerateLimitSpinBox">
<property name="enabled">
<bool>false</bool>
</property>
<property name="suffix">
<string> FPS</string>
</property>
<property name="decimals">
<number>1</number>
</property>
<property name="minimum">
<double>1.000000000000000</double>
</property>
<property name="maximum">
<double>1000.000000000000000</double>
</property>
<property name="singleStep">
<double>15.000000000000000</double>
</property>
<property name="value">
<double>300.000000000000000</double>
</property>
</widget>
</item>
</layout>
</item>
</layout>
</widget>
@ -265,192 +285,182 @@
</attribute>
<layout class="QHBoxLayout" name="horizontalLayout">
<item>
<widget class="QWidget" name="ShadowWidget">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
<horstretch>1</horstretch>
<verstretch>1</verstretch>
</sizepolicy>
</property>
<layout class="QGridLayout" name="shadowsLayout" columnstretch="0,0">
<item row="0" column="0">
<widget class="QCheckBox" name="playerShadowsCheckBox">
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Enable shadows exclusively for the player character. May have a very minor performance impact.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="text">
<string>Enable Player Shadows</string>
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QCheckBox" name="actorShadowsCheckBox">
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Enable shadows for NPCs and creatures besides the player character. May have a minor performance impact.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="text">
<string>Enable Actor Shadows</string>
</property>
</widget>
</item>
<item row="2" column="0">
<widget class="QCheckBox" name="objectShadowsCheckBox">
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Enable shadows for primarily inanimate objects. May have a significant performance impact.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<layout class="QGridLayout" name="shadowsLayout" columnstretch="0,0">
<item row="0" column="0">
<widget class="QCheckBox" name="playerShadowsCheckBox">
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Enable shadows exclusively for the player character. May have a very minor performance impact.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="text">
<string>Enable Player Shadows</string>
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QCheckBox" name="actorShadowsCheckBox">
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Enable shadows for NPCs and creatures besides the player character. May have a minor performance impact.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="text">
<string>Enable Actor Shadows</string>
</property>
</widget>
</item>
<item row="2" column="0">
<widget class="QCheckBox" name="objectShadowsCheckBox">
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Enable shadows for primarily inanimate objects. May have a significant performance impact.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="text">
<string>Enable Object Shadows</string>
</property>
</widget>
</item>
<item row="3" column="0">
<widget class="QCheckBox" name="terrainShadowsCheckBox">
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Enable shadows for the terrain including distant terrain. May have a significant performance and shadow quality impact.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="text">
<string>Enable Terrain Shadows</string>
</property>
</widget>
</item>
<item row="4" column="0">
<widget class="QCheckBox" name="indoorShadowsCheckBox">
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Due to limitations with Morrowind's data, only actors can cast shadows indoors, which some might feel is distracting.&lt;/p&gt;&lt;p&gt;Has no effect if actor/player shadows are not enabled.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="text">
<string>Enable Indoor Shadows</string>
</property>
</widget>
</item>
<item row="5" column="0">
<widget class="QLabel" name="shadowComputeSceneBoundsLabel">
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Type of &quot;compute scene bounds&quot; computation method to be used. Bounds (default) for good balance between performance and shadow quality, primitives for better looking shadows or none for no computation.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="text">
<string>Shadow Near Far Computation Method:</string>
</property>
</widget>
</item>
<item row="5" column="1">
<widget class="QComboBox" name="shadowComputeSceneBoundsComboBox">
<item>
<property name="text">
<string>Enable Object Shadows</string>
</property>
</widget>
</item>
<item row="3" column="0">
<widget class="QCheckBox" name="terrainShadowsCheckBox">
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Enable shadows for the terrain including distant terrain. May have a significant performance and shadow quality impact.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
<string>bounds</string>
</property>
</item>
<item>
<property name="text">
<string>Enable Terrain Shadows</string>
</property>
</widget>
</item>
<item row="4" column="0">
<widget class="QCheckBox" name="indoorShadowsCheckBox">
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Due to limitations with Morrowind's data, only actors can cast shadows indoors, which some might feel is distracting.&lt;/p&gt;&lt;p&gt;Has no effect if actor/player shadows are not enabled.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
<string>primitives</string>
</property>
</item>
<item>
<property name="text">
<string>Enable Indoor Shadows</string>
</property>
</widget>
</item>
<item row="5" column="0">
<widget class="QLabel" name="shadowComputeSceneBoundsLabel">
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Type of "compute scene bounds" computation method to be used. Bounds (default) for good balance between performance and shadow quality, primitives for better looking shadows or none for no computation.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
<string>none</string>
</property>
</item>
</widget>
</item>
<item row="6" column="0">
<widget class="QLabel" name="shadowResolutionLabel">
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;The resolution of each individual shadow map. Increasing it significantly improves shadow quality but may have a minor performance impact.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="text">
<string>Shadow Map Resolution:</string>
</property>
</widget>
</item>
<item row="6" column="1">
<widget class="QComboBox" name="shadowResolutionComboBox">
<item>
<property name="text">
<string>Shadow Near Far Computation Method:</string>
</property>
</widget>
</item>
<item row="5" column="1">compute scene bounds
<widget class="QComboBox" name="shadowComputeSceneBoundsComboBox">
<item>
<property name="text">
<string>bounds</string>
</property>
</item>
<item>
<property name="text">
<string>primitives</string>
</property>
</item>
<item>
<property name="text">
<string>none</string>
</property>
</item>
</widget>
</item>
<item row="6" column="0">
<widget class="QLabel" name="shadowResolutionLabel">
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;The resolution of each individual shadow map. Increasing it significantly improves shadow quality but may have a minor performance impact.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
<string>512</string>
</property>
</item>
<item>
<property name="text">
<string>Shadow Map Resolution:</string>
</property>
</widget>
</item>
<item row="6" column="1">
<widget class="QComboBox" name="shadowResolutionComboBox">
<item>
<property name="text">
<string>512</string>
</property>
</item>
<item>
<property name="text">
<string>1024</string>
</property>
</item>
<item>
<property name="text">
<string>2048</string>
</property>
</item>
<item>
<property name="text">
<string>4096</string>
</property>
</item>
</widget>
</item>
<item row="7" column="0">
<widget class="QCheckBox" name="shadowDistanceCheckBox">
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;The distance from the camera at which shadows completely disappear.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
<string>1024</string>
</property>
</item>
<item>
<property name="text">
<string>Shadow Distance Limit:</string>
</property>
</widget>
</item>
<item row="7" column="1">
<widget class="QSpinBox" name="shadowDistanceSpinBox">
<property name="enabled">
<bool>false</bool>
</property>
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;64 game units is 1 real life yard or about 0.9 m&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="suffix">
<string> unit(s)</string>
</property>
<property name="minimum">
<number>512</number>
</property>
<property name="maximum">
<number>81920</number>
</property>
<property name="value">
<number>8192</number>
</property>
</widget>
</item>
<item row="8" column="0">
<widget class="QLabel" name="fadeStartLabel">
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;The fraction of the limit above at which shadows begin to gradually fade away.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
<string>2048</string>
</property>
</item>
<item>
<property name="text">
<string>Fade Start Multiplier:</string>
<string>4096</string>
</property>
</widget>
</item>
<item row="8" column="1">
<widget class="QDoubleSpinBox" name="fadeStartSpinBox">
<property name="enabled">
<bool>false</bool>
</property>
<property name="decimals">
<number>2</number>
</property>
<property name="minimum">
<double>0</double>
</property>
<property name="maximum">
<double>1</double>
</property>
<property name="value">
<double>0.90</double>
</property>
</widget>
</item>
</layout>
</widget>
</item>
</widget>
</item>
<item row="7" column="0">
<widget class="QCheckBox" name="shadowDistanceCheckBox">
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;The distance from the camera at which shadows completely disappear.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="text">
<string>Shadow Distance Limit:</string>
</property>
</widget>
</item>
<item row="7" column="1">
<widget class="QSpinBox" name="shadowDistanceSpinBox">
<property name="enabled">
<bool>false</bool>
</property>
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;64 game units is 1 real life yard or about 0.9 m&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="suffix">
<string> unit(s)</string>
</property>
<property name="minimum">
<number>512</number>
</property>
<property name="maximum">
<number>81920</number>
</property>
<property name="value">
<number>8192</number>
</property>
</widget>
</item>
<item row="8" column="0">
<widget class="QLabel" name="fadeStartLabel">
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;The fraction of the limit above at which shadows begin to gradually fade away.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="text">
<string>Fade Start Multiplier:</string>
</property>
</widget>
</item>
<item row="8" column="1">
<widget class="QDoubleSpinBox" name="fadeStartSpinBox">
<property name="enabled">
<bool>false</bool>
</property>
<property name="decimals">
<number>2</number>
</property>
<property name="minimum">
<double>0.000000000000000</double>
</property>
<property name="maximum">
<double>1.000000000000000</double>
</property>
<property name="value">
<double>0.900000000000000</double>
</property>
</widget>
</item>
</layout>
</item>
</layout>
</widget>

Loading…
Cancel
Save