< Summary

Class:DCL.Backpack.BackpackPreviewPanel
Assembly:BackpackEditorHUDV2
File(s):/tmp/workspace/unity-renderer/unity-renderer/Assets/Scripts/MainScripts/DCL/Controllers/HUD/BackpackEditorHUDV2/BackpackPreviewPanel.cs
Covered lines:52
Uncovered lines:6
Coverable lines:58
Total lines:182
Line coverage:89.6% (52 of 58)
Covered branches:0
Total branches:0
Covered methods:17
Total methods:20
Method coverage:85% (17 of 20)

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity NPath complexity Sequence coverage
BackpackPreviewPanel()0%110100%
BackpackPreviewPanel()0%110100%
Initialize(...)0%110100%
Dispose()0%110100%
RefreshControl()0%2100%
SetPreviewEnabled(...)0%110100%
PlayPreviewEmote(...)0%110100%
PlayPreviewEmote(...)0%110100%
ResetPreviewEmote()0%110100%
ResetPreviewRotation()0%110100%
TryUpdatePreviewModelAsync()0%5.673033.33%
SetLoadingActive(...)0%110100%
TakeSnapshots(...)0%110100%
SetFocus(...)0%110100%
OnPreviewRotation(...)0%110100%
OnPreviewPanning(...)0%110100%
OnPreviewZoom(...)0%110100%
FixThePreviewRenderingSomehowRelatedToTheRenderScale(...)0%3.023087.5%

File(s)

/tmp/workspace/unity-renderer/unity-renderer/Assets/Scripts/MainScripts/DCL/Controllers/HUD/BackpackEditorHUDV2/BackpackPreviewPanel.cs

#LineLine coverage
 1using AvatarSystem;
 2using Cysharp.Threading.Tasks;
 3using MainScripts.DCL.Controllers.HUD.CharacterPreview;
 4using System;
 5using System.Collections.Generic;
 6using System.Threading;
 7using UnityEngine;
 8using UnityEngine.Rendering;
 9using UnityEngine.Rendering.Universal;
 10using UnityEngine.UI;
 11
 12namespace DCL.Backpack
 13{
 14    public class BackpackPreviewPanel : BaseComponentView
 15    {
 16        private const string RESET_PREVIEW_ANIMATION = "Idle";
 117        private static readonly Bounds CAMERA_LIMITS = new (
 18            new Vector3(0f, 0.85f, 2.4f),
 19            new Vector3(0f, 1.7f, 2.2f)
 20        );
 21        private const float CAMERA_ZOOM_CENTER = 1.4f;
 22        private const float CAMERA_ZOOM_BOTTOM_MAX_OFFSET = 1.1f;
 23        private const float CAMERA_ZOOM_TOP_MAX_OFFSET = 0.3f;
 24
 25        [SerializeField] private RectTransform avatarPreviewPanel;
 26        [SerializeField] private RawImage avatarPreviewImage;
 27        [SerializeField] internal GameObject avatarPreviewLoadingSpinner;
 28
 29        [Header("MOUSE INPUT CONFIGURATION")]
 30        [SerializeField] internal CharacterPreviewInputDetector characterPreviewInputDetector;
 31        [SerializeField] internal InputAction_Hold firstClickAction;
 32        [SerializeField] internal InputAction_Hold secondClickAction;
 33        [SerializeField] internal InputAction_Hold middleClickAction;
 34        [SerializeField] internal InputAction_Measurable mouseWheelAction;
 35
 36        [Header("ROTATE CONFIGURATION")]
 3637        [SerializeField] internal float rotationFactor = -30f;
 3638        [SerializeField] internal float slowDownTime = 0.5f;
 39        [SerializeField] internal Texture2D rotateCursorTexture;
 40
 41        [Header("PANNING CONFIGURATION")]
 3642        [SerializeField] internal float panSpeed = 0.2f;
 3643        [SerializeField] internal bool allowVerticalPanning = true;
 44        [SerializeField] internal bool allowHorizontalPanning = false;
 3645        [SerializeField] internal float panningInertiaDuration = 0.5f;
 46        [SerializeField] internal Texture2D panningCursorTexture;
 47
 48        [Header("ZOOM CONFIGURATION")]
 3649        [SerializeField] internal float zoomSpeed = 5.0f;
 3650        [SerializeField] internal float smoothTime = 0.2f;
 51
 52        public delegate void OnSnapshotsReady(Texture2D face256, Texture2D body);
 053        public IReadOnlyList<SkinnedMeshRenderer> originalVisibleRenderers => characterPreviewController?.originalVisibl
 054        public IAvatarEmotesController EmotesController => characterPreviewController.GetEmotesController();
 55
 56        private ICharacterPreviewController characterPreviewController;
 57        private IPreviewCameraRotationController avatarPreviewRotationController;
 58        private IPreviewCameraPanningController avatarPreviewPanningController;
 59        private IPreviewCameraZoomController avatarPreviewZoomController;
 3660        private float prevRenderScale = 1.0f;
 61
 62        public void Initialize(
 63            ICharacterPreviewFactory characterPreviewFactory,
 64            IPreviewCameraRotationController avatarPreviewRotationController,
 65            IPreviewCameraPanningController avatarPreviewPanningController,
 66            IPreviewCameraZoomController avatarPreviewZoomController)
 67        {
 3468            characterPreviewController = characterPreviewFactory.Create(
 69                loadingMode: CharacterPreviewMode.WithoutHologram,
 70                renderTexture: (RenderTexture) avatarPreviewImage.texture,
 71                isVisible: false,
 72                previewCameraFocus: PreviewCameraFocus.DefaultEditing,
 73                isAvatarShadowActive: true);
 3474            characterPreviewController.SetCameraLimits(CAMERA_LIMITS);
 3475            characterPreviewController.ConfigureZoom(
 76                CAMERA_ZOOM_CENTER, CAMERA_ZOOM_BOTTOM_MAX_OFFSET, CAMERA_ZOOM_TOP_MAX_OFFSET);
 3477            characterPreviewController.SetFocus(PreviewCameraFocus.DefaultEditing);
 78
 3479            this.avatarPreviewRotationController = avatarPreviewRotationController;
 3480            this.avatarPreviewRotationController.Configure(
 81                firstClickAction,
 82                rotationFactor,
 83                slowDownTime,
 84                characterPreviewInputDetector,
 85                rotateCursorTexture);
 3486            this.avatarPreviewRotationController.OnHorizontalRotation += OnPreviewRotation;
 87
 3488            this.avatarPreviewPanningController = avatarPreviewPanningController;
 3489            this.avatarPreviewPanningController.Configure(
 90                secondClickAction,
 91                middleClickAction,
 92                panSpeed,
 93                allowVerticalPanning,
 94                allowHorizontalPanning,
 95                panningInertiaDuration,
 96                characterPreviewInputDetector,
 97                panningCursorTexture);
 3498            this.avatarPreviewPanningController.OnPanning += OnPreviewPanning;
 99
 34100            this.avatarPreviewZoomController = avatarPreviewZoomController;
 34101            this.avatarPreviewZoomController.Configure(
 102                mouseWheelAction,
 103                zoomSpeed,
 104                smoothTime,
 105                characterPreviewInputDetector);
 34106            this.avatarPreviewZoomController.OnZoom += OnPreviewZoom;
 34107        }
 108
 109        public override void Dispose()
 110        {
 85111            base.Dispose();
 112
 85113            avatarPreviewRotationController.OnHorizontalRotation -= OnPreviewRotation;
 85114            avatarPreviewPanningController.OnPanning -= OnPreviewPanning;
 85115            avatarPreviewZoomController.OnZoom -= OnPreviewZoom;
 85116            avatarPreviewRotationController.Dispose();
 85117            avatarPreviewPanningController.Dispose();
 85118            avatarPreviewZoomController.Dispose();
 85119        }
 120
 0121        public override void RefreshControl() { }
 122
 123        public void SetPreviewEnabled(bool isEnabled)
 124        {
 4125            characterPreviewController.SetEnabled(isEnabled);
 4126            FixThePreviewRenderingSomehowRelatedToTheRenderScale(isEnabled);
 4127        }
 128
 129        public void PlayPreviewEmote(string emoteId) =>
 2130            characterPreviewController.PlayEmote(emoteId, (long)Time.realtimeSinceStartup);
 131
 132        public void PlayPreviewEmote(string emoteId, long timestamp) =>
 2133            characterPreviewController.PlayEmote(emoteId, timestamp);
 134
 135        public void ResetPreviewEmote() =>
 5136            characterPreviewController.StopEmote();
 137
 138        public void ResetPreviewRotation() =>
 5139            characterPreviewController.ResetRotation();
 140
 141        public async UniTask TryUpdatePreviewModelAsync(AvatarModel avatarModelToUpdate, CancellationToken ct) =>
 2142            await characterPreviewController.TryUpdateModelAsync(avatarModelToUpdate, ct);
 143
 144        public void SetLoadingActive(bool isActive) =>
 21145            avatarPreviewLoadingSpinner.SetActive(isActive);
 146
 147        public void TakeSnapshots(OnSnapshotsReady onSuccess, Action onFailed) =>
 1148            characterPreviewController.TakeSnapshots(
 0149                (face256, body) => onSuccess?.Invoke(face256, body),
 0150                () => onFailed?.Invoke());
 151
 152        public void SetFocus(PreviewCameraFocus focus, bool useTransition = true) =>
 8153            characterPreviewController.SetFocus(focus, useTransition);
 154
 155        private void OnPreviewRotation(float angularVelocity) =>
 2156            characterPreviewController.Rotate(angularVelocity);
 157
 158        private void OnPreviewPanning(Vector3 positionDelta) =>
 1159            characterPreviewController.MoveCamera(positionDelta, true);
 160
 161        private void OnPreviewZoom(Vector3 delta) =>
 1162            characterPreviewController.MoveCamera(delta, true);
 163
 164        // TODO: We have to investigate why we have to use this workaround to fix the preview rendering
 165        private void FixThePreviewRenderingSomehowRelatedToTheRenderScale(bool isEnabled)
 166        {
 167            // NOTE(Brian): SSAO doesn't work correctly with the offset avatar preview if the renderScale != 1.0
 4168            var asset = GraphicsSettings.renderPipelineAsset as UniversalRenderPipelineAsset;
 169
 4170            if (asset == null)
 0171                return;
 172
 4173            if (isEnabled)
 174            {
 2175                prevRenderScale = asset.renderScale;
 2176                asset.renderScale = 1.0f;
 177            }
 178            else
 2179                asset.renderScale = prevRenderScale;
 2180        }
 181    }
 182}