< Summary

Class:Builder.DCLBuilderCamera
Assembly:Builder
File(s):/tmp/workspace/unity-renderer/unity-renderer/Assets/Builder/Scripts/DCLBuilderCamera.cs
Covered lines:64
Uncovered lines:69
Coverable lines:133
Total lines:272
Line coverage:48.1% (64 of 133)
Covered branches:0
Total branches:0

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity NPath complexity Sequence coverage
DCLBuilderCamera()0%110100%
Awake()0%110100%
OnDestroy()0%110100%
Update()0%6.146084.21%
OnEnable()0%220100%
OnDisable()0%110100%
OnMouseDrag(...)0%20400%
OnMouseWheel(...)0%2100%
OnKeyboardButtonHold(...)0%30500%
OnZoomFormUI(...)0%2100%
Pan(...)0%2100%
Zoom(...)0%2100%
OnDragObjectStart()0%2100%
OnDragObjectEnd()0%2100%
OnGizmoTransformObjectStart(...)0%2100%
OnGizmoTransformObjectEnd(...)0%2100%
OnSetCameraPosition(...)0%2100%
OnSetCameraRotation(...)0%2100%
OnResetCameraZoom()0%6200%
CanOrbit()0%2100%
CalcSceneBoundaries(...)0%12300%
CalcSceneBoundaries(...)0%12300%
OnPreviewModeChanged(...)0%2100%
OnConfigChanged(...)0%2100%

File(s)

/tmp/workspace/unity-renderer/unity-renderer/Assets/Builder/Scripts/DCLBuilderCamera.cs

#LineLine coverage
 1using UnityEngine;
 2using DCL.Controllers;
 3using DCL.Models;
 4using Builder.Gizmos;
 5
 6namespace Builder
 7{
 8    public class DCLBuilderCamera : MonoBehaviour
 9    {
 10        public static System.Action<Camera, float> OnCameraZoomChanged;
 11
 12        [Header("References")]
 13        public Transform pitchPivot;
 14
 15        public Transform yawPivot;
 16        public Transform rootPivot;
 17        public Camera builderCamera;
 18
 19        [Space()]
 20        [Header("Input Settings")]
 121        public float rotationSpeed = 5f;
 22
 23        [Header("Pitch")]
 124        public float pitchAmount = 10f;
 25
 26        public float pitchAngleMin = 0f;
 127        public float pitchAngleMax = 89f;
 28
 29        [Header("Yaw")]
 130        public float yawAmount = 10f;
 31
 32        [Header("Pan")]
 133        public float panSpeed = 5f;
 34
 135        public float panAmount = 0.2f;
 36
 37        [Header("Zoom")]
 138        public float zoomSpeed = 15f;
 39
 140        public float zoomAmount = 5f;
 41
 42        private float pitchCurrent = 0;
 43        private float pitchTarget = 0;
 44        private float yawCurrent = 0;
 45        private float yawTarget = 0;
 146        private Vector3 panCurrent = Vector3.zero;
 147        private Vector3 panTarget = Vector3.zero;
 48        private float zoomCurrent = 0;
 49        private float zoomTarget = 0;
 50
 151        private float zoomDefault = DCLBuilderConfig.config.camera.zoomDefault;
 152        private float zoomMin = DCLBuilderConfig.config.camera.zoomMin;
 153        private float zoomMax = DCLBuilderConfig.config.camera.zoomMax;
 54
 55        private bool isObjectBeingDrag = false;
 56
 57        private Vector2 sceneBoundaryMin;
 58        private Vector2 sceneBoundaryMax;
 59
 60        private bool isGameObjectActive = false;
 61
 62        private void Awake()
 63        {
 164            zoomCurrent = zoomTarget = -zoomDefault;
 165            pitchCurrent = pitchTarget = pitchPivot.localEulerAngles.x;
 166            yawCurrent = yawTarget = yawPivot.localEulerAngles.y;
 67
 168            DCLBuilderBridge.OnPreviewModeChanged += OnPreviewModeChanged;
 169        }
 70
 271        private void OnDestroy() { DCLBuilderBridge.OnPreviewModeChanged -= OnPreviewModeChanged; }
 72
 73        private void Update()
 74        {
 1175            yawCurrent += (yawTarget - yawCurrent) * Time.deltaTime * rotationSpeed;
 1176            if (Mathf.Abs(yawTarget - yawCurrent) < 0.04f)
 77            {
 1178                yawCurrent = yawTarget;
 79            }
 80
 1181            yawPivot.localRotation = Quaternion.Euler(0, yawCurrent, 0);
 82
 1183            pitchCurrent += (pitchTarget - pitchCurrent) * Time.deltaTime * rotationSpeed;
 1184            if (Mathf.Abs(pitchTarget - pitchCurrent) < 0.04f)
 85            {
 1186                pitchCurrent = pitchTarget;
 87            }
 88
 1189            pitchPivot.localRotation = Quaternion.Euler(pitchCurrent, 0, 0);
 90
 1191            float zoomPrev = zoomCurrent;
 1192            zoomCurrent += (zoomTarget - zoomCurrent) * Time.deltaTime * zoomSpeed;
 1193            builderCamera.transform.localPosition = new Vector3(0, 0, zoomCurrent);
 94
 1195            Vector3 panOffset = panTarget - panCurrent;
 1196            float sqDist = panOffset.magnitude;
 1197            if (sqDist >= 0.01f)
 98            {
 099                panCurrent = panCurrent + panOffset.normalized * sqDist * panSpeed * Time.deltaTime;
 0100                rootPivot.localPosition = panCurrent;
 101            }
 102
 11103            if (zoomPrev != zoomCurrent)
 104            {
 0105                OnCameraZoomChanged?.Invoke(builderCamera, zoomCurrent);
 106            }
 11107        }
 108
 109        private void OnEnable()
 110        {
 1111            if (!isGameObjectActive)
 112            {
 1113                DCLBuilderInput.OnMouseDrag += OnMouseDrag;
 1114                DCLBuilderInput.OnMouseWheel += OnMouseWheel;
 1115                DCLBuilderBridge.OnSetKeyDown += OnKeyboardButtonHold;
 1116                DCLBuilderBridge.OnZoomFromUI += OnZoomFormUI;
 1117                DCLBuilderBridge.OnSetCameraPosition += OnSetCameraPosition;
 1118                DCLBuilderBridge.OnSetCameraRotation += OnSetCameraRotation;
 1119                DCLBuilderBridge.OnResetCameraZoom += OnResetCameraZoom;
 1120                DCLBuilderObjectDragger.OnDraggingObjectStart += OnDragObjectStart;
 1121                DCLBuilderObjectDragger.OnDraggingObjectEnd += OnDragObjectEnd;
 1122                DCLBuilderGizmoManager.OnGizmoTransformObjectStart += OnGizmoTransformObjectStart;
 1123                DCLBuilderGizmoManager.OnGizmoTransformObjectEnd += OnGizmoTransformObjectEnd;
 1124                DCLBuilderConfig.OnConfigChanged += OnConfigChanged;
 125            }
 126
 1127            isGameObjectActive = true;
 1128        }
 129
 130        private void OnDisable()
 131        {
 1132            isGameObjectActive = false;
 1133            DCLBuilderInput.OnMouseDrag -= OnMouseDrag;
 1134            DCLBuilderInput.OnMouseWheel -= OnMouseWheel;
 1135            DCLBuilderBridge.OnSetKeyDown -= OnKeyboardButtonHold;
 1136            DCLBuilderBridge.OnZoomFromUI -= OnZoomFormUI;
 1137            DCLBuilderBridge.OnSetCameraPosition -= OnSetCameraPosition;
 1138            DCLBuilderBridge.OnSetCameraRotation -= OnSetCameraRotation;
 1139            DCLBuilderBridge.OnResetCameraZoom -= OnResetCameraZoom;
 1140            DCLBuilderObjectDragger.OnDraggingObjectStart -= OnDragObjectStart;
 1141            DCLBuilderObjectDragger.OnDraggingObjectEnd -= OnDragObjectEnd;
 1142            DCLBuilderGizmoManager.OnGizmoTransformObjectStart -= OnGizmoTransformObjectStart;
 1143            DCLBuilderGizmoManager.OnGizmoTransformObjectEnd -= OnGizmoTransformObjectEnd;
 1144            DCLBuilderConfig.OnConfigChanged -= OnConfigChanged;
 1145        }
 146
 147        private void OnMouseDrag(int buttonId, Vector3 mousePosition, float axisX, float axisY)
 148        {
 0149            if (buttonId == 0)
 150            {
 0151                if (CanOrbit())
 152                {
 0153                    yawTarget += axisX * yawAmount;
 0154                    pitchTarget = Mathf.Clamp(pitchTarget - axisY * pitchAmount, pitchAngleMin, pitchAngleMax);
 155                }
 0156            }
 0157            else if (buttonId == 1)
 158            {
 0159                Pan(0, -axisX * panAmount, -axisY * panAmount);
 160            }
 0161        }
 162
 0163        private void OnMouseWheel(float axisValue) { Zoom(Mathf.Sign(axisValue) * zoomAmount); }
 164
 165        private void OnKeyboardButtonHold(KeyCode keyCode)
 166        {
 167            switch (keyCode)
 168            {
 169                case KeyCode.UpArrow:
 0170                    Pan(panAmount, 0, 0);
 0171                    break;
 172                case KeyCode.DownArrow:
 0173                    Pan(-panAmount, 0, 0);
 0174                    break;
 175                case KeyCode.LeftArrow:
 0176                    Pan(0, -panAmount, 0);
 0177                    break;
 178                case KeyCode.RightArrow:
 0179                    Pan(0, panAmount, 0);
 180                    break;
 181            }
 0182        }
 183
 0184        private void OnZoomFormUI(float delta) { Zoom(-delta); }
 185
 186        private void Pan(float forward, float right, float up)
 187        {
 0188            Vector3 panOffset = ((yawPivot.right * right) + (pitchPivot.up * up) + (rootPivot.forward * forward));
 0189            panTarget += panOffset;
 0190        }
 191
 0192        private void Zoom(float amount) { zoomTarget = Mathf.Clamp(zoomTarget + amount, -zoomMax, -zoomMin); }
 193
 0194        private void OnDragObjectStart() { isObjectBeingDrag = true; }
 195
 196        private void OnDragObjectEnd()
 197        {
 0198            isObjectBeingDrag = false;
 0199            pitchTarget = pitchCurrent;
 0200            yawTarget = yawCurrent;
 0201        }
 202
 0203        private void OnGizmoTransformObjectStart(string gizmoType) { OnDragObjectStart(); }
 204
 0205        private void OnGizmoTransformObjectEnd(string gizmoType) { OnDragObjectEnd(); }
 206
 207        private void OnSetCameraPosition(Vector3 position)
 208        {
 0209            panCurrent = position;
 0210            rootPivot.transform.localPosition = panCurrent;
 0211            panTarget = panCurrent;
 0212            pitchCurrent += (pitchTarget - pitchCurrent) * Time.deltaTime * rotationSpeed;
 0213            pitchPivot.localRotation = Quaternion.Euler(pitchCurrent, 0, 0);
 0214        }
 215
 216        private void OnSetCameraRotation(float yaw, float pitch)
 217        {
 0218            yawCurrent = yawTarget = yaw;
 0219            pitchCurrent = pitchTarget = pitch;
 0220            yawPivot.localRotation = Quaternion.Euler(0, yawCurrent, 0);
 0221            pitchPivot.localRotation = Quaternion.Euler(pitchCurrent, 0, 0);
 0222        }
 223
 224        private void OnResetCameraZoom()
 225        {
 0226            zoomCurrent = zoomTarget = -zoomDefault;
 0227            builderCamera.transform.position.Set(0, 0, zoomCurrent);
 0228            OnCameraZoomChanged?.Invoke(builderCamera, zoomCurrent);
 0229        }
 230
 0231        private bool CanOrbit() { return !isObjectBeingDrag; }
 232
 233        private void CalcSceneBoundaries(IParcelScene scene)
 234        {
 0235            sceneBoundaryMin = Vector2.zero;
 0236            sceneBoundaryMax = Vector2.zero;
 237
 0238            if (scene != null && scene.sceneData != null)
 239            {
 0240                CalcSceneBoundaries(scene.sceneData);
 241            }
 0242        }
 243
 244        private void CalcSceneBoundaries(LoadParcelScenesMessage.UnityParcelScene scene)
 245        {
 0246            sceneBoundaryMin = Vector2.zero;
 0247            sceneBoundaryMax = Vector2.zero;
 248
 0249            if (scene.parcels.Length > 0)
 250            {
 0251                foreach (Vector2Int parcel in scene.parcels)
 252                {
 0253                    Vector3 parcelPosition = new Vector3(parcel.x, 0, parcel.y);
 0254                    sceneBoundaryMin.x = Mathf.Min(sceneBoundaryMin.x, parcelPosition.x);
 0255                    sceneBoundaryMin.y = Mathf.Min(sceneBoundaryMin.y, parcelPosition.z);
 0256                    sceneBoundaryMax.x = Mathf.Max(sceneBoundaryMax.x, parcelPosition.x);
 0257                    sceneBoundaryMax.y = Mathf.Max(sceneBoundaryMax.y, parcelPosition.z);
 258                }
 259            }
 0260        }
 261
 0262        private void OnPreviewModeChanged(bool isPreview) { gameObject.SetActive(!isPreview); }
 263
 264        private void OnConfigChanged(BuilderConfig config)
 265        {
 0266            zoomMin = config.camera.zoomMin;
 0267            zoomMax = config.camera.zoomMax;
 0268            zoomDefault = config.camera.zoomDefault;
 0269            zoomCurrent = zoomTarget = -zoomDefault;
 0270        }
 271    }
 272}