< Summary

Class:DCL.Camera.CameraController
Assembly:Camera
File(s):/tmp/workspace/unity-renderer/unity-renderer/Assets/Scripts/MainScripts/DCL/Controllers/Camera/CameraController.cs
Covered lines:85
Uncovered lines:26
Coverable lines:111
Total lines:282
Line coverage:76.5% (85 of 111)
Covered branches:0
Total branches:0

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity NPath complexity Sequence coverage
CameraController()0%110100%
Awake()0%55095.65%
OnFullscreenUIVisibilityChange(...)0%12300%
OnOutputTextureChange(...)0%110100%
TryGetCameraStateByType[T](...)0%3.143075%
OnRenderingStateChanged(...)0%220100%
CameraBlocked_OnChange(...)0%6200%
OnMouseWheelChangeValue(...)0%72800%
OnCameraChangeAction(...)0%2.262060%
SetCameraMode(...)0%110100%
OnCameraModeChange(...)0%220100%
GetCameraMode(...)0%110100%
OnWorldReposition(...)0%110100%
Update()0%7.127086.67%
SetRotation(...)0%220100%
SetRotation(...)0%6200%
GetRotation()0%2.152066.67%
GetPosition()0%2100%
GetCamera()0%2100%
SetInvertYAxis(...)0%110100%
OnDestroy()0%330100%

File(s)

/tmp/workspace/unity-renderer/unity-renderer/Assets/Scripts/MainScripts/DCL/Controllers/Camera/CameraController.cs

#LineLine coverage
 1using System;
 2using System.Collections.Generic;
 3using System.Linq;
 4using Cinemachine;
 5using DCL.Helpers;
 6using DCL.Interface;
 7using DCL;
 8using UnityEngine;
 9
 10namespace DCL.Camera
 11{
 12    public class CameraController : MonoBehaviour
 13    {
 14        [SerializeField]
 15        internal new UnityEngine.Camera camera;
 16
 17        private Transform cameraTransform;
 18
 19        [SerializeField]
 20        internal CinemachineFreeLook thirdPersonCamera;
 21
 22        [Header("Virtual Cameras")]
 23        [SerializeField]
 24        internal CinemachineBrain cameraBrain;
 25
 26        [SerializeField]
 27        internal CameraStateBase[] cameraModes;
 28
 29        [Header("InputActions")]
 30        [SerializeField]
 31        internal InputAction_Trigger cameraChangeAction;
 32        [SerializeField]
 33        internal InputAction_Measurable mouseWheelAction;
 34
 35        internal Dictionary<CameraMode.ModeId, CameraStateBase> cachedModeToVirtualCamera;
 36
 37        public delegate void CameraBlendStarted();
 38
 39        public event CameraBlendStarted onCameraBlendStarted;
 40
 41        public delegate void CameraBlendFinished();
 42
 43        public event CameraBlendFinished onCameraBlendFinished;
 44
 45        private bool wasBlendingLastFrame;
 46
 59747        private float mouseWheelThreshold = 0.04f;
 48
 657049        private Vector3Variable cameraForward => CommonScriptableObjects.cameraForward;
 657050        private Vector3Variable cameraRight => CommonScriptableObjects.cameraRight;
 657051        private Vector3Variable cameraPosition => CommonScriptableObjects.cameraPosition;
 119252        private Vector3Variable worldOffset => CommonScriptableObjects.worldOffset;
 657053        private BooleanVariable cameraIsBlending => CommonScriptableObjects.cameraIsBlending;
 54
 660255        public CameraStateBase currentCameraState => cachedModeToVirtualCamera[CommonScriptableObjects.cameraMode];
 56
 57        [HideInInspector]
 58        public Action<CameraMode.ModeId> onSetCameraMode;
 59
 60        private void Awake()
 61        {
 59662            cameraTransform = this.camera.transform;
 63
 59664            CommonScriptableObjects.rendererState.OnChange += OnRenderingStateChanged;
 59665            OnRenderingStateChanged(CommonScriptableObjects.rendererState.Get(), false);
 66
 59667            CommonScriptableObjects.cameraBlocked.OnChange += CameraBlocked_OnChange;
 68
 417269            cachedModeToVirtualCamera = cameraModes.ToDictionary(x => x.cameraModeId, x => x);
 70
 59671            using (var iterator = cachedModeToVirtualCamera.GetEnumerator())
 72            {
 238473                while (iterator.MoveNext())
 74                {
 178875                    iterator.Current.Value.Initialize(camera);
 76                }
 59677            }
 78
 59679            cameraChangeAction.OnTriggered += OnCameraChangeAction;
 59680            mouseWheelAction.OnValueChanged += OnMouseWheelChangeValue;
 59681            worldOffset.OnChange += OnWorldReposition;
 59682            CommonScriptableObjects.cameraMode.OnChange += OnCameraModeChange;
 83
 59684            OnCameraModeChange(CommonScriptableObjects.cameraMode, CameraMode.ModeId.FirstPerson);
 85
 59686            if (CommonScriptableObjects.isFullscreenHUDOpen)
 087                OnFullscreenUIVisibilityChange(CommonScriptableObjects.isFullscreenHUDOpen.Get(), !CommonScriptableObjec
 88
 59689            CommonScriptableObjects.isFullscreenHUDOpen.OnChange += OnFullscreenUIVisibilityChange;
 90
 59691            DataStore.i.camera.outputTexture.OnChange += OnOutputTextureChange;
 59692            OnOutputTextureChange(DataStore.i.camera.outputTexture.Get(), null);
 93
 59694            DataStore.i.camera.invertYAxis.OnChange += SetInvertYAxis;
 59695            SetInvertYAxis(DataStore.i.camera.invertYAxis.Get(), false);
 96
 59697            wasBlendingLastFrame = false;
 59698        }
 99
 100        void OnFullscreenUIVisibilityChange(bool visibleState, bool prevVisibleState)
 101        {
 0102            if (visibleState == prevVisibleState)
 0103                return;
 104
 0105            camera.enabled = !visibleState && CommonScriptableObjects.rendererState.Get();
 0106        }
 107
 108        void OnOutputTextureChange(RenderTexture current, RenderTexture previous)
 109        {
 596110            camera.targetTexture = current;
 596111        }
 112
 113        public bool TryGetCameraStateByType<T>(out CameraStateBase searchedCameraState)
 114        {
 539115            foreach (CameraStateBase cameraMode in cameraModes)
 116            {
 231117                if (cameraMode.GetType() == typeof(T))
 118                {
 77119                    searchedCameraState = cameraMode;
 77120                    return true;
 121                }
 122            }
 123
 0124            searchedCameraState = null;
 0125            return false;
 126        }
 127
 128        private void OnRenderingStateChanged(bool enabled, bool prevState)
 129        {
 598130            camera.enabled = enabled && !CommonScriptableObjects.isFullscreenHUDOpen;
 598131        }
 132
 133        private void CameraBlocked_OnChange(bool current, bool previous)
 134        {
 0135            foreach (CameraStateBase cam in cameraModes)
 136            {
 0137                cam.OnBlock(current);
 138            }
 0139        }
 140
 141        private void OnMouseWheelChangeValue(DCLAction_Measurable action, float value)
 142        {
 0143            if (value > -mouseWheelThreshold && value < mouseWheelThreshold) return;
 0144            if (Utils.IsPointerOverUIElement()) return;
 145
 0146            if (CommonScriptableObjects.cameraMode == CameraMode.ModeId.FirstPerson && value < -mouseWheelThreshold)
 0147                SetCameraMode(CameraMode.ModeId.ThirdPerson);
 148
 0149            if (CommonScriptableObjects.cameraMode == CameraMode.ModeId.ThirdPerson && value > mouseWheelThreshold)
 0150                SetCameraMode(CameraMode.ModeId.FirstPerson);
 0151        }
 152
 153        private void OnCameraChangeAction(DCLAction_Trigger action)
 154        {
 1155            if (CommonScriptableObjects.cameraMode == CameraMode.ModeId.FirstPerson)
 156            {
 0157                SetCameraMode(CameraMode.ModeId.ThirdPerson);
 0158            }
 159            else
 160            {
 1161                SetCameraMode(CameraMode.ModeId.FirstPerson);
 162            }
 1163        }
 164
 165        public void SetCameraMode(CameraMode.ModeId newMode)
 166        {
 3167            CommonScriptableObjects.cameraMode.Set(newMode);
 3168        }
 169
 170        private void OnCameraModeChange(CameraMode.ModeId current, CameraMode.ModeId previous)
 171        {
 598172            cachedModeToVirtualCamera[previous].OnUnselect();
 598173            cachedModeToVirtualCamera[current].OnSelect();
 174
 598175            WebInterface.ReportCameraChanged(current);
 176
 598177            onSetCameraMode?.Invoke(current);
 2178        }
 179
 180        public CameraStateBase GetCameraMode(CameraMode.ModeId mode)
 181        {
 1713182            return cameraModes.FirstOrDefault(x => x.cameraModeId == mode);
 183        }
 184
 185        private void OnWorldReposition(Vector3 newValue, Vector3 oldValue)
 186        {
 2187            transform.position += newValue - oldValue;
 2188        }
 189
 190        private void Update()
 191        {
 6570192            cameraForward.Set(cameraTransform.forward);
 6570193            cameraRight.Set(cameraTransform.right);
 6570194            DataStore.i.camera.rotation.Set(cameraTransform.rotation);
 6570195            cameraPosition.Set(cameraTransform.position);
 6570196            cameraIsBlending.Set(cameraBrain.IsBlending);
 197
 6570198            if (cameraBrain.IsBlending)
 199            {
 101200                if (!wasBlendingLastFrame)
 38201                    onCameraBlendStarted?.Invoke();
 202
 101203                wasBlendingLastFrame = true;
 101204            }
 6469205            else if (wasBlendingLastFrame)
 206            {
 0207                onCameraBlendFinished?.Invoke();
 208
 0209                wasBlendingLastFrame = false;
 210            }
 211
 6570212            currentCameraState?.OnUpdate();
 6570213        }
 214
 215        public void SetRotation(string setRotationPayload)
 216        {
 6217            var payload = Utils.FromJsonWithNulls<SetRotationPayload>(setRotationPayload);
 6218            currentCameraState?.OnSetRotation(payload);
 6219        }
 220
 221        public void SetRotation(float x, float y, float z, Vector3? cameraTarget = null)
 222        {
 0223            currentCameraState?.OnSetRotation(new SetRotationPayload() { x = x, y = y, z = z, cameraTarget = cameraTarge
 0224        }
 225
 226        public Vector3 GetRotation()
 227        {
 12228            if (currentCameraState != null)
 12229                return currentCameraState.OnGetRotation();
 230
 0231            return Vector3.zero;
 232        }
 233
 234        public Vector3 GetPosition()
 235        {
 0236            return CinemachineCore.Instance.GetActiveBrain(0).ActiveVirtualCamera.State.FinalPosition;
 237        }
 238
 239        public UnityEngine.Camera GetCamera()
 240        {
 0241            return camera;
 242        }
 243
 244        private void SetInvertYAxis(bool current, bool previous)
 245        {
 609246            thirdPersonCamera.m_YAxis.m_InvertInput = !current;
 609247        }
 248
 249        private void OnDestroy()
 250        {
 596251            if (cachedModeToVirtualCamera != null)
 252            {
 596253                using (var iterator = cachedModeToVirtualCamera.GetEnumerator())
 254                {
 2384255                    while (iterator.MoveNext())
 256                    {
 1788257                        iterator.Current.Value.Cleanup();
 258                    }
 596259                }
 260            }
 261
 596262            worldOffset.OnChange -= OnWorldReposition;
 596263            cameraChangeAction.OnTriggered -= OnCameraChangeAction;
 596264            mouseWheelAction.OnValueChanged -= OnMouseWheelChangeValue;
 596265            CommonScriptableObjects.rendererState.OnChange -= OnRenderingStateChanged;
 596266            CommonScriptableObjects.cameraBlocked.OnChange -= CameraBlocked_OnChange;
 596267            CommonScriptableObjects.isFullscreenHUDOpen.OnChange -= OnFullscreenUIVisibilityChange;
 596268            CommonScriptableObjects.cameraMode.OnChange -= OnCameraModeChange;
 596269            DataStore.i.camera.outputTexture.OnChange -= OnOutputTextureChange;
 596270            DataStore.i.camera.invertYAxis.OnChange -= SetInvertYAxis;
 596271        }
 272
 273        [Serializable]
 274        public class SetRotationPayload
 275        {
 276            public float x;
 277            public float y;
 278            public float z;
 279            public Vector3? cameraTarget;
 280        }
 281    }
 282}