dwelling acts 1 & 3
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 

151 lines
6.1 KiB

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;
}
}
}