aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFranz Koch <franz.koch@elements-net.de>2013-06-05 22:21:18 +0200
committerJoakim Plate <elupus@ecce.se>2013-08-01 16:59:01 +0200
commit0a4161336a4d1bcd697d727d76d6012314b7aa9e (patch)
tree5bbacc4b4b4f92df0af75ad9a33b47e099db3720
parent380138cdc57fe500d3c50736c493166403f5a69a (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.cpp8
-rw-r--r--xbmc/guilib/GraphicContext.h2
-rw-r--r--xbmc/guilib/StereoscopicsManager.cpp37
-rw-r--r--xbmc/guilib/StereoscopicsManager.h5
-rw-r--r--xbmc/settings/Settings.cpp1
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();