Browse Source

WIP: On-demand 3D viewport drawing
- On-demand drawing for game view
- Some issues with on-demand drawing resolved

BearishSun 6 years ago
parent
commit
f2963f9751

+ 11 - 1
Source/EditorManaged/General/EditorApplication.cs

@@ -897,7 +897,7 @@ namespace bs.Editor
             else
                 onDemandDrawingDisablers.Add(caller);
 
-            bool isEnabled = onDemandDrawingDisablers.Count == 0;
+            bool isEnabled = IsOnDemandDrawingEnabled();
 
             SceneWindow sceneWindow = EditorWindow.GetWindow<SceneWindow>();
             sceneWindow?.ToggleOnDemandDrawing(isEnabled);
@@ -906,6 +906,16 @@ namespace bs.Editor
             gameWindow?.ToggleOnDemandDrawing(isEnabled);
         }
 
+        /// <summary>
+        /// Checks is 3D viewport on demand drawing enabled. If enabled the viewport will only redraw when explicitly
+        /// requested, otherwise it will redraw itself every frame.
+        /// </summary>
+        /// <returns>True if on demand drawing is enabled, false otherwise.</returns>
+        public static bool IsOnDemandDrawingEnabled()
+        {
+            return onDemandDrawingDisablers.Count == 0;
+        }
+
         /// <summary>
         /// Checks does the path represent a native resource.
         /// </summary>

+ 29 - 6
Source/EditorManaged/Windows/GameWindow.cs

@@ -29,6 +29,9 @@ namespace bs.Editor
         private GUITexture renderTextureBg;
         private GUILabel noCameraLabel;
 
+        private Camera currentCamera;
+        private bool onDemandDisabled;
+
         /// <summary>
         /// Opens the game window.
         /// </summary>
@@ -141,15 +144,31 @@ namespace bs.Editor
 
             UpdateRenderTexture(Width, Height);
 
-            bool hasMainCamera = Scene.Camera != null;
+            currentCamera = Scene.Camera;
+            bool hasMainCamera = currentCamera != null;
 
             renderTextureGUI.Active = hasMainCamera;
             noCameraLabel.Active = !hasMainCamera;
+
+            ToggleOnDemandDrawing(EditorApplication.IsOnDemandDrawingEnabled());
+            NotifyNeedsRedraw();
         }
 
         private void OnEditorUpdate()
         {
-            bool hasMainCamera = Scene.Camera != null;
+            Camera camera = Scene.Camera;
+            if (camera != currentCamera)
+            {
+                if (currentCamera != null)
+                    currentCamera.Flags &= ~CameraFlag.OnDemand;
+
+                if(!onDemandDisabled)
+                    camera.Flags |= CameraFlag.OnDemand;
+
+                currentCamera = camera;
+            }
+
+            bool hasMainCamera = camera != null;
 
             renderTextureGUI.Active = hasMainCamera;
             noCameraLabel.Active = !hasMainCamera;
@@ -157,6 +176,9 @@ namespace bs.Editor
 
         private void OnDestroy()
         {
+            if (currentCamera != null)
+                currentCamera.Flags &= ~CameraFlag.OnDemand;
+
             EditorApplication.MainRenderTarget = null;
         }
 
@@ -178,14 +200,15 @@ namespace bs.Editor
         /// <param name="enabled">True to enable on-demand drawing, false otherwise.</param>
         internal void ToggleOnDemandDrawing(bool enabled)
         {
-            Camera camera = Scene.Camera;
-            if (camera == null)
+            onDemandDisabled = !enabled;
+
+            if (currentCamera == null)
                 return;
 
             if (enabled)
-                camera.Flags = CameraFlag.OnDemand;
+                currentCamera.Flags |= CameraFlag.OnDemand;
             else
-                camera.Flags = new CameraFlag();
+                currentCamera.Flags &= ~CameraFlag.OnDemand;
         }
 
         /// <summary>

+ 5 - 2
Source/EditorManaged/Windows/Scene/SceneAxesGUI.cs

@@ -61,7 +61,7 @@ namespace bs.Editor
             camera.OrthoHeight = 2.0f;
             camera.RenderSettings.EnableHDR = false;
             camera.RenderSettings.EnableSkybox = false;
-            camera.Flags = CameraFlag.OnDemand;
+            camera.Flags |= CameraFlag.OnDemand;
 
             renderTextureGUI = new GUIRenderTexture(renderTexture, true);
 
@@ -153,7 +153,10 @@ namespace bs.Editor
         /// <param name="enabled">True to enable on-demand drawing, false otherwise.</param>
         internal void ToggleOnDemandDrawing(bool enabled)
         {
-            camera.Flags = enabled ? CameraFlag.OnDemand : new CameraFlag();
+            if (enabled)
+                camera.Flags |= CameraFlag.OnDemand;
+            else
+                camera.Flags &= ~CameraFlag.OnDemand;
         }
 
         /// <summary>

+ 7 - 1
Source/EditorManaged/Windows/Scene/SceneCamera.cs

@@ -194,7 +194,10 @@ namespace bs.Editor
         /// <param name="enabled">True to enable on-demand drawing, false otherwise.</param>
         internal void ToggleOnDemandDrawing(bool enabled)
         {
-            camera.Flags = enabled ? CameraFlag.OnDemand : new CameraFlag();
+            if (enabled)
+                camera.Flags |= CameraFlag.OnDemand;
+            else
+                camera.Flags &= ~CameraFlag.OnDemand;
         }
 
         #endregion
@@ -208,6 +211,9 @@ namespace bs.Editor
             MoveSettings = ProjectSettings.GetObject<SceneCameraMoveSettings>(MoveSettingsKey);
             RenderSettings = ProjectSettings.GetObject<RenderSettings>(RenderSettingsKey);
 
+            if (RenderSettings == null)
+                RenderSettings = SceneCameraSettingsWindow.GetDefaultRenderSettings();
+
             moveForwardBtn = new VirtualButton(MoveForwardBinding);
             moveLeftBtn = new VirtualButton(MoveLeftBinding);
             moveRightBtn = new VirtualButton(MoveRightBinding);

+ 13 - 1
Source/EditorManaged/Windows/Scene/SceneCameraSettingsWindow.cs

@@ -186,8 +186,8 @@ namespace bs.Editor
         {
             viewSettings = new SceneCameraViewSettings();
             moveSettings = new SceneCameraMoveSettings();
-            renderSettings = new RenderSettings();
             gizmoSettings = GizmoDrawSettings.Default();
+            renderSettings = GetDefaultRenderSettings();
 
             SceneWindow sceneWindow = SceneWindow.GetWindow<SceneWindow>();
             if (sceneWindow != null)
@@ -218,6 +218,18 @@ namespace bs.Editor
                         cancel?.Invoke();
                 });
         }
+
+        /// <summary>
+        /// Returns the default set of render settings used by scene cameras.
+        /// </summary>
+        /// <returns>New render settings object with appropriate default values.</returns>
+        public static RenderSettings GetDefaultRenderSettings()
+        {
+            RenderSettings renderSettings = new RenderSettings();
+            renderSettings.EnableAutoExposure = false;
+
+            return renderSettings;
+        }
     }
 
     /** @} */

+ 2 - 1
Source/EditorManaged/Windows/Scene/SceneWindow.cs

@@ -351,6 +351,7 @@ namespace bs.Editor
             UpdateCameraPreviews();
 
             Selection.OnSelectionChanged += OnSelectionChanged;
+            ToggleOnDemandDrawing(EditorApplication.IsOnDemandDrawingEnabled());
         }
 
         private void OnCameraOptionsClicked()
@@ -1013,7 +1014,7 @@ namespace bs.Editor
             // render target destroy/create cycle for every single pixel.
 
             camera.AspectRatio = width / (float)height;
-            camera.NotifyNeedsRedraw();
+            NotifyNeedsRedraw();
         }
 
         /// <summary>