mirror of
https://github.com/TES3MP/openmw-tes3mp.git
synced 2025-01-30 03:15:32 +00:00
Move video wrapper to the WindowsManager
This commit is contained in:
parent
13b7c5b519
commit
f990150c49
9 changed files with 84 additions and 104 deletions
|
@ -96,7 +96,7 @@ bool OMW::Engine::frame(float frametime)
|
|||
// When the window is minimized, pause the game. Currently this *has* to be here to work around a MyGUI bug.
|
||||
// If we are not currently rendering, then RenderItems will not be reused resulting in a memory leak upon changing widget textures (fixed in MyGUI 3.3.2),
|
||||
// and destroyed widgets will not be deleted (not fixed yet, https://github.com/MyGUI/mygui/issues/21)
|
||||
if (!mEnvironment.getInputManager()->isWindowVisible())
|
||||
if (!mEnvironment.getWindowManager()->isWindowVisible())
|
||||
{
|
||||
mEnvironment.getSoundManager()->pausePlayback();
|
||||
return false;
|
||||
|
@ -532,20 +532,20 @@ void OMW::Engine::prepareEngine (Settings::Manager & settings)
|
|||
else
|
||||
gameControllerdb = ""; //if it doesn't exist, pass in an empty string
|
||||
|
||||
MWInput::InputManager* input = new MWInput::InputManager (mWindow, mViewer, mScreenCaptureHandler, mScreenCaptureOperation, keybinderUser, keybinderUserExists, userGameControllerdb, gameControllerdb, mGrab);
|
||||
mEnvironment.setInputManager (input);
|
||||
|
||||
std::string myguiResources = (mResDir / "mygui").string();
|
||||
osg::ref_ptr<osg::Group> guiRoot = new osg::Group;
|
||||
guiRoot->setName("GUI Root");
|
||||
guiRoot->setNodeMask(MWRender::Mask_GUI);
|
||||
rootNode->addChild(guiRoot);
|
||||
MWGui::WindowManager* window = new MWGui::WindowManager(mViewer, guiRoot, mResourceSystem.get(), mWorkQueue.get(),
|
||||
MWGui::WindowManager* window = new MWGui::WindowManager(mWindow, mViewer, guiRoot, mResourceSystem.get(), mWorkQueue.get(),
|
||||
mCfgMgr.getLogPath().string() + std::string("/"), myguiResources,
|
||||
mScriptConsoleMode, mTranslationDataStorage, mEncoding, mExportFonts,
|
||||
Version::getOpenmwVersionDescription(mResDir.string()), mCfgMgr.getUserConfigPath().string());
|
||||
mEnvironment.setWindowManager (window);
|
||||
|
||||
MWInput::InputManager* input = new MWInput::InputManager (mWindow, mViewer, mScreenCaptureHandler, mScreenCaptureOperation, keybinderUser, keybinderUserExists, userGameControllerdb, gameControllerdb, mGrab);
|
||||
mEnvironment.setInputManager (input);
|
||||
|
||||
// Create sound system
|
||||
mEnvironment.setSoundManager (new MWSound::SoundManager(mVFS.get(), mUseSound));
|
||||
|
||||
|
|
|
@ -38,8 +38,6 @@ namespace MWBase
|
|||
|
||||
virtual ~InputManager() {}
|
||||
|
||||
virtual bool isWindowVisible() = 0;
|
||||
|
||||
virtual void update(float dt, bool disableControls, bool disableEvents=false) = 0;
|
||||
|
||||
virtual void changeInputMode(bool guiMode) = 0;
|
||||
|
|
|
@ -11,6 +11,8 @@
|
|||
|
||||
#include "../mwgui/mode.hpp"
|
||||
|
||||
#include <components/sdlutil/events.hpp>
|
||||
|
||||
namespace Loading
|
||||
{
|
||||
class Listener;
|
||||
|
@ -86,7 +88,7 @@ namespace SFO
|
|||
namespace MWBase
|
||||
{
|
||||
/// \brief Interface for widnow manager (implemented in MWGui)
|
||||
class WindowManager
|
||||
class WindowManager : public SDLUtil::WindowListener
|
||||
{
|
||||
WindowManager (const WindowManager&);
|
||||
///< not implemented
|
||||
|
@ -268,8 +270,6 @@ namespace MWBase
|
|||
|
||||
virtual void processChangedSettings(const std::set< std::pair<std::string, std::string> >& changed) = 0;
|
||||
|
||||
virtual void windowResized(int x, int y) = 0;
|
||||
|
||||
virtual void executeInConsole (const std::string& path) = 0;
|
||||
|
||||
virtual void enableRest() = 0;
|
||||
|
@ -360,6 +360,11 @@ namespace MWBase
|
|||
|
||||
virtual bool injectKeyPress(MyGUI::KeyCode key, unsigned int text, bool repeat) = 0;
|
||||
virtual bool injectKeyRelease(MyGUI::KeyCode key) = 0;
|
||||
|
||||
virtual void windowVisibilityChange(bool visible) = 0;
|
||||
virtual void windowResized(int x, int y) = 0;
|
||||
virtual void windowClosed() = 0;
|
||||
virtual bool isWindowVisible() = 0;
|
||||
};
|
||||
}
|
||||
|
||||
|
|
|
@ -21,6 +21,7 @@
|
|||
#include <components/debug/debuglog.hpp>
|
||||
|
||||
#include <components/sdlutil/sdlcursormanager.hpp>
|
||||
#include <components/sdlutil/sdlvideowrapper.hpp>
|
||||
|
||||
#include <components/esm/esmreader.hpp>
|
||||
#include <components/esm/esmwriter.hpp>
|
||||
|
@ -127,7 +128,7 @@ namespace MWGui
|
|||
{
|
||||
|
||||
WindowManager::WindowManager(
|
||||
osgViewer::Viewer* viewer, osg::Group* guiRoot, Resource::ResourceSystem* resourceSystem, SceneUtil::WorkQueue* workQueue,
|
||||
SDL_Window* window, osgViewer::Viewer* viewer, osg::Group* guiRoot, Resource::ResourceSystem* resourceSystem, SceneUtil::WorkQueue* workQueue,
|
||||
const std::string& logpath, const std::string& resourcePath, bool consoleOnlyScripts, Translation::Storage& translationDataStorage,
|
||||
ToUTF8::FromType encoding, bool exportFonts, const std::string& versionDescription, const std::string& userDataPath)
|
||||
: mOldUpdateMask(0)
|
||||
|
@ -196,6 +197,7 @@ namespace MWGui
|
|||
, mEncoding(encoding)
|
||||
, mFontHeight(16)
|
||||
, mVersionDescription(versionDescription)
|
||||
, mWindowVisible(true)
|
||||
{
|
||||
float uiScale = Settings::Manager::getFloat("scaling factor", "GUI");
|
||||
mGuiPlatform = new osgMyGUI::Platform(viewer, guiRoot, resourceSystem->getImageManager(), uiScale);
|
||||
|
@ -288,6 +290,10 @@ namespace MWGui
|
|||
MyGUI::ClipboardManager::getInstance().eventClipboardRequested += MyGUI::newDelegate(this, &WindowManager::onClipboardRequested);
|
||||
|
||||
mShowOwned = Settings::Manager::getInt("show owned", "Game");
|
||||
|
||||
mVideoWrapper = new SDLUtil::VideoWrapper(window, viewer);
|
||||
mVideoWrapper->setGammaContrast(Settings::Manager::getFloat("gamma", "Video"),
|
||||
Settings::Manager::getFloat("contrast", "Video"));
|
||||
}
|
||||
|
||||
void WindowManager::loadFontDelegate(MyGUI::xml::ElementPtr _node, const std::string& _file, MyGUI::Version _version)
|
||||
|
@ -653,6 +659,7 @@ namespace MWGui
|
|||
|
||||
mGuiPlatform->shutdown();
|
||||
delete mGuiPlatform;
|
||||
delete mVideoWrapper;
|
||||
}
|
||||
catch(const MyGUI::Exception& e)
|
||||
{
|
||||
|
@ -916,7 +923,7 @@ namespace MWGui
|
|||
mMessageBoxManager->onFrame(dt);
|
||||
MWBase::Environment::get().getInputManager()->update(dt, true, false);
|
||||
|
||||
if (!MWBase::Environment::get().getInputManager()->isWindowVisible())
|
||||
if (!mWindowVisible)
|
||||
OpenThreads::Thread::microSleep(5000);
|
||||
else
|
||||
{
|
||||
|
@ -1241,6 +1248,7 @@ namespace MWGui
|
|||
{
|
||||
mToolTips->setDelay(Settings::Manager::getFloat("tooltip delay", "GUI"));
|
||||
|
||||
bool changeRes = false;
|
||||
for (const auto& setting : changed)
|
||||
{
|
||||
if (setting.first == "HUD" && setting.second == "crosshair")
|
||||
|
@ -1249,11 +1257,38 @@ namespace MWGui
|
|||
mSubtitlesEnabled = Settings::Manager::getBool ("subtitles", "GUI");
|
||||
else if (setting.first == "GUI" && setting.second == "menu transparency")
|
||||
setMenuTransparency(Settings::Manager::getFloat("menu transparency", "GUI"));
|
||||
else if (setting.first == "Video" && (
|
||||
setting.second == "resolution x"
|
||||
|| setting.second == "resolution y"
|
||||
|| setting.second == "fullscreen"
|
||||
|| 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 == "gamma" || setting.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"));
|
||||
}
|
||||
}
|
||||
|
||||
void WindowManager::windowResized(int x, int y)
|
||||
{
|
||||
// Note: this is a side effect of resolution change or window resize.
|
||||
// There is no need to track these changes.
|
||||
Settings::Manager::setInt("resolution x", "Video", x);
|
||||
Settings::Manager::setInt("resolution y", "Video", y);
|
||||
Settings::Manager::resetPendingChange("resolution x", "Video");
|
||||
Settings::Manager::resetPendingChange("resolution y", "Video");
|
||||
|
||||
mGuiPlatform->getRenderManagerPtr()->setViewSize(x, y);
|
||||
|
||||
// scaled size
|
||||
|
@ -1283,9 +1318,27 @@ namespace MWGui
|
|||
for (WindowBase* window : mWindows)
|
||||
window->onResChange(x, y);
|
||||
|
||||
// We should reload TrueType fonts to fit new resolution
|
||||
loadUserFonts();
|
||||
|
||||
// TODO: check if any windows are now off-screen and move them back if so
|
||||
}
|
||||
|
||||
bool WindowManager::isWindowVisible()
|
||||
{
|
||||
return mWindowVisible;
|
||||
}
|
||||
|
||||
void WindowManager::windowVisibilityChange(bool visible)
|
||||
{
|
||||
mWindowVisible = visible;
|
||||
}
|
||||
|
||||
void WindowManager::windowClosed()
|
||||
{
|
||||
MWBase::Environment::get().getStateManager()->requestQuit();
|
||||
}
|
||||
|
||||
void WindowManager::onCursorChange(const std::string &name)
|
||||
{
|
||||
mCursorManager->cursorChanged(name);
|
||||
|
@ -1925,7 +1978,7 @@ namespace MWGui
|
|||
|
||||
MWBase::Environment::get().getInputManager()->update(dt, true, false);
|
||||
|
||||
if (!MWBase::Environment::get().getInputManager()->isWindowVisible())
|
||||
if (!mWindowVisible)
|
||||
{
|
||||
mVideoWidget->pause();
|
||||
OpenThreads::Thread::microSleep(5000);
|
||||
|
|
|
@ -15,6 +15,7 @@
|
|||
|
||||
#include "../mwworld/ptr.hpp"
|
||||
|
||||
#include <components/sdlutil/events.hpp>
|
||||
#include <components/settings/settings.hpp>
|
||||
#include <components/to_utf8/to_utf8.hpp>
|
||||
|
||||
|
@ -70,6 +71,7 @@ namespace SceneUtil
|
|||
namespace SDLUtil
|
||||
{
|
||||
class SDLCursorManager;
|
||||
class VideoWrapper;
|
||||
}
|
||||
|
||||
namespace osgMyGUI
|
||||
|
@ -124,13 +126,14 @@ namespace MWGui
|
|||
class JailScreen;
|
||||
class KeyboardNavigation;
|
||||
|
||||
class WindowManager : public MWBase::WindowManager
|
||||
class WindowManager :
|
||||
public MWBase::WindowManager
|
||||
{
|
||||
public:
|
||||
typedef std::pair<std::string, int> Faction;
|
||||
typedef std::vector<Faction> FactionList;
|
||||
|
||||
WindowManager(osgViewer::Viewer* viewer, osg::Group* guiRoot, Resource::ResourceSystem* resourceSystem, SceneUtil::WorkQueue* workQueue,
|
||||
WindowManager(SDL_Window* window, osgViewer::Viewer* viewer, osg::Group* guiRoot, Resource::ResourceSystem* resourceSystem, SceneUtil::WorkQueue* workQueue,
|
||||
const std::string& logpath, const std::string& cacheDir, bool consoleOnlyScripts, Translation::Storage& translationDataStorage,
|
||||
ToUTF8::FromType encoding, bool exportFonts, const std::string& versionDescription, const std::string& localPath);
|
||||
virtual ~WindowManager();
|
||||
|
@ -296,7 +299,10 @@ namespace MWGui
|
|||
|
||||
virtual void processChangedSettings(const Settings::CategorySettingVector& changed);
|
||||
|
||||
virtual void windowVisibilityChange(bool visible);
|
||||
virtual void windowResized(int x, int y);
|
||||
virtual void windowClosed();
|
||||
virtual bool isWindowVisible();
|
||||
|
||||
virtual void executeInConsole (const std::string& path);
|
||||
|
||||
|
@ -529,10 +535,14 @@ namespace MWGui
|
|||
|
||||
std::string mVersionDescription;
|
||||
|
||||
bool mWindowVisible;
|
||||
|
||||
MWGui::TextColours mTextColours;
|
||||
|
||||
std::unique_ptr<KeyboardNavigation> mKeyboardNavigation;
|
||||
|
||||
SDLUtil::VideoWrapper* mVideoWrapper;
|
||||
|
||||
/**
|
||||
* Called when MyGUI tries to retrieve a tag's value. Tags must be denoted in #{tag} notation and will be replaced upon setting a user visible text/property.
|
||||
* Supported syntax:
|
||||
|
|
|
@ -11,7 +11,6 @@
|
|||
|
||||
#include <components/debug/debuglog.hpp>
|
||||
#include <components/sdlutil/sdlinputwrapper.hpp>
|
||||
#include <components/sdlutil/sdlvideowrapper.hpp>
|
||||
#include <components/esm/esmwriter.hpp>
|
||||
#include <components/esm/esmreader.hpp>
|
||||
#include <components/esm/controlsstate.hpp>
|
||||
|
@ -46,8 +45,7 @@ namespace MWInput
|
|||
osgViewer::ScreenCaptureHandler::CaptureOperation *screenCaptureOperation,
|
||||
const std::string& userFile, bool userFileExists, const std::string& userControllerBindingsFile,
|
||||
const std::string& controllerBindingsFile, bool grab)
|
||||
: mWindowVisible(true)
|
||||
, mUserFile(userFile)
|
||||
: mUserFile(userFile)
|
||||
, mDragDrop(false)
|
||||
, mGrabCursor(Settings::Manager::getBool("grab cursor", "Input"))
|
||||
, mGuiCursorEnabled(true)
|
||||
|
@ -55,11 +53,7 @@ namespace MWInput
|
|||
, mFakeDeviceID(1)
|
||||
{
|
||||
mInputWrapper = new SDLUtil::InputWrapper(window, viewer, grab);
|
||||
mInputWrapper->setWindowEventCallback(this);
|
||||
|
||||
mVideoWrapper = new SDLUtil::VideoWrapper(window, viewer);
|
||||
mVideoWrapper->setGammaContrast(Settings::Manager::getFloat("gamma", "Video"),
|
||||
Settings::Manager::getFloat("contrast", "Video"));
|
||||
mInputWrapper->setWindowEventCallback(MWBase::Environment::get().getWindowManager());
|
||||
|
||||
std::string file = userFileExists ? userFile : "";
|
||||
mInputBinder = new ICS::InputControlSystem(file, true, this, nullptr, A_Last);
|
||||
|
@ -109,23 +103,16 @@ namespace MWInput
|
|||
|
||||
InputManager::~InputManager()
|
||||
{
|
||||
mInputBinder->save (mUserFile);
|
||||
|
||||
delete mActionManager;
|
||||
delete mControllerManager;
|
||||
delete mKeyboardManager;
|
||||
delete mMouseManager;
|
||||
delete mSensorManager;
|
||||
|
||||
mInputBinder->save(mUserFile);
|
||||
delete mInputBinder;
|
||||
|
||||
delete mInputWrapper;
|
||||
delete mVideoWrapper;
|
||||
}
|
||||
|
||||
bool InputManager::isWindowVisible()
|
||||
{
|
||||
return mWindowVisible;
|
||||
}
|
||||
|
||||
void InputManager::setPlayerControlsEnabled(bool enabled)
|
||||
|
@ -278,35 +265,11 @@ namespace MWInput
|
|||
|
||||
void InputManager::processChangedSettings(const Settings::CategorySettingVector& changed)
|
||||
{
|
||||
bool changeRes = false;
|
||||
|
||||
for (Settings::CategorySettingVector::const_iterator it = changed.begin();
|
||||
it != changed.end(); ++it)
|
||||
{
|
||||
if (it->first == "Input" && it->second == "grab cursor")
|
||||
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"));
|
||||
}
|
||||
|
||||
mMouseManager->processChangedSettings(changed);
|
||||
|
@ -346,35 +309,6 @@ namespace MWInput
|
|||
mControlSwitch[sw] = value;
|
||||
}
|
||||
|
||||
void InputManager::windowFocusChange(bool have_focus)
|
||||
{
|
||||
}
|
||||
|
||||
void InputManager::windowVisibilityChange(bool visible)
|
||||
{
|
||||
mWindowVisible = visible;
|
||||
}
|
||||
|
||||
void InputManager::windowResized(int x, int y)
|
||||
{
|
||||
// Note: this is a side effect of resolution change or window resize.
|
||||
// There is no need to track these changes.
|
||||
Settings::Manager::setInt("resolution x", "Video", x);
|
||||
Settings::Manager::setInt("resolution y", "Video", y);
|
||||
Settings::Manager::resetPendingChange("resolution x", "Video");
|
||||
Settings::Manager::resetPendingChange("resolution y", "Video");
|
||||
|
||||
MWBase::Environment::get().getWindowManager()->windowResized(x, y);
|
||||
|
||||
// We should reload TrueType fonts to fit new resolution
|
||||
MWBase::Environment::get().getWindowManager()->loadUserFonts();
|
||||
}
|
||||
|
||||
void InputManager::windowClosed()
|
||||
{
|
||||
MWBase::Environment::get().getStateManager()->requestQuit();
|
||||
}
|
||||
|
||||
void InputManager::resetIdleTime()
|
||||
{
|
||||
mActionManager->resetIdleTime();
|
||||
|
|
|
@ -51,7 +51,6 @@ namespace Files
|
|||
namespace SDLUtil
|
||||
{
|
||||
class InputWrapper;
|
||||
class VideoWrapper;
|
||||
}
|
||||
|
||||
struct SDL_Window;
|
||||
|
@ -63,7 +62,6 @@ namespace MWInput
|
|||
*/
|
||||
class InputManager :
|
||||
public MWBase::InputManager,
|
||||
public SDLUtil::WindowListener,
|
||||
public ICS::ChannelListener,
|
||||
public ICS::DetectingBindingListener
|
||||
{
|
||||
|
@ -79,8 +77,6 @@ namespace MWInput
|
|||
|
||||
virtual ~InputManager();
|
||||
|
||||
virtual bool isWindowVisible();
|
||||
|
||||
/// Clear all savegame-specific data
|
||||
virtual void clear();
|
||||
|
||||
|
@ -109,11 +105,6 @@ namespace MWInput
|
|||
virtual void setJoystickLastUsed(bool enabled);
|
||||
virtual bool joystickLastUsed();
|
||||
|
||||
virtual void windowVisibilityChange( bool visible );
|
||||
virtual void windowFocusChange( bool have_focus );
|
||||
virtual void windowResized (int x, int y);
|
||||
virtual void windowClosed ();
|
||||
|
||||
virtual void channelChanged(ICS::Channel* channel, float currentValue, float previousValue);
|
||||
|
||||
virtual void keyBindingDetected(ICS::InputControlSystem* ICS, ICS::Control* control
|
||||
|
@ -146,12 +137,9 @@ namespace MWInput
|
|||
virtual void resetIdleTime();
|
||||
|
||||
private:
|
||||
bool mWindowVisible;
|
||||
|
||||
ICS::InputControlSystem* mInputBinder;
|
||||
|
||||
SDLUtil::InputWrapper* mInputWrapper;
|
||||
SDLUtil::VideoWrapper* mVideoWrapper;
|
||||
|
||||
std::string mUserFile;
|
||||
|
||||
|
|
|
@ -79,9 +79,6 @@ public:
|
|||
/** @remarks The window's visibility changed */
|
||||
virtual void windowVisibilityChange( bool visible ) {}
|
||||
|
||||
/** @remarks The window got / lost input focus */
|
||||
virtual void windowFocusChange( bool have_focus ) {}
|
||||
|
||||
virtual void windowClosed () {}
|
||||
|
||||
virtual void windowResized (int x, int y) {}
|
||||
|
|
|
@ -231,15 +231,10 @@ InputWrapper::InputWrapper(SDL_Window* window, osg::ref_ptr<osgViewer::Viewer> v
|
|||
case SDL_WINDOWEVENT_FOCUS_GAINED:
|
||||
mWindowHasFocus = true;
|
||||
updateMouseSettings();
|
||||
if (mWindowListener)
|
||||
mWindowListener->windowFocusChange(true);
|
||||
|
||||
break;
|
||||
case SDL_WINDOWEVENT_FOCUS_LOST:
|
||||
mWindowHasFocus = false;
|
||||
updateMouseSettings();
|
||||
if (mWindowListener)
|
||||
mWindowListener->windowFocusChange(false);
|
||||
break;
|
||||
case SDL_WINDOWEVENT_CLOSE:
|
||||
break;
|
||||
|
|
Loading…
Reference in a new issue