< Summary

Class:OutlinerController
Assembly:OutlinerPlugin
File(s):/tmp/workspace/unity-renderer/unity-renderer/Assets/DCLPlugins/OutlinerPlugin/OutlinerController.cs
Covered lines:19
Uncovered lines:34
Coverable lines:53
Total lines:114
Line coverage:35.8% (19 of 53)
Covered branches:0
Total branches:0

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity NPath complexity Sequence coverage
OutlinerController(...)0%110100%
OnAvatarOutlinedChange(...)0%72800%
FadeInOutlineAsync()0%30500%
FadeOutOutlineAsync()0%30500%
Dispose()0%330100%

File(s)

/tmp/workspace/unity-renderer/unity-renderer/Assets/DCLPlugins/OutlinerPlugin/OutlinerController.cs

#LineLine coverage
 1using Cysharp.Threading.Tasks;
 2using DCL;
 3using System;
 4using System.Linq;
 5using System.Reflection;
 6using System.Threading;
 7using UnityEngine;
 8using UnityEngine.Rendering;
 9using UnityEngine.Rendering.Universal;
 10
 11public class OutlinerController : IDisposable
 12{
 13
 14    private readonly DataStore_Outliner dataStore;
 15    private readonly OutlineRenderersSO outlineRenderersSO;
 16    private readonly OutlineScreenEffectFeature outlineScreenEffectFeature;
 17    private readonly OutlineMaskFeature outlineMaskFeature;
 18
 119    private CancellationTokenSource animationCTS = new CancellationTokenSource();
 20    private bool shouldShow;
 21
 122    public OutlinerController(DataStore_Outliner dataStore, OutlineRenderersSO outlineRenderersSO)
 23    {
 124        this.dataStore = dataStore;
 125        this.outlineRenderersSO = outlineRenderersSO;
 26
 127        outlineMaskFeature = Resources.FindObjectsOfTypeAll<OutlineMaskFeature>().FirstOrDefault();
 128        outlineScreenEffectFeature = Resources.FindObjectsOfTypeAll<OutlineScreenEffectFeature>().FirstOrDefault();
 129        outlineMaskFeature.SetActive(true);
 130        outlineScreenEffectFeature.SetActive(true);
 131        outlineScreenEffectFeature.settings.effectFade = 0;
 132        shouldShow = false;
 33
 134        this.dataStore.avatarOutlined.OnChange += OnAvatarOutlinedChange;
 135    }
 36
 37    private void OnAvatarOutlinedChange((Renderer renderer, int meshCount, float avatarHeight) current, (Renderer render
 38    {
 039        if (current.renderer != null)
 40        {
 041            outlineRenderersSO.avatar = current;
 42            //We are currently showing (or animating towards showing), nothing else to do
 043            if (shouldShow)
 044                return;
 45
 046            shouldShow = true;
 047            animationCTS?.Cancel();
 048            animationCTS?.Dispose();
 049            animationCTS = new CancellationTokenSource();
 050            FadeInOutlineAsync(animationCTS.Token).Forget();
 51        }
 52        else //We have to fade out and then clear the scriptable object
 53        {
 54            //We are already fade out (or animating towards it)
 055            if (!shouldShow)
 056                return;
 57
 058            shouldShow = false;
 059            animationCTS?.Cancel();
 060            animationCTS?.Dispose();
 061            animationCTS = new CancellationTokenSource();
 062            FadeOutOutlineAsync(animationCTS.Token).Forget();
 63        }
 064    }
 65
 66    private async UniTaskVoid FadeInOutlineAsync(CancellationToken ct = default)
 67    {
 68        const float SPEED = 1 / 0.333f; // 300ms
 69        const float SHOW_FADE = 1;
 70
 071        var settings = outlineScreenEffectFeature.settings;
 72
 073        while (!Mathf.Approximately(settings.effectFade, SHOW_FADE))
 74        {
 075            if (ct.IsCancellationRequested)
 076                return;
 77
 078            settings.effectFade = Mathf.MoveTowards(outlineScreenEffectFeature.settings.effectFade, SHOW_FADE, SPEED * T
 079            await UniTask.NextFrame(ct);
 80        }
 81
 082        settings.effectFade = SHOW_FADE;
 083    }
 84
 85    private async UniTaskVoid FadeOutOutlineAsync(CancellationToken ct = default)
 86    {
 87        const float SPEED = 1 / 0.333f; // 300ms
 88        const float HIDE_FADE = 0;
 89
 090        var settings = outlineScreenEffectFeature.settings;
 91
 092        while (!Mathf.Approximately(settings.effectFade, HIDE_FADE))
 93        {
 094            if (ct.IsCancellationRequested)
 095                return;
 96
 097            settings.effectFade = Mathf.MoveTowards(outlineScreenEffectFeature.settings.effectFade, HIDE_FADE, SPEED * T
 098            await UniTask.NextFrame(ct);
 99        }
 100
 0101        settings.effectFade = HIDE_FADE;
 0102        outlineRenderersSO.avatar = (null, -1, -1);
 0103    }
 104
 105    public void Dispose()
 106    {
 1107        this.dataStore.avatarOutlined.OnChange -= OnAvatarOutlinedChange;
 1108        animationCTS?.Cancel();
 1109        animationCTS?.Dispose();
 1110        animationCTS = null;
 1111        outlineMaskFeature.SetActive(false);
 1112        outlineScreenEffectFeature.SetActive(false);
 1113    }
 114}