summaryrefslogtreecommitdiff
path: root/Runtime/Misc/QualitySettings.h
diff options
context:
space:
mode:
Diffstat (limited to 'Runtime/Misc/QualitySettings.h')
-rw-r--r--Runtime/Misc/QualitySettings.h133
1 files changed, 133 insertions, 0 deletions
diff --git a/Runtime/Misc/QualitySettings.h b/Runtime/Misc/QualitySettings.h
new file mode 100644
index 0000000..e983771
--- /dev/null
+++ b/Runtime/Misc/QualitySettings.h
@@ -0,0 +1,133 @@
+#ifndef QUALITYSETTINGS_H
+#define QUALITYSETTINGS_H
+
+#include "Runtime/BaseClasses/GameManager.h"
+#include "Runtime/Utilities/dynamic_array.h"
+
+enum ShadowProjection
+{
+ kShadowProjCloseFit = 0,
+ kShadowProjStableFit,
+ kShadowProjectionCount
+};
+
+
+class QualitySettings : public GlobalGameManager {
+public:
+ REGISTER_DERIVED_CLASS (QualitySettings, GlobalGameManager)
+ DECLARE_OBJECT_SERIALIZE (QualitySettings)
+
+ QualitySettings(MemLabelId label, ObjectCreationMode mode);
+
+ virtual void Reset ();
+
+ int GetCurrentIndex () const { return m_CurrentQuality;}
+ bool SetCurrent (string setting, bool applyExpensiveChanges);
+ void SetCurrentIndex (int setting, bool applyExpensiveChanges);
+
+ std::vector<std::string> GetQualitySettingsNames ();
+
+ virtual void CheckConsistency ();
+ virtual void AwakeFromLoad (AwakeFromLoadMode awakeMode);
+
+ void ApplySettings( int previousIndex = -1, bool applyExpensiveChanges = false );
+
+ struct QualitySetting
+ {
+ DECLARE_SERIALIZE (QualitySetting)
+ QualitySetting();
+
+ UnityStr name;
+
+ int pixelLightCount; ///< Number of pixel lights to use
+ int shadows; ///< enum { Disable Shadows = 0, Hard Shadows Only = 1, Hard and Soft Shadows = 2 } Shadow quality
+ int shadowResolution; ///< enum { Low Resolution = 0, Medium Resolution = 1, High Resolution = 2, Very High Resolution = 3 } Shadow resolution
+ int shadowProjection; ///< enum { Close Fit = 0, Stable Fit = 1 } Shadow projection
+ int shadowCascades; ///< enum { No Cascades = 1, Two Cascades = 2, Four Cascades = 4 } Number of cascades for directional light shadows
+ float shadowDistance; ///< Shadow drawing distance
+ int blendWeights; ///< enum { 1 Bone=1, 2 Bones=2, 4 Bones = 4 } Bone count for mesh skinning
+ int textureQuality; ///< enum { Full Res = 0, Half Res = 1, Quarter Res = 2, Eighth Res = 3} Base texture level
+ int anisotropicTextures; ///< enum { Disabled = 0, Per Texture = 1, Forced On = 2 } When to enable anisotropic texturing
+ int antiAliasing; ///< enum { Disabled = 0, 2x Multi Sampling = 2, 4x Multi Sampling = 4, 8x Multi Sampling = 8 } Screen anti aliasing
+ int vSyncCount; ///< enum { Don't Sync = 0, Every VBlank = 1, Every Second VBlank = 2 } Limit refresh rate to avoid tearing
+ bool softParticles; ///< Use soft blending for particles?
+ bool softVegetation; ///< Use soft shading for terrain vegetation?
+ float lodBias;
+ int maximumLODLevel;
+ int particleRaycastBudget; ///< Number of rays to cast for approximate world collisions
+
+ #if UNITY_EDITOR
+ std::vector<UnityStr> excludedTargetPlatforms;
+ #endif
+ };
+
+ enum ShadowQuality
+ {
+ kShadowsDisable = 0,
+ kShadowsHardOnly,
+ kShadowsAll,
+ kShadowQualityCount
+ };
+ enum
+ {
+ kShadowResolutionCount = 4,
+ };
+
+ const QualitySetting& GetCurrent() const { return m_QualitySettings[m_CurrentQuality]; }
+ const QualitySetting& GetQualityForIndex(int index) const { Assert ( index < m_QualitySettings.size() ); return m_QualitySettings[index]; }
+ int GetQualitySettingsCount() const { return m_QualitySettings.size(); }
+
+ void SetPixelLightCount(int light);
+ void SetShadowProjection(ShadowProjection shadowProjection);
+ void SetShadowCascades(int cascades);
+ void SetShadowDistance(float shadowDistance);
+ void SetShadowDistanceTemporarily(float shadowDistance);
+ void SetSoftVegetation (bool softVegetation);
+ void SetSoftParticles (bool soft);
+ void SetVSyncCount (int count);
+ void SetAntiAliasing (int aaSettings);
+ void SetAnisotropicTextures (int aniso);
+ void SetLODBias (float lodBias);
+ void SetMaximumLODLevel (int maximumLODLevel);
+ void SetParticleRaycastBudget (int particleRaycastBudget);
+ void SetBlendWeights(int weights);
+ void SetMasterTextureLimit(int limit);
+
+ /// The stripped maximum LOD level is calculated from the supported quality settings for this platform when entering playmode & building a player.
+ /// It always acts as the absolute minimum for LOD's
+ void SetStrippedMaximumLODLevel (int maximumLODLevel) { m_StrippedMaximumLODLevel = maximumLODLevel; }
+ int GetStrippedMaximumLODLevel () { return m_StrippedMaximumLODLevel; }
+
+ #if UNITY_EDITOR
+ typedef std::map<UnityStr, int> PerPlatformDefaultQuality;
+ void SetQualitySettings(const QualitySetting* settings, int size, int defaultQuality);
+ void DeletePerPlatformDefaultQuality ();
+ int GetDefaultQualityForPlatform (const std::string& platformName);
+ #endif
+
+ static float GetShadowDistanceForRendering();
+
+ static void InitializeClass();
+ static void CleanupClass() {}
+
+private:
+
+ std::vector<QualitySetting> m_QualitySettings;
+
+ int m_StrippedMaximumLODLevel;
+ int m_CurrentQuality;
+
+ void ApplyExpensiveSettings();
+
+ #if UNITY_EDITOR
+ PerPlatformDefaultQuality m_PerPlatformDefaultQuality;
+ int m_PreviousAA;
+
+ int m_PreviousVSync;
+ #endif
+};
+QualitySettings& GetQualitySettings ();
+QualitySettings* GetQualitySettingsPtr ();
+
+
+#endif