mirror of
https://github.com/OpenMW/openmw.git
synced 2025-01-19 19:53:53 +00:00
Apply video mode & gamma setting changes
This commit is contained in:
parent
3e86dd7df0
commit
5442bf23a6
7 changed files with 182 additions and 5 deletions
|
@ -14,6 +14,7 @@
|
||||||
#include <SDL_version.h>
|
#include <SDL_version.h>
|
||||||
|
|
||||||
#include <components/sdlutil/sdlinputwrapper.hpp>
|
#include <components/sdlutil/sdlinputwrapper.hpp>
|
||||||
|
#include <components/sdlutil/sdlvideowrapper.hpp>
|
||||||
|
|
||||||
#include "../engine.hpp"
|
#include "../engine.hpp"
|
||||||
|
|
||||||
|
@ -101,10 +102,13 @@ namespace MWInput
|
||||||
OMW::Engine& engine,
|
OMW::Engine& engine,
|
||||||
const std::string& userFile, bool userFileExists,
|
const std::string& userFile, bool userFileExists,
|
||||||
const std::string& controllerBindingsFile, bool grab)
|
const std::string& controllerBindingsFile, bool grab)
|
||||||
: mJoystickLastUsed(false)
|
: mWindow(window)
|
||||||
|
, mViewer(viewer)
|
||||||
|
, mJoystickLastUsed(false)
|
||||||
, mPlayer(NULL)
|
, mPlayer(NULL)
|
||||||
, mEngine(engine)
|
, mEngine(engine)
|
||||||
, mInputManager(NULL)
|
, mInputManager(NULL)
|
||||||
|
, mVideoWrapper(NULL)
|
||||||
, mUserFile(userFile)
|
, mUserFile(userFile)
|
||||||
, mDragDrop(false)
|
, mDragDrop(false)
|
||||||
, mGrabCursor (Settings::Manager::getBool("grab cursor", "Input"))
|
, mGrabCursor (Settings::Manager::getBool("grab cursor", "Input"))
|
||||||
|
@ -141,6 +145,10 @@ namespace MWInput
|
||||||
mInputManager->setWindowEventCallback(this);
|
mInputManager->setWindowEventCallback(this);
|
||||||
mInputManager->setControllerEventCallback(this);
|
mInputManager->setControllerEventCallback(this);
|
||||||
|
|
||||||
|
mVideoWrapper = new SDLUtil::VideoWrapper(window, viewer);
|
||||||
|
mVideoWrapper->setGammaContrast(Settings::Manager::getFloat("gamma", "Video"),
|
||||||
|
Settings::Manager::getFloat("contrast", "Video"));
|
||||||
|
|
||||||
std::string file = userFileExists ? userFile : "";
|
std::string file = userFileExists ? userFile : "";
|
||||||
mInputBinder = new ICS::InputControlSystem(file, true, this, NULL, A_Last);
|
mInputBinder = new ICS::InputControlSystem(file, true, this, NULL, A_Last);
|
||||||
|
|
||||||
|
@ -201,6 +209,8 @@ namespace MWInput
|
||||||
delete mInputBinder;
|
delete mInputBinder;
|
||||||
|
|
||||||
delete mInputManager;
|
delete mInputManager;
|
||||||
|
|
||||||
|
delete mVideoWrapper;
|
||||||
}
|
}
|
||||||
|
|
||||||
void InputManager::setPlayerControlsEnabled(bool enabled)
|
void InputManager::setPlayerControlsEnabled(bool enabled)
|
||||||
|
@ -614,6 +624,8 @@ namespace MWInput
|
||||||
|
|
||||||
void InputManager::processChangedSettings(const Settings::CategorySettingVector& changed)
|
void InputManager::processChangedSettings(const Settings::CategorySettingVector& changed)
|
||||||
{
|
{
|
||||||
|
bool changeRes = false;
|
||||||
|
|
||||||
for (Settings::CategorySettingVector::const_iterator it = changed.begin();
|
for (Settings::CategorySettingVector::const_iterator it = changed.begin();
|
||||||
it != changed.end(); ++it)
|
it != changed.end(); ++it)
|
||||||
{
|
{
|
||||||
|
@ -629,6 +641,27 @@ namespace MWInput
|
||||||
if (it->first == "Input" && it->second == "grab cursor")
|
if (it->first == "Input" && it->second == "grab cursor")
|
||||||
mGrabCursor = Settings::Manager::getBool("grab cursor", "Input");
|
mGrabCursor = Settings::Manager::getBool("grab cursor", "Input");
|
||||||
|
|
||||||
|
if (it->first == "Video" && (
|
||||||
|
it->second == "resolution x"
|
||||||
|
|| it->second == "resolution y"
|
||||||
|
|| it->second == "fullscreen"
|
||||||
|
|| it->second == "window border"))
|
||||||
|
changeRes = true;
|
||||||
|
|
||||||
|
if (it->first == "Video" && it->second == "vsync")
|
||||||
|
mVideoWrapper->setSyncToVBlank(Settings::Manager::getBool("vsync", "Video"));
|
||||||
|
|
||||||
|
if (it->first == "Video" && (it->second == "gamma" || it->second == "contrast"))
|
||||||
|
mVideoWrapper->setGammaContrast(Settings::Manager::getFloat("gamma", "Video"),
|
||||||
|
Settings::Manager::getFloat("contrast", "Video"));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (changeRes)
|
||||||
|
{
|
||||||
|
mVideoWrapper->setVideoMode(Settings::Manager::getInt("resolution x", "Video"),
|
||||||
|
Settings::Manager::getInt("resolution y", "Video"),
|
||||||
|
Settings::Manager::getBool("fullscreen", "Video"),
|
||||||
|
Settings::Manager::getBool("window border", "Video"));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -48,6 +48,7 @@ namespace Files
|
||||||
namespace SDLUtil
|
namespace SDLUtil
|
||||||
{
|
{
|
||||||
class InputWrapper;
|
class InputWrapper;
|
||||||
|
class VideoWrapper;
|
||||||
}
|
}
|
||||||
|
|
||||||
namespace osgViewer
|
namespace osgViewer
|
||||||
|
@ -151,6 +152,9 @@ namespace MWInput
|
||||||
void clearAllControllerBindings (ICS::Control* control);
|
void clearAllControllerBindings (ICS::Control* control);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
SDL_Window* mWindow;
|
||||||
|
osg::ref_ptr<osgViewer::Viewer> mViewer;
|
||||||
|
|
||||||
bool mJoystickLastUsed;
|
bool mJoystickLastUsed;
|
||||||
MWWorld::Player* mPlayer;
|
MWWorld::Player* mPlayer;
|
||||||
OMW::Engine& mEngine;
|
OMW::Engine& mEngine;
|
||||||
|
@ -158,6 +162,7 @@ namespace MWInput
|
||||||
ICS::InputControlSystem* mInputBinder;
|
ICS::InputControlSystem* mInputBinder;
|
||||||
|
|
||||||
SDLUtil::InputWrapper* mInputManager;
|
SDLUtil::InputWrapper* mInputManager;
|
||||||
|
SDLUtil::VideoWrapper* mVideoWrapper;
|
||||||
|
|
||||||
std::string mUserFile;
|
std::string mUserFile;
|
||||||
|
|
||||||
|
|
|
@ -127,7 +127,7 @@ add_component_dir (fontloader
|
||||||
)
|
)
|
||||||
|
|
||||||
add_component_dir (sdlutil
|
add_component_dir (sdlutil
|
||||||
sdlgraphicswindow imagetosurface sdlinputwrapper OISCompat events sdlcursormanager
|
sdlgraphicswindow imagetosurface sdlinputwrapper sdlvideowrapper OISCompat events sdlcursormanager
|
||||||
)
|
)
|
||||||
|
|
||||||
add_component_dir (version
|
add_component_dir (version
|
||||||
|
|
94
components/sdlutil/sdlvideowrapper.cpp
Normal file
94
components/sdlutil/sdlvideowrapper.cpp
Normal file
|
@ -0,0 +1,94 @@
|
||||||
|
#include "sdlvideowrapper.hpp"
|
||||||
|
|
||||||
|
#include <iostream>
|
||||||
|
|
||||||
|
#include <osgViewer/Viewer>
|
||||||
|
|
||||||
|
#include <SDL_video.h>
|
||||||
|
|
||||||
|
namespace SDLUtil
|
||||||
|
{
|
||||||
|
|
||||||
|
VideoWrapper::VideoWrapper(SDL_Window *window, osg::ref_ptr<osgViewer::Viewer> viewer)
|
||||||
|
: mWindow(window)
|
||||||
|
, mViewer(viewer)
|
||||||
|
, mGamma(1.f)
|
||||||
|
, mContrast(1.f)
|
||||||
|
, mHasSetGammaContrast(false)
|
||||||
|
{
|
||||||
|
SDL_GetWindowGammaRamp(mWindow, mOldSystemGammaRamp, &mOldSystemGammaRamp[256], &mOldSystemGammaRamp[512]);
|
||||||
|
}
|
||||||
|
|
||||||
|
VideoWrapper::~VideoWrapper()
|
||||||
|
{
|
||||||
|
SDL_SetWindowFullscreen(mWindow, 0);
|
||||||
|
|
||||||
|
// If user hasn't touched the defaults no need to restore
|
||||||
|
if (mHasSetGammaContrast)
|
||||||
|
SDL_SetWindowGammaRamp(mWindow, mOldSystemGammaRamp, &mOldSystemGammaRamp[256], &mOldSystemGammaRamp[512]);
|
||||||
|
}
|
||||||
|
|
||||||
|
void VideoWrapper::setSyncToVBlank(bool sync)
|
||||||
|
{
|
||||||
|
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);
|
||||||
|
}
|
||||||
|
mViewer->startThreading();
|
||||||
|
}
|
||||||
|
|
||||||
|
void VideoWrapper::setGammaContrast(float gamma, float contrast)
|
||||||
|
{
|
||||||
|
if (gamma == mGamma && contrast == mContrast)
|
||||||
|
return;
|
||||||
|
|
||||||
|
mGamma = gamma;
|
||||||
|
mContrast = contrast;
|
||||||
|
|
||||||
|
mHasSetGammaContrast = true;
|
||||||
|
|
||||||
|
Uint16 red[256], green[256], blue[256];
|
||||||
|
for (int i = 0; i < 256; i++)
|
||||||
|
{
|
||||||
|
float k = i/256.0f;
|
||||||
|
k = (k - 0.5f) * contrast + 0.5f;
|
||||||
|
k = pow(k, 1.f/gamma);
|
||||||
|
k *= 256;
|
||||||
|
float value = k*256;
|
||||||
|
if (value > 65535) value = 65535;
|
||||||
|
else if (value < 0) value = 0;
|
||||||
|
|
||||||
|
red[i] = green[i] = blue[i] = static_cast<Uint16>(value);
|
||||||
|
}
|
||||||
|
if (SDL_SetWindowGammaRamp(mWindow, red, green, blue) < 0)
|
||||||
|
std::cout << "Couldn't set gamma: " << SDL_GetError() << std::endl;
|
||||||
|
}
|
||||||
|
|
||||||
|
void VideoWrapper::setVideoMode(int width, int height, bool fullscreen, bool windowBorder)
|
||||||
|
{
|
||||||
|
SDL_SetWindowFullscreen(mWindow, 0);
|
||||||
|
|
||||||
|
if (SDL_GetWindowFlags(mWindow) & SDL_WINDOW_MAXIMIZED)
|
||||||
|
SDL_RestoreWindow(mWindow);
|
||||||
|
|
||||||
|
if (fullscreen)
|
||||||
|
{
|
||||||
|
SDL_DisplayMode mode;
|
||||||
|
SDL_GetWindowDisplayMode(mWindow, &mode);
|
||||||
|
mode.w = width;
|
||||||
|
mode.h = height;
|
||||||
|
SDL_SetWindowDisplayMode(mWindow, &mode);
|
||||||
|
SDL_SetWindowFullscreen(mWindow, fullscreen);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
SDL_SetWindowSize(mWindow, width, height);
|
||||||
|
SDL_SetWindowBordered(mWindow, windowBorder ? SDL_TRUE : SDL_FALSE);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
44
components/sdlutil/sdlvideowrapper.hpp
Normal file
44
components/sdlutil/sdlvideowrapper.hpp
Normal file
|
@ -0,0 +1,44 @@
|
||||||
|
#ifndef OPENMW_COMPONENTS_SDLUTIL_SDLVIDEOWRAPPER_H
|
||||||
|
#define OPENMW_COMPONENTS_SDLUTIL_SDLVIDEOWRAPPER_H
|
||||||
|
|
||||||
|
#include <osg/ref_ptr>
|
||||||
|
|
||||||
|
#include <SDL_types.h>
|
||||||
|
|
||||||
|
struct SDL_Window;
|
||||||
|
|
||||||
|
namespace osgViewer
|
||||||
|
{
|
||||||
|
class Viewer;
|
||||||
|
}
|
||||||
|
|
||||||
|
namespace SDLUtil
|
||||||
|
{
|
||||||
|
|
||||||
|
class VideoWrapper
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
VideoWrapper(SDL_Window* window, osg::ref_ptr<osgViewer::Viewer> viewer);
|
||||||
|
~VideoWrapper();
|
||||||
|
|
||||||
|
void setSyncToVBlank(bool sync);
|
||||||
|
|
||||||
|
void setGammaContrast(float gamma, float contrast);
|
||||||
|
|
||||||
|
void setVideoMode(int width, int height, bool fullscreen, bool windowBorder);
|
||||||
|
|
||||||
|
private:
|
||||||
|
SDL_Window* mWindow;
|
||||||
|
osg::ref_ptr<osgViewer::Viewer> mViewer;
|
||||||
|
|
||||||
|
float mGamma;
|
||||||
|
float mContrast;
|
||||||
|
bool mHasSetGammaContrast;
|
||||||
|
|
||||||
|
// Store system gamma ramp on window creation. Restore system gamma ramp on exit
|
||||||
|
Uint16 mOldSystemGammaRamp[256*3];
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
|
@ -299,7 +299,7 @@
|
||||||
<Property key="Range" value="10000"/>
|
<Property key="Range" value="10000"/>
|
||||||
<Property key="Page" value="300"/>
|
<Property key="Page" value="300"/>
|
||||||
<UserString key="SettingType" value="Slider"/>
|
<UserString key="SettingType" value="Slider"/>
|
||||||
<UserString key="SettingCategory" value="General"/>
|
<UserString key="SettingCategory" value="Video"/>
|
||||||
<UserString key="SettingName" value="gamma"/>
|
<UserString key="SettingName" value="gamma"/>
|
||||||
<UserString key="SettingValueType" value="Float"/>
|
<UserString key="SettingValueType" value="Float"/>
|
||||||
<UserString key="SettingMin" value="0.1"/>
|
<UserString key="SettingMin" value="0.1"/>
|
||||||
|
|
|
@ -26,6 +26,9 @@ vsync = false
|
||||||
# PBuffer, FBO, Copy
|
# PBuffer, FBO, Copy
|
||||||
opengl rtt mode = FBO
|
opengl rtt mode = FBO
|
||||||
|
|
||||||
|
gamma = 1.00
|
||||||
|
contrast = 1.00
|
||||||
|
|
||||||
[GUI]
|
[GUI]
|
||||||
# 1 is fully opaque
|
# 1 is fully opaque
|
||||||
menu transparency = 0.84
|
menu transparency = 0.84
|
||||||
|
@ -43,8 +46,6 @@ stretch menu background = false
|
||||||
[General]
|
[General]
|
||||||
# Camera field of view
|
# Camera field of view
|
||||||
field of view = 55
|
field of view = 55
|
||||||
gamma = 1.00
|
|
||||||
contrast = 1.00
|
|
||||||
|
|
||||||
# Texture filtering mode. valid values:
|
# Texture filtering mode. valid values:
|
||||||
# none
|
# none
|
||||||
|
|
Loading…
Reference in a new issue