1
This commit is contained in:
151
Assets/Plugins/Fullscreen/Editor/DisableSceneView.cs
Normal file
151
Assets/Plugins/Fullscreen/Editor/DisableSceneView.cs
Normal file
@@ -0,0 +1,151 @@
|
||||
using UnityEditor;
|
||||
using UnityEngine;
|
||||
|
||||
namespace FullscreenEditor {
|
||||
public class DisableSceneView {
|
||||
|
||||
// TODO: Patcher resets the method to original after a while
|
||||
// TODO: or the shouldSkipRender is not being properly calculated
|
||||
private static Patcher patcher = null;
|
||||
|
||||
public static bool RenderingDisabled {
|
||||
get {
|
||||
return patcher == null ? false : patcher.IsPatched();
|
||||
}
|
||||
set {
|
||||
if(patcher == null) return;
|
||||
|
||||
if(value == patcher.IsPatched())
|
||||
return;
|
||||
else if(!value)
|
||||
patcher.Revert();
|
||||
else if(FullscreenPreferences.DisableSceneViewRendering)
|
||||
patcher.SwapMethods();
|
||||
|
||||
if(!value || FullscreenPreferences.DisableSceneViewRendering)
|
||||
foreach(var c in SceneView.GetAllSceneCameras())
|
||||
c.gameObject.SetActive(!value);
|
||||
|
||||
Logger.Debug("{0} Scene View Rendering", value ? "Disabled" : "Enabled");
|
||||
SceneView.RepaintAll();
|
||||
}
|
||||
}
|
||||
|
||||
[InitializeOnLoadMethod]
|
||||
private static void Init() {
|
||||
if(!Patcher.IsSupported()) return;
|
||||
|
||||
var sceneGUIName = ReflectionUtility.HasMethod(typeof(SceneView), "OnSceneGUI") ? "OnSceneGUI" : "OnGUI";
|
||||
|
||||
patcher = new Patcher(
|
||||
typeof(SceneView).FindMethod(sceneGUIName), // Original method
|
||||
typeof(DisableSceneView).FindMethod("OnGUI") // Replacement
|
||||
);
|
||||
|
||||
SceneView.beforeSceneGui += OnBeforeSceneGUI;
|
||||
|
||||
// Initial
|
||||
RenderingDisabled = Fullscreen.GetAllFullscreen().Length > 0;
|
||||
|
||||
// On preferences change
|
||||
FullscreenPreferences.DisableSceneViewRendering.OnValueSaved += (v) =>
|
||||
RenderingDisabled = v && Fullscreen.GetAllFullscreen().Length > 0;
|
||||
|
||||
// On fullscreen open
|
||||
FullscreenCallbacks.afterFullscreenOpen += (f) =>
|
||||
RenderingDisabled = true;
|
||||
|
||||
// Disable the patching if we're the last fullscreen open
|
||||
FullscreenCallbacks.afterFullscreenClose += (f) => {
|
||||
if(Fullscreen.GetAllFullscreen().Length <= 1)
|
||||
RenderingDisabled = false;
|
||||
};
|
||||
}
|
||||
|
||||
private static void OnBeforeSceneGUI(SceneView sceneView) {
|
||||
var shouldRender = !RenderingDisabled || Fullscreen.GetFullscreenFromView(new ViewPyramid(sceneView).Container, false);
|
||||
sceneView.autoRepaintOnSceneChange = shouldRender;
|
||||
}
|
||||
|
||||
// This should not be a static method, as static has no this
|
||||
// However, the 'this' in the method is unreliable and should be casted before using
|
||||
private void OnGUI() {
|
||||
var _this = (object)this as SceneView;
|
||||
var vp = new ViewPyramid(_this);
|
||||
var shouldRender = Fullscreen.GetFullscreenFromView(vp.Container, false); // Render if this window is in fullscreen
|
||||
|
||||
if(shouldRender) {
|
||||
// Do this outside of OnGUI to prevent controls count errors
|
||||
After.Frames(1, () => EnableRenderingTemporarily());
|
||||
} else {
|
||||
_this.autoRepaintOnSceneChange = false;
|
||||
CustomOnGUI();
|
||||
}
|
||||
}
|
||||
|
||||
private static class Styles {
|
||||
|
||||
public static readonly GUIStyle textStyle = new GUIStyle("BoldLabel");
|
||||
public static readonly GUIStyle backgroundShadow = new GUIStyle("InnerShadowBg");
|
||||
public static readonly GUIStyle buttonStyle = new GUIStyle("LargeButton");
|
||||
public static readonly GUIStyle secondaryTextStyle = new GUIStyle(EditorStyles.centeredGreyMiniLabel);
|
||||
|
||||
static Styles() {
|
||||
textStyle.wordWrap = true;
|
||||
textStyle.alignment = TextAnchor.MiddleCenter;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
private void CustomOnGUI() {
|
||||
using(var mainScope = new EditorGUILayout.VerticalScope(Styles.backgroundShadow)) {
|
||||
using(new GUIColor(Styles.textStyle.normal.textColor * 0.05f))
|
||||
GUI.DrawTexture(mainScope.rect, FullscreenUtility.FullscreenIcon, ScaleMode.ScaleAndCrop);
|
||||
|
||||
GUILayout.FlexibleSpace();
|
||||
|
||||
using(new EditorGUILayout.HorizontalScope()) {
|
||||
GUILayout.FlexibleSpace();
|
||||
|
||||
using(new GUIContentColor(Styles.textStyle.normal.textColor))
|
||||
GUILayout.Label(FullscreenUtility.FullscreenIcon, Styles.textStyle);
|
||||
|
||||
using(new EditorGUILayout.VerticalScope()) {
|
||||
GUILayout.Label("Scene View rendering has been disabled\nto improve fullscreen performance", Styles.textStyle);
|
||||
}
|
||||
|
||||
GUILayout.FlexibleSpace();
|
||||
}
|
||||
|
||||
using(new EditorGUILayout.HorizontalScope()) {
|
||||
GUILayout.FlexibleSpace();
|
||||
if(GUILayout.Button("Enable Temporarily", Styles.buttonStyle)) {
|
||||
// Do this outside of OnGUI to prevent controls count errors
|
||||
After.Frames(1, () => EnableRenderingTemporarily());
|
||||
var _this = (object)this as SceneView;
|
||||
_this.Focus();
|
||||
}
|
||||
if(GUILayout.Button("Enable Permanently", Styles.buttonStyle)) {
|
||||
// Do this outside of OnGUI to prevent controls count errors
|
||||
After.Frames(1, () => EnableRenderingPermanently());
|
||||
var _this = (object)this as SceneView;
|
||||
_this.Focus();
|
||||
}
|
||||
GUILayout.FlexibleSpace();
|
||||
}
|
||||
|
||||
GUILayout.Label("* This can be changed later in the preferences", Styles.secondaryTextStyle);
|
||||
GUILayout.FlexibleSpace();
|
||||
}
|
||||
}
|
||||
|
||||
public static void EnableRenderingTemporarily() {
|
||||
RenderingDisabled = false;
|
||||
}
|
||||
|
||||
public static void EnableRenderingPermanently() {
|
||||
FullscreenPreferences.DisableSceneViewRendering.Value = false;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user