diff options
author | Franz Koch <franz.koch@elements-net.de> | 2013-06-05 22:21:18 +0200 |
---|---|---|
committer | Joakim Plate <elupus@ecce.se> | 2013-08-01 16:59:01 +0200 |
commit | 0a4161336a4d1bcd697d727d76d6012314b7aa9e (patch) | |
tree | 5bbacc4b4b4f92df0af75ad9a33b47e099db3720 | |
parent | 380138cdc57fe500d3c50736c493166403f5a69a (diff) |
[3D] observe changes to the stereoscopicmode setting and push changes to the GraphicContext instead of having the context constantly checking the setting
-rw-r--r-- | xbmc/guilib/GraphicContext.cpp | 8 | ||||
-rw-r--r-- | xbmc/guilib/GraphicContext.h | 2 | ||||
-rw-r--r-- | xbmc/guilib/StereoscopicsManager.cpp | 37 | ||||
-rw-r--r-- | xbmc/guilib/StereoscopicsManager.h | 5 | ||||
-rw-r--r-- | xbmc/settings/Settings.cpp | 1 |
5 files changed, 47 insertions, 6 deletions
diff --git a/xbmc/guilib/GraphicContext.cpp b/xbmc/guilib/GraphicContext.cpp index 1d40333871..fcc659e123 100644 --- a/xbmc/guilib/GraphicContext.cpp +++ b/xbmc/guilib/GraphicContext.cpp @@ -35,7 +35,6 @@ #include "utils/JobManager.h" #include "video/VideoReferenceClock.h" #include "cores/IPlayer.h" -#include "guilib/StereoscopicsManager.h" using namespace std; @@ -64,6 +63,7 @@ CGraphicContext::CGraphicContext(void) : /*m_groupTransform*/ , m_stereoView(RENDER_STEREO_VIEW_OFF) , m_stereoMode(RENDER_STEREO_MODE_OFF) + , m_nextStereoMode(RENDER_STEREO_MODE_OFF) { } @@ -972,10 +972,10 @@ void CGraphicContext::SetMediaDir(const CStdString &strMediaDir) void CGraphicContext::Flip(const CDirtyRegionList& dirty) { g_Windowing.PresentRender(dirty); - RENDER_STEREO_MODE mode = CStereoscopicsManager::Get().GetStereoMode(); - if(m_stereoMode != mode) + + if(m_stereoMode != m_nextStereoMode) { - m_stereoMode = mode; + m_stereoMode = m_nextStereoMode; SetStereoView(RENDER_STEREO_VIEW_OFF); g_windowManager.SendMessage(GUI_MSG_NOTIFY_ALL, 0, 0, GUI_MSG_RENDERER_RESET); } diff --git a/xbmc/guilib/GraphicContext.h b/xbmc/guilib/GraphicContext.h index a62123e470..96fd13be27 100644 --- a/xbmc/guilib/GraphicContext.h +++ b/xbmc/guilib/GraphicContext.h @@ -152,6 +152,7 @@ public: void SetCameraPosition(const CPoint &camera); void SetStereoView(RENDER_STEREO_VIEW view); RENDER_STEREO_VIEW GetStereoView() { return m_stereoView; } + void SetStereoMode(RENDER_STEREO_MODE mode) { m_nextStereoMode = mode; } RENDER_STEREO_MODE GetStereoMode() { return m_stereoMode; } void RestoreCameraPosition(); /*! \brief Set a region in which to clip all rendering @@ -255,6 +256,7 @@ private: std::stack<TransformMatrix> m_groupTransform; RENDER_STEREO_VIEW m_stereoView; RENDER_STEREO_MODE m_stereoMode; + RENDER_STEREO_MODE m_nextStereoMode; CRect m_scissors; }; diff --git a/xbmc/guilib/StereoscopicsManager.cpp b/xbmc/guilib/StereoscopicsManager.cpp index f989021396..b5c4e2f694 100644 --- a/xbmc/guilib/StereoscopicsManager.cpp +++ b/xbmc/guilib/StereoscopicsManager.cpp @@ -23,16 +23,18 @@ * @brief This class acts as container for stereoscopic related functions */ -#pragma once - #include <stdlib.h> #include "StereoscopicsManager.h" +#include "dialogs/GUIDialogKaiToast.h" +#include "guilib/LocalizeStrings.h" +#include "guilib/GUIWindowManager.h" #include "settings/ISettingCallback.h" #include "settings/Setting.h" #include "settings/Settings.h" #include "rendering/RenderSystem.h" #include "utils/log.h" +#include "windowing/WindowingFactory.h" CStereoscopicsManager::CStereoscopicsManager(void) @@ -67,6 +69,10 @@ void CStereoscopicsManager::SetStereoMode(const RENDER_STEREO_MODE &mode) CSettings::Get().SetInt("videoscreen.stereoscopicmode", mode); } +CStdString CStereoscopicsManager::GetLabelForStereoMode(const RENDER_STEREO_MODE &mode) +{ + return g_localizeStrings.Get(36502 + mode); +} void CStereoscopicsManager::OnSettingChanged(const CSetting *setting) { if (setting == NULL) @@ -78,6 +84,33 @@ void CStereoscopicsManager::OnSettingChanged(const CSetting *setting) { // turn off 3D mode if global toggle has been disabled if (((CSettingBool*)setting)->GetValue() == false) + { SetStereoMode(RENDER_STEREO_MODE_OFF); + ApplyStereoMode(RENDER_STEREO_MODE_OFF); + } + else + { + ApplyStereoMode(GetStereoMode()); + } + } + else if (settingId == "videoscreen.stereoscopicmode") + { + RENDER_STEREO_MODE mode = GetStereoMode(); + CLog::Log(LOGDEBUG, "StereoscopicsManager: stereo mode setting changed to %s", GetLabelForStereoMode(mode).c_str()); + if(HasStereoscopicSupport()) + ApplyStereoMode(mode); + } +} + +void CStereoscopicsManager::ApplyStereoMode(const RENDER_STEREO_MODE &mode, bool notify) +{ + RENDER_STEREO_MODE currentMode = g_graphicsContext.GetStereoMode(); + CLog::Log(LOGDEBUG, "StereoscopicsManager::ApplyStereoMode: trying to apply stereo mode. Current: %s | Target: %s", GetLabelForStereoMode(currentMode).c_str(), GetLabelForStereoMode(mode).c_str()); + if (currentMode != mode) + { + g_graphicsContext.SetStereoMode(mode); + CLog::Log(LOGDEBUG, "StereoscopicsManager: stereo mode changed to %s", GetLabelForStereoMode(mode).c_str()); + if (notify) + CGUIDialogKaiToast::QueueNotification(CGUIDialogKaiToast::Info, g_localizeStrings.Get(36501), GetLabelForStereoMode(mode)); } } diff --git a/xbmc/guilib/StereoscopicsManager.h b/xbmc/guilib/StereoscopicsManager.h index 0004ef1959..48dd11b9cd 100644 --- a/xbmc/guilib/StereoscopicsManager.h +++ b/xbmc/guilib/StereoscopicsManager.h @@ -43,4 +43,9 @@ public: bool HasStereoscopicSupport(void); void SetStereoMode(const RENDER_STEREO_MODE &mode); RENDER_STEREO_MODE GetStereoMode(void); + CStdString GetLabelForStereoMode(const RENDER_STEREO_MODE &mode); + virtual void OnSettingChanged(const CSetting *setting); + +private: + void ApplyStereoMode(const RENDER_STEREO_MODE &mode, bool notify = true); }; diff --git a/xbmc/settings/Settings.cpp b/xbmc/settings/Settings.cpp index abd95b88d5..6705711e26 100644 --- a/xbmc/settings/Settings.cpp +++ b/xbmc/settings/Settings.cpp @@ -859,6 +859,7 @@ void CSettings::InitializeISettingCallbacks() settingSet.clear(); settingSet.insert("videoscreen.hasstereoscopicsupport"); + settingSet.insert("videoscreen.stereoscopicmode"); m_settingsManager->RegisterCallback(&CStereoscopicsManager::Get(), settingSet); settingSet.clear(); |