< Summary

Class:AvatarSystem.BaseAvatar
Assembly:AvatarSystem
File(s):/tmp/workspace/unity-renderer/unity-renderer/Assets/Scripts/MainScripts/DCL/AvatarSystem/BaseAvatar.cs
Covered lines:12
Uncovered lines:58
Coverable lines:70
Total lines:141
Line coverage:17.1% (12 of 70)
Covered branches:0
Total branches:0
Covered methods:2
Total methods:10
Method coverage:20% (2 of 10)

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity NPath complexity Sequence coverage
BaseAvatar()0%110100%
BaseAvatar(...)0%110100%
FadeGhost()0%30500%
Reveal()0%90900%
RevealInstantly(...)0%30500%
FadeOutGhostMaterial()0%2100%
SetRevealPosition(...)0%2100%
Dispose()0%30500%

File(s)

/tmp/workspace/unity-renderer/unity-renderer/Assets/Scripts/MainScripts/DCL/AvatarSystem/BaseAvatar.cs

#LineLine coverage
 1using System.Collections;
 2using System.Collections.Generic;
 3using System.Threading;
 4using Cysharp.Threading.Tasks;
 5using DCL.Helpers;
 6using DG.Tweening;
 7using UnityEngine;
 8using UnityEngine.Assertions;
 9
 10namespace AvatarSystem
 11{
 12    public class BaseAvatar : IBaseAvatar
 13    {
 114        internal static readonly int REVEAL_POSITION_ID = Shader.PropertyToID("_RevealPosition");
 115        internal static readonly int REVEAL_NORMAL_ID = Shader.PropertyToID("_RevealNormal");
 116        internal static readonly int COLOR_ID = Shader.PropertyToID("_Color");
 17
 18        internal readonly IBaseAvatarReferences baseAvatarReferences;
 219        internal readonly List<Material> cachedMaterials = new ();
 20        internal readonly Material ghostMaterial;
 21
 022        public SkinnedMeshRenderer SkinnedMeshRenderer => baseAvatarReferences.SkinnedMeshRenderer;
 023        public GameObject ArmatureContainer => baseAvatarReferences.ArmatureContainer.gameObject;
 24
 225        private CancellationTokenSource revealCts = new ();
 226        private CancellationTokenSource fadeInGhostCts = new ();
 27
 228        public BaseAvatar(IBaseAvatarReferences baseAvatarReferences)
 29        {
 230            Assert.IsNotNull(baseAvatarReferences.SkinnedMeshRenderer);
 31
 232            this.baseAvatarReferences = baseAvatarReferences;
 233            ghostMaterial = baseAvatarReferences.SkinnedMeshRenderer.material;
 234            ghostMaterial.SetColor(COLOR_ID, Utils.GetRandomColorInGradient(baseAvatarReferences.GhostMinColor, this.bas
 235        }
 36
 37        public async UniTask FadeGhost(CancellationToken cancellationToken = default)
 38        {
 039            fadeInGhostCts?.Cancel();
 040            fadeInGhostCts?.Dispose();
 041            fadeInGhostCts = new CancellationTokenSource();
 042            var linkedCts = CancellationTokenSource.CreateLinkedTokenSource(fadeInGhostCts.Token, cancellationToken);
 43
 44            //Reset revealing position for ghots material
 045            ghostMaterial.SetVector(REVEAL_NORMAL_ID, Vector3.up * -1);
 046            ghostMaterial.SetVector(REVEAL_POSITION_ID, Vector3.zero);
 47
 048            await ghostMaterial
 49                 .DOFade(1, COLOR_ID, baseAvatarReferences.FadeGhostSpeed)
 50                 .SetSpeedBased(true)
 51                 .ToUniTaskInstantCancelation(cancellationToken: linkedCts.Token);
 052        }
 53
 54        public async UniTask Reveal(Renderer targetRenderer, float avatarHeight, float completionHeight, CancellationTok
 55        {
 056            revealCts?.Cancel();
 057            revealCts?.Dispose();
 058            revealCts = new CancellationTokenSource();
 059            var linkedCts = CancellationTokenSource.CreateLinkedTokenSource(revealCts.Token, cancellationToken);
 60
 61            // keep a list to gather materials to avoid allocations
 062            cachedMaterials.Clear();
 063            targetRenderer?.GetMaterials(cachedMaterials);
 64
 65            UniTask GetRevealTask(Material material, float revealPosition, float completionPosition)
 66            {
 067                material.SetVector(REVEAL_NORMAL_ID, Vector3.up * -1);
 068                material.SetVector(REVEAL_POSITION_ID, Vector3.zero);
 69
 070                return material.DOVector(Vector3.up * revealPosition, REVEAL_POSITION_ID, baseAvatarReferences.RevealSpe
 71                               .SetSpeedBased(true)
 72                               .OnComplete(() =>
 73                                {
 074                                    baseAvatarReferences.ParticlesContainer.SetActive(false);
 075                                    SetRevealPosition(material, completionPosition);
 076                                })
 77                               .ToUniTaskInstantCancelation(true, cancellationToken: linkedCts.Token);
 78            }
 79
 80            try
 81            {
 082                baseAvatarReferences.ParticlesContainer.SetActive(true);
 083                List<UniTask> tasks = new List<UniTask>();
 084                tasks.Add(GetRevealTask(ghostMaterial, avatarHeight, completionHeight));
 85
 086                for (var index = 0; index < cachedMaterials.Count; index++) { tasks.Add(GetRevealTask(cachedMaterials[in
 87
 088                await UniTask.WhenAll(tasks);
 089            }
 90            finally
 91            {
 092                baseAvatarReferences.ParticlesContainer.SetActive(false);
 093                FadeOutGhostMaterial();
 94            }
 095        }
 96
 97        public void RevealInstantly(Renderer targetRenderer, float avatarHeight)
 98        {
 099            revealCts?.Cancel();
 0100            revealCts?.Dispose();
 0101            revealCts = null;
 102
 0103            cachedMaterials.Clear();
 0104            if(targetRenderer != null)
 0105                targetRenderer.GetMaterials(cachedMaterials);
 106
 0107            ghostMaterial.SetVector(REVEAL_NORMAL_ID, Vector3.up * -1);
 0108            SetRevealPosition(ghostMaterial, avatarHeight);
 109
 0110            for (var i = 0; i < cachedMaterials.Count; i++)
 111            {
 0112                cachedMaterials[i].SetVector(REVEAL_NORMAL_ID, Vector3.up * -1);
 0113                SetRevealPosition(cachedMaterials[i], -avatarHeight);
 114            }
 0115            baseAvatarReferences.ParticlesContainer.SetActive(false);
 0116            FadeOutGhostMaterial();
 0117        }
 118
 119        private void FadeOutGhostMaterial()
 120        {
 0121            Color color = ghostMaterial.GetColor(COLOR_ID);
 0122            color.a = 0;
 0123            ghostMaterial.color = color;
 0124        }
 125
 126        internal static void SetRevealPosition(Material material, float height)
 127        {
 0128            material.SetVector(REVEAL_POSITION_ID, Vector3.up * height);
 0129        }
 130
 131        public void Dispose()
 132        {
 0133            revealCts?.Cancel();
 0134            revealCts?.Dispose();
 0135            revealCts = null;
 0136            fadeInGhostCts?.Cancel();
 0137            fadeInGhostCts?.Dispose();
 0138            revealCts = fadeInGhostCts;
 0139        }
 140    }
 141}