From 8be4e5073fcadb3919db36c3cbccdfae45cf242a Mon Sep 17 00:00:00 2001
From: wasdennnoch <leiter04@gmail.com>
Date: Fri, 2 Apr 2021 22:34:16 +0200
Subject: [PATCH] Don't create new InsetEdges every frame

---
 Assets/Scripts/BaseCameraController.cs | 54 +++++++++++++++++++-------
 1 file changed, 41 insertions(+), 13 deletions(-)

diff --git a/Assets/Scripts/BaseCameraController.cs b/Assets/Scripts/BaseCameraController.cs
index f1f9736..b92cb36 100644
--- a/Assets/Scripts/BaseCameraController.cs
+++ b/Assets/Scripts/BaseCameraController.cs
@@ -20,6 +20,7 @@ public class BaseCameraController : MonoBehaviour
     new BoxCollider2D collider;
     new Rigidbody2D rigidbody;
 
+    InsetCameraEdges mouseMovementEdges;
     Interpolator zoomInterpolator;
     Interpolator moveXInterpolator;
     Interpolator moveYInterpolator;
@@ -29,12 +30,19 @@ public class BaseCameraController : MonoBehaviour
         get => camera.orthographicSize / maxZoom;
     }
 
+    public void PlayGlobalAudioClip(AudioClip clip, float volume = 1f)
+    {
+        audio.PlayOneShot(clip, volume);
+    }
+
     void Awake()
     {
         camera = GetComponent<Camera>();
         audio = GetComponent<AudioSource>();
         collider = GetComponent<BoxCollider2D>();
         rigidbody = GetComponent<Rigidbody2D>();
+
+        mouseMovementEdges = new InsetCameraEdges(camera);
         zoomInterpolator = new Interpolator(1 / zoomSpeed, camera.orthographicSize, camera.orthographicSize, minZoom, maxZoom);
         moveXInterpolator = new Interpolator(1 / moveSpeed);
         moveYInterpolator = new Interpolator(1 / moveSpeed);
@@ -59,9 +67,9 @@ public class BaseCameraController : MonoBehaviour
         if (inputVector.magnitude == 0)
         {
             var mouseViewportPos = camera.ScreenToWorldPoint(Input.mousePosition);
-            var mouseEdges = new InsetEdges(camera, mouseEdgeDetectionBoxSize * zoomRatio);
-            mouseEdges.DrawDebug();
-            inputVector = mouseEdges.GetOutOfBoundsDirection(mouseViewportPos);
+            mouseMovementEdges.RecalculateBounds(mouseEdgeDetectionBoxSize * zoomRatio);
+            mouseMovementEdges.DrawDebug();
+            inputVector = mouseMovementEdges.GetOutOfBoundsDirection(mouseViewportPos);
         }
         moveXInterpolator.targetValue = inputVector.x;
         moveYInterpolator.targetValue = inputVector.y;
@@ -88,29 +96,49 @@ public class BaseCameraController : MonoBehaviour
 
     void OnDrawGizmosSelected()
     {
-        if (camera == null)
+        if (camera == null || mouseMovementEdges == null)
         {
             camera = GetComponent<Camera>();
+            mouseMovementEdges = new InsetCameraEdges(camera);
         }
-        var mouseEdges = new InsetEdges(camera, mouseEdgeDetectionBoxSize * zoomRatio);
-        mouseEdges.DrawGizmos();
+        mouseMovementEdges.RecalculateBounds(mouseEdgeDetectionBoxSize * zoomRatio);
+        mouseMovementEdges.DrawGizmos();
     }
 
-    public void PlayGlobalAudioClip(AudioClip clip, float volume = 1f)
+    private class InsetCameraEdges
     {
-        audio.PlayOneShot(clip, volume);
-    }
+        private Camera camera;
+        private Vector3 insetVector;
 
-    private class InsetEdges
-    {
         public Vector3 bottomLeft;
         public Vector3 topRight;
         private Vector3 bottomRight;
         private Vector3 topLeft;
 
-        public InsetEdges(Camera camera, float inset)
+        public InsetCameraEdges(Camera camera) : this(camera, 0) { }
+
+        public InsetCameraEdges(Camera camera, float inset) : this(camera, inset, inset) { }
+
+        public InsetCameraEdges(Camera camera, float insetX, float insetY)
+        {
+            this.camera = camera;
+            RecalculateBounds(insetX, insetY);
+        }
+
+        public void RecalculateBounds(float newInset)
+        {
+            RecalculateBounds(newInset, newInset);
+        }
+
+        public void RecalculateBounds(float newInsetX, float newInsetY)
+        {
+            insetVector = new Vector3(newInsetX, newInsetY);
+            RecalculateBounds();
+        }
+
+        public void RecalculateBounds()
         {
-            var insetVector = new Vector3(inset, inset);
+            // TODO this would be way better if it would just use viewport positions
             bottomLeft = camera.ViewportToWorldPoint(Vector3.zero) + insetVector;
             topRight = camera.ViewportToWorldPoint(Vector3.one) - insetVector;
             bottomLeft.z = 0;
-- 
GitLab