diff options
author | chai <chaifix@163.com> | 2019-08-14 22:50:43 +0800 |
---|---|---|
committer | chai <chaifix@163.com> | 2019-08-14 22:50:43 +0800 |
commit | 15740faf9fe9fe4be08965098bbf2947e096aeeb (patch) | |
tree | a730ec236656cc8cab5b13f088adfaed6bb218fb /Runtime/Graphics/ScreenManager.h |
Diffstat (limited to 'Runtime/Graphics/ScreenManager.h')
-rw-r--r-- | Runtime/Graphics/ScreenManager.h | 257 |
1 files changed, 257 insertions, 0 deletions
diff --git a/Runtime/Graphics/ScreenManager.h b/Runtime/Graphics/ScreenManager.h new file mode 100644 index 0000000..77adf85 --- /dev/null +++ b/Runtime/Graphics/ScreenManager.h @@ -0,0 +1,257 @@ +#pragma once + +#include <vector> + +enum ScreenOrientation +{ + kScreenOrientationUnknown, + + kPortrait, + kPortraitUpsideDown, + kLandscapeLeft, + kLandscapeRight, + + kAutoRotation, + + kScreenOrientationCount +}; + +inline ScreenOrientation PlayerSettingsToScreenOrientation(int defaultScreenOrientation) +{ + switch (defaultScreenOrientation) { + case 0 : + return kPortrait; + case 1 : + return kPortraitUpsideDown; + case 2 : + return kLandscapeRight; + case 3 : + return kLandscapeLeft; + case 4 : + return kAutoRotation; + default: + return kScreenOrientationUnknown; + } +} + +inline int ScreenOrientationToPlayerSettings(ScreenOrientation screenOrientation) +{ + switch (screenOrientation) { + case kPortrait : + return 0; + case kPortraitUpsideDown : + return 1; + case kLandscapeRight : + return 2; + case kLandscapeLeft : + return 3; + case kAutoRotation : + return 4; + default: + return 5; + } +} + + +enum SleepTimeout +{ + kNeverSleep = -1, + kSystemSetting = -2, +}; + +enum EnabledOrientation +{ + kAutorotateToPortrait = 1, + kAutorotateToPortraitUpsideDown = 2, + kAutorotateToLandscapeLeft = 4, + kAutorotateToLandscapeRight = 8 +}; + +#define kResolutionWidth "Screenmanager Resolution Width" +#define kResolutionHeight "Screenmanager Resolution Height" +#define kIsFullScreen "Screenmanager Is Fullscreen mode" +#define kGraphicsQuality "UnityGraphicsQuality" + +class ScreenManager +{ +public: + ScreenManager (); + + void RequestResolution (int width, int height, bool fullscreen, int preferredRefreshRate); + void RequestSetFullscreen (bool fullscreen); + bool HasFullscreenRequested () const; + + virtual void SetRequestedResolution (); + void SetIsFullScreenImmediate (bool fullscreen); + virtual bool SetResolutionImmediate (int /*width*/, int /*height*/, bool /*fullscreen*/, int /*preferredRefreshRate*/) { return false; } + + struct Resolution + { + // Keep in sync with .NET Resolution struct! + int width; + int height; + int refreshRate; + + friend bool operator < (const Resolution& lhs, const Resolution& rhs) + { + if( lhs.width != rhs.width ) + return lhs.width < rhs.width; + return lhs.height < rhs.height; + } + + /** + * Returns true if this resolution is >= given width/height. + * Used to filter out resolutions that are too big for windowed modes. + */ + bool IsTooBigFor( int w, int h ) const + { + return width >= w || height >= h; + } + + bool IsRotated() const { return height > width; } + + Resolution () + { + width = 0; + height = 0; + refreshRate = 0; + } + }; + + struct ResolutionRequest + { + ResolutionRequest() { Reset(); } + + int width; + int height; + int fullScreen; + int refreshRate; + + bool IsFullScreen() const { return fullScreen == 1; } + + void Reset() + { + width = -1; + height = -1; + fullScreen = -1; + refreshRate = -1; + } + }; + + typedef std::vector<Resolution> Resolutions; + virtual Resolutions GetResolutions (int /*preferredRefreshRate*/ = 0, bool /*clampToDesktopRes*/ = false) { return Resolutions(); } + int FindClosestResolution (const ScreenManager::Resolutions& resolutions, int width, int height) const; + + virtual Resolution GetCurrentResolution() const; + + virtual bool GetShowCursor () const { return true; } + virtual void SetShowCursor (bool /*show*/) { } + + virtual bool GetLockCursor () const { return false; } + virtual void SetLockCursor (bool /*lock*/) { } + + virtual bool GetAllowLayeredRendering () const { return true; } + virtual void SetAllowLayeredRendering (bool /*allow*/) { } + + virtual int GetScreenTimeout () const { return kNeverSleep; } + virtual void SetScreenTimeout (int /*value*/) { } + + bool GetAllowCursorHide() const { return m_AllowCursorHide; } + void SetAllowCursorHide (bool allowHide); + + bool GetAllowCursorLock() const { return m_AllowCursorLock; } + void SetAllowCursorLock (bool allowLock); + + // Named *IsFocus to avoid confusion with windows API + virtual bool GetIsFocused() const { return true; } + virtual void SetIsFocused (bool /*focus*/) { } + + virtual bool GetCursorInsideWindow () const { return m_CursorInWindow; } + virtual void SetCursorInsideWindow (bool insideWindow); + + // Do these need to be virtual? + virtual int GetWidth () const { return m_Width; } + virtual int GetHeight () const { return m_Height; } + + int GetWidthAsRequested () const { return m_ResolutionRequest.width == -1 ? GetWidth () : m_ResolutionRequest.width; } + int GetHeightAsRequested () const { return m_ResolutionRequest.height == -1 ? GetHeight () : m_ResolutionRequest.height; } + bool GetFullScreenAsRequested () const { return m_ResolutionRequest.fullScreen == -1 ? IsFullScreen () : m_ResolutionRequest.IsFullScreen (); } + int GetRefreshRateAsRequested () const { return m_ResolutionRequest.refreshRate == -1 ? GetCurrentResolution ().refreshRate : m_ResolutionRequest.refreshRate; } + + virtual float GetDPI () const { return 0.f; } + virtual bool IsFullScreen () const { return m_IsFullscreen; } + + void RequestOrientation(ScreenOrientation value) { m_RequestedOrientation = value; } + ScreenOrientation GetRequestedOrientation() const { return m_RequestedOrientation; } + + virtual ScreenOrientation GetScreenOrientation() const { return m_ScreenOrientation; }; + virtual void SetScreenOrientation (ScreenOrientation value) { m_ScreenOrientation = value; } + + typedef void DidSwitchResolutions (); + void RegisterDidSwitchResolutions (DidSwitchResolutions* resolution); + + virtual void SetupScreenManagerEditor(float w, float h); + + void SetIsOrientationEnabled(EnabledOrientation orientation, bool enabled); + bool GetIsOrientationEnabled(EnabledOrientation orientation) const { return m_EnabledOrientations & orientation; } + + // helpers for connecting ScreenManager and PlayerSettings + void EnableOrientationsFromPlayerSettings(); + void SetConcreteOrientationFromPlayerSettings(int playerSettingsOrient); + void RequestConcreteOrientationFromPlayerSettings(int playerSettingsOrient); + +protected: + ResolutionRequest m_ResolutionRequest; + + DidSwitchResolutions* m_SwitchResolutionCallback; + + bool m_AllowCursorHide; + bool m_AllowCursorLock; + bool m_CursorInWindow; + bool m_IsFullscreen; + + int m_Width; + int m_Height; + + unsigned int m_EnabledOrientations; + ScreenOrientation m_ScreenOrientation; + ScreenOrientation m_RequestedOrientation; +}; + +#if UNITY_PEPPER +#include "PlatformDependent/PepperPlugin/ScreenManagerPepper.h" +#elif UNITY_OSX +#include "PlatformDependent/OSX/ScreenManagerOSX.h" +#elif UNITY_WP8 +#include "PlatformDependent/WP8Player/ScreenManagerWP8.h" +#elif UNITY_METRO +#include "PlatformDependent/MetroPlayer/ScreenManagerMetro.h" +#elif UNITY_WIN +#include "../../PlatformDependent/WinPlayer/ScreenManagerWin.h" +#elif UNITY_XENON +#include "../../PlatformDependent/Xbox360/Source/ScreenManagerXenon.h" +#elif UNITY_PS3 +#include "../../PlatformDependent/PS3Player/ScreenManagerPS3.h" +#elif UNITY_ANDROID +#include "PlatformDependent/AndroidPlayer/ScreenManagerAndroid.h" +#elif UNITY_IPHONE +#include "PlatformDependent/iPhonePlayer/ScreenManagerIPhone.h" +#elif UNITY_LINUX && SUPPORT_X11 +#include "PlatformDependent/Linux/ScreenManagerLinux.h" +#elif UNITY_WII +#include "PlatformDependent/Wii/WiiScreenManager.h" +#elif UNITY_FLASH +#include "PlatformDependent/FlashSupport/cpp/FlashScreenManager.h" +#elif UNITY_BB10 +#include "PlatformDependent/BB10Player/ScreenManagerBB10.h" +#elif UNITY_TIZEN +#include "PlatformDependent/TizenPlayer/ScreenManagerTizen.h" +#else +#define ScreenManagerPlatform ScreenManager +#endif + +void InitScreenManager(); +void ReleaseScreenManager(); +ScreenManagerPlatform &GetScreenManager(); +ScreenManagerPlatform* GetScreenManagerPtr(); + |