Add support for non-adaptive VSync (feature 7129)

update_gitlab_rules
Andrei Kortunov 2 years ago
parent 83d15ef786
commit be488649c3

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

@ -93,13 +93,18 @@ bool Launcher::GraphicsPage::loadSettings()
return false; return false;
// Visuals // 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")); size_t windowMode = static_cast<size_t>(Settings::Manager::getInt("window mode", "Video"));
if (windowMode > static_cast<size_t>(Settings::WindowMode::Windowed)) if (windowMode > static_cast<size_t>(Settings::WindowMode::Windowed))
windowMode = 0; windowMode = 0;
windowModeComboBox->setCurrentIndex(windowMode); windowModeComboBox->setCurrentIndex(windowMode);
slotFullScreenChanged(windowMode);
if (Settings::Manager::getBool("window border", "Video")) if (Settings::Manager::getBool("window border", "Video"))
windowBorderCheckBox->setCheckState(Qt::Checked); 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 // 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) // user settings file (which by definition should only contain settings the user has touched)
bool cVSync = vSyncCheckBox->checkState(); int cVSync = vSyncComboBox->currentIndex();
if (cVSync != Settings::Manager::getBool("vsync", "Video")) if (cVSync != Settings::Manager::getInt("vsync mode", "Video"))
Settings::Manager::setBool("vsync", "Video", cVSync); Settings::Manager::setInt("vsync mode", "Video", cVSync);
int cWindowMode = windowModeComboBox->currentIndex(); int cWindowMode = windowModeComboBox->currentIndex();
if (cWindowMode != Settings::Manager::getInt("window mode", "Video")) if (cWindowMode != Settings::Manager::getInt("window mode", "Video"))

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

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

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

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

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

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

@ -1,6 +1,7 @@
#include "sdlvideowrapper.hpp" #include "sdlvideowrapper.hpp"
#include <components/debug/debuglog.hpp> #include <components/debug/debuglog.hpp>
#include <components/sdlutil/sdlgraphicswindow.hpp>
#include <components/settings/settings.hpp> #include <components/settings/settings.hpp>
#include <osgViewer/Viewer> #include <osgViewer/Viewer>
@ -29,15 +30,24 @@ namespace SDLUtil
SDL_SetWindowGammaRamp(mWindow, mOldSystemGammaRamp, &mOldSystemGammaRamp[256], &mOldSystemGammaRamp[512]); 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; osgViewer::Viewer::Windows windows;
mViewer->getWindows(windows); mViewer->getWindows(windows);
mViewer->stopThreading(); mViewer->stopThreading();
for (osgViewer::Viewer::Windows::iterator it = windows.begin(); it != windows.end(); ++it) for (osgViewer::Viewer::Windows::iterator it = windows.begin(); it != windows.end(); ++it)
{ {
osgViewer::GraphicsWindow* win = *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(); mViewer->startThreading();
} }

@ -26,7 +26,7 @@ namespace SDLUtil
VideoWrapper(SDL_Window* window, osg::ref_ptr<osgViewer::Viewer> viewer); VideoWrapper(SDL_Window* window, osg::ref_ptr<osgViewer::Viewer> viewer);
~VideoWrapper(); ~VideoWrapper();
void setSyncToVBlank(bool sync); void setSyncToVBlank(int mode);
void setGammaContrast(float gamma, float contrast); 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 but cannot be changed during game play
due to a technical limitation that may be addressed in a future version of OpenMW. due to a technical limitation that may be addressed in a future version of OpenMW.
vsync vsync mode
----- ----------
:Type: boolean :Type: integer
:Range: True/False :Range: 0, 1, 2
:Default: False :Default: 0
This setting determines whether frame draws are synchronized with the vertical refresh rate of your monitor. This setting determines whether frame draws are synchronized with the vertical refresh rate of your monitor.
Enabling this setting can reduce screen tearing, Enabling this setting can reduce screen tearing,
a visual defect caused by updating the image buffer in the middle of a screen draw. 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 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'. (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. 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 check box in the Graphics tab of the OpenMW Launcher. It can also be changed by toggling the Vertical Sync combo box in the Graphics tab of the OpenMW Launcher.
framerate limit framerate limit
--------------- ---------------

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

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

@ -275,28 +275,28 @@
<Property key="ButtonAutoWidth" value="true"/> <Property key="ButtonAutoWidth" value="true"/>
<Widget type="TabItem"> <Widget type="TabItem">
<Property key="Caption" value=" #{sVideo} "/> <Property key="Caption" value=" #{sVideo} "/>
<Widget type="ListBox" skin="MW_List" position="0 4 185 225" align="Left Top" name="ResolutionList"/> <Widget type="ListBox" skin="MW_List" position="0 4 195 225" align="Left Top" name="ResolutionList"/>
<Widget type="TextBox" skin="NormalText" position="197 4 185 18" align="Left Top"> <Widget type="TextBox" skin="NormalText" position="207 4 250 18" align="Left Top">
<Property key="Caption" value="#{OMWEngine:WindowMode}"/> <Property key="Caption" value="#{OMWEngine:WindowMode}"/>
</Widget> </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"> <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:WindowModeFullscreen}"/>
<Property key="AddItem" value="#{OMWEngine:WindowModeWindowedFullscreen}"/> <Property key="AddItem" value="#{OMWEngine:WindowModeWindowedFullscreen}"/>
<Property key="AddItem" value="#{OMWEngine:WindowModeWindowed}"/> <Property key="AddItem" value="#{OMWEngine:WindowModeWindowed}"/>
</Widget> </Widget>
</Widget> </Widget>
<Widget type="HBox" position="197 58 400 28"> <Widget type="TextBox" skin="NormalText" position="207 54 250 18" align="Left Top">
<Widget type="AutoSizedButton" skin="MW_Button" position="0 0 24 24" align="Left Top" name="VSyncButton"> <Property key="Caption" value="#{OMWEngine:VSync}"/>
<UserString key="SettingCategory" value="Video"/> </Widget>
<UserString key="SettingName" value="vsync"/> <Widget type="HBox" position="207 74 400 28">
<UserString key="SettingType" value="CheckButton"/> <Widget type="ComboBox" skin="MW_ComboBox" position="0 0 200 24" align="Left Top" name="VSyncModeList">
</Widget> <Property key="AddItem" value="#{sOff}"/>
<Widget type="AutoSizedTextBox" skin="SandText" position="28 4 48 16" align="Left Top"> <Property key="AddItem" value="#{sOn}"/>
<Property key="Caption" value="#{OMWEngine:VSync}"/> <Property key="AddItem" value="#{OMWEngine:VSyncAdaptive}"/>
</Widget> </Widget>
</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"> <Widget type="AutoSizedButton" skin="MW_Button" position="0 0 24 24" align="Left Top" name="WindowBorderButton">
<UserString key="SettingCategory" value="Video"/> <UserString key="SettingCategory" value="Video"/>
<UserString key="SettingName" value="window border"/> <UserString key="SettingName" value="window border"/>
@ -306,7 +306,7 @@
<Property key="Caption" value="#{OMWEngine:WindowBorder}"/> <Property key="Caption" value="#{OMWEngine:WindowBorder}"/>
</Widget> </Widget>
</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"> <Widget type="AutoSizedButton" skin="MW_Button" position="0 0 24 24" align="Left Top" name="WindowBorderButton">
<UserString key="SettingCategory" value="Post Processing"/> <UserString key="SettingCategory" value="Post Processing"/>
<UserString key="SettingName" value="enabled"/> <UserString key="SettingName" value="enabled"/>
@ -320,11 +320,11 @@
</Widget> </Widget>
</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}"/> <Property key="Caption" value="#{OMWEngine:FrameRateHint}"/>
</Widget> </Widget>
<Widget type="AutoSizedTextBox" skin="SandText" position="197 196 300 32" align="Left Top" name="WindowModeHint"> <Widget type="AutoSizedTextBox" skin="SandText" position="207 216 300 32" align="Left Top" name="WindowModeHint">
<Property key="Caption" value="#{SettingsMenu:WindowModeHint}"/> <Property key="Caption" value="#{OMWEngine:WindowModeHint}"/>
</Widget> </Widget>
<Widget type="TextBox" skin="NormalText" position="0 238 352 18" align="Left Top" name="FovText"> <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). # Anti-aliasing reduces jagged polygon edges. (0, 2, 4, 8, 16).
antialiasing = 0 antialiasing = 0
# Enable vertical syncing to reduce tearing defects. # Vertical syncing to reduce tearing defects.
vsync = false # 0 = Off
# 1 = On
# 2 = Adaptive
vsync mode = 0
# Maximum frames per second. 0.0 is unlimited, or >0.0 to limit. # Maximum frames per second. 0.0 is unlimited, or >0.0 to limit.
framerate limit = 300 framerate limit = 300

@ -7,7 +7,7 @@
<x>0</x> <x>0</x>
<y>0</y> <y>0</y>
<width>650</width> <width>650</width>
<height>340</height> <height>358</height>
</rect> </rect>
</property> </property>
<layout class="QVBoxLayout" name="verticalLayout"> <layout class="QVBoxLayout" name="verticalLayout">
@ -22,190 +22,210 @@
</attribute> </attribute>
<layout class="QHBoxLayout" name="horizontalLayout_2"> <layout class="QHBoxLayout" name="horizontalLayout_2">
<item> <item>
<widget class="QWidget" name="DisplayWidget"> <layout class="QGridLayout" name="gridLayout_4" columnstretch="1,0">
<layout class="QGridLayout" name="gridLayout_4" columnstretch="1,0"> <item row="5" column="0">
<item row="3" column="0"> <widget class="QLabel" name="screenLabel">
<widget class="QLabel" name="antiAliasingLabel"> <property name="text">
<string>Screen:</string>
</property>
</widget>
</item>
<item row="4" column="1">
<widget class="QComboBox" name="antiAliasingComboBox">
<item>
<property name="text"> <property name="text">
<string>Anti-aliasing:</string> <string>0</string>
</property> </property>
</widget> </item>
</item> <item>
<item row="6" column="0">
<widget class="QCheckBox" name="framerateLimitCheckBox">
<property name="text"> <property name="text">
<string>Framerate Limit:</string> <string>2</string>
</property> </property>
</widget> </item>
</item> <item>
<item row="5" column="1"> <property name="text">
<layout class="QGridLayout" name="resolutionLayout"> <string>4</string>
<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>
</property> </property>
</widget> </item>
</item> <item>
<item row="1" column="0">
<widget class="QCheckBox" name="windowBorderCheckBox">
<property name="text"> <property name="text">
<string>Window Border</string> <string>8</string>
</property> </property>
</widget> </item>
</item> <item>
<item row="2" column="1"> <property name="text">
<widget class="QComboBox" name="windowModeComboBox"> <string>16</string>
<property name="currentIndex">
<number>0</number>
</property> </property>
<item> </item>
<property name="text"> </widget>
<string>Fullscreen</string> </item>
</property> <item row="5" column="1">
</item> <widget class="QComboBox" name="screenComboBox"/>
<item> </item>
<property name="text"> <item row="3" column="0">
<string>Windowed Fullscreen</string> <widget class="QLabel" name="windowModeLabel">
</property> <property name="text">
</item> <string>Window Mode:</string>
<item> </property>
<property name="text"> </widget>
<string>Windowed</string> </item>
</property> <item row="6" column="0">
</item> <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> </widget>
</item> </item>
<item row="2" column="0"> <item row="0" column="1">
<widget class="QLabel" name="windowModeLabel"> <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"> <property name="text">
<string>Window Mode:</string> <string>Fullscreen</string>
</property> </property>
</widget> </item>
</item> <item>
<item row="5" column="0">
<widget class="QLabel" name="resolutionLabel">
<property name="text"> <property name="text">
<string>Resolution:</string> <string>Windowed Fullscreen</string>
</property> </property>
<property name="alignment"> </item>
<set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop</set> <item>
<property name="text">
<string>Windowed</string>
</property> </property>
</widget> </item>
</item> </widget>
<item row="4" column="1"> </item>
<widget class="QComboBox" name="screenComboBox"/> <item row="0" column="0">
</item> <widget class="QCheckBox" name="windowBorderCheckBox">
<item row="4" column="0"> <property name="text">
<widget class="QLabel" name="screenLabel"> <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"> <property name="text">
<string>Screen:</string> <string>Disabled</string>
</property> </property>
</widget> </item>
</item> <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">
<property name="text"> <property name="text">
<string>Vertical Sync</string> <string>Enabled</string>
</property> </property>
</widget> </item>
</item> <item>
</layout> <property name="text">
</widget> <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> </item>
</layout> </layout>
</widget> </widget>
@ -265,192 +285,182 @@
</attribute> </attribute>
<layout class="QHBoxLayout" name="horizontalLayout"> <layout class="QHBoxLayout" name="horizontalLayout">
<item> <item>
<widget class="QWidget" name="ShadowWidget"> <layout class="QGridLayout" name="shadowsLayout" columnstretch="0,0">
<property name="sizePolicy"> <item row="0" column="0">
<sizepolicy hsizetype="Preferred" vsizetype="Preferred"> <widget class="QCheckBox" name="playerShadowsCheckBox">
<horstretch>1</horstretch> <property name="toolTip">
<verstretch>1</verstretch> <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>
</sizepolicy> </property>
</property> <property name="text">
<layout class="QGridLayout" name="shadowsLayout" columnstretch="0,0"> <string>Enable Player Shadows</string>
</property>
<item row="0" column="0"> </widget>
<widget class="QCheckBox" name="playerShadowsCheckBox"> </item>
<property name="toolTip"> <item row="1" column="0">
<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> <widget class="QCheckBox" name="actorShadowsCheckBox">
</property> <property name="toolTip">
<property name="text"> <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>
<string>Enable Player Shadows</string> </property>
</property> <property name="text">
</widget> <string>Enable Actor Shadows</string>
</item> </property>
<item row="1" column="0"> </widget>
<widget class="QCheckBox" name="actorShadowsCheckBox"> </item>
<property name="toolTip"> <item row="2" column="0">
<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> <widget class="QCheckBox" name="objectShadowsCheckBox">
</property> <property name="toolTip">
<property name="text"> <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>
<string>Enable Actor Shadows</string> </property>
</property> <property name="text">
</widget> <string>Enable Object Shadows</string>
</item> </property>
<item row="2" column="0"> </widget>
<widget class="QCheckBox" name="objectShadowsCheckBox"> </item>
<property name="toolTip"> <item row="3" column="0">
<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> <widget class="QCheckBox" name="terrainShadowsCheckBox">
</property> <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"> <property name="text">
<string>Enable Object Shadows</string> <string>bounds</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>
</item>
<item>
<property name="text"> <property name="text">
<string>Enable Terrain Shadows</string> <string>primitives</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>
</item>
<item>
<property name="text"> <property name="text">
<string>Enable Indoor Shadows</string> <string>none</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>
</property> </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"> <property name="text">
<string>Shadow Near Far Computation Method:</string> <string>512</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>
</property> </property>
</item>
<item>
<property name="text"> <property name="text">
<string>Shadow Map Resolution:</string> <string>1024</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>
</property> </property>
</item>
<item>
<property name="text"> <property name="text">
<string>Shadow Distance Limit:</string> <string>2048</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>
</item>
<item>
<property name="text"> <property name="text">
<string>Fade Start Multiplier:</string> <string>4096</string>
</property> </property>
</widget> </item>
</item> </widget>
<item row="8" column="1"> </item>
<widget class="QDoubleSpinBox" name="fadeStartSpinBox"> <item row="7" column="0">
<property name="enabled"> <widget class="QCheckBox" name="shadowDistanceCheckBox">
<bool>false</bool> <property name="toolTip">
</property> <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 name="decimals"> </property>
<number>2</number> <property name="text">
</property> <string>Shadow Distance Limit:</string>
<property name="minimum"> </property>
<double>0</double> </widget>
</property> </item>
<property name="maximum"> <item row="7" column="1">
<double>1</double> <widget class="QSpinBox" name="shadowDistanceSpinBox">
</property> <property name="enabled">
<property name="value"> <bool>false</bool>
<double>0.90</double> </property>
</property> <property name="toolTip">
</widget> <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>
</item> </property>
<property name="suffix">
</layout> <string> unit(s)</string>
</widget> </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> </item>
</layout> </layout>
</widget> </widget>

Loading…
Cancel
Save