< Summary

Class:BaseAvatarReveal
Assembly:AvatarReveal
File(s):/tmp/workspace/unity-renderer/unity-renderer/Assets/Rendering/LoadingAvatar/CrossSection/BaseAvatarReveal.cs
Covered lines:0
Uncovered lines:74
Coverable lines:74
Total lines:181
Line coverage:0% (0 of 74)
Covered branches:0
Total branches:0

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity NPath complexity Sequence coverage
BaseAvatarReveal()0%2100%
Start()0%6200%
GetMainRenderer()0%2100%
InitializeColorGradient()0%2100%
InjectLodSystem(...)0%2100%
AddTarget(...)0%20400%
StartAvatarRevealAnimation()0%56700%
UpdateRevealerPosition()0%20400%
FadeInGhostMaterial()0%20400%
OnRevealAnimationEnd()0%2100%
SetFullRendered()0%12300%
Reset()0%2100%
DisableParticleEffects()0%6200%
OnDisable()0%2100%

File(s)

/tmp/workspace/unity-renderer/unity-renderer/Assets/Rendering/LoadingAvatar/CrossSection/BaseAvatarReveal.cs

#LineLine coverage
 1using System;
 2using System.Collections;
 3using System.Collections.Generic;
 4using System.Threading;
 5using UnityEngine;
 6using DCL.Helpers;
 7using DCL;
 8using AvatarSystem;
 9using Cysharp.Threading.Tasks;
 10using Random = UnityEngine.Random;
 11
 12public class BaseAvatarReveal : MonoBehaviour, IBaseAvatarRevealer
 13{
 14    [SerializeField] private Animation animation;
 15    [SerializeField] private List<GameObject> particleEffects;
 16
 17    [ColorUsageAttribute(true, true, 0f, 8f, 0.125f, 3f)]
 18    public Color baseColor;
 19    [ColorUsageAttribute(true, true, 0f, 8f, 0.125f, 3f)]
 20    public Color maxColor;
 21
 22    public SkinnedMeshRenderer meshRenderer;
 23    public bool avatarLoaded;
 24    public GameObject revealer;
 25
 26    private ILOD lod;
 27
 28    public float fadeInSpeed;
 29    Material _ghostMaterial;
 30
 31    private float startH;
 32    private float startS;
 33    private float startV;
 34    private float endH;
 35    private float endS;
 36    private float endV;
 37    private bool isRevealing;
 38
 039    public List<Renderer> targets = new List<Renderer>();
 040    List<Material> _materials = new List<Material>();
 41    private Coroutine updateAvatarRevealerRoutine = null;
 42
 43    private void Start()
 44    {
 045        _ghostMaterial = meshRenderer.material;
 046        InitializeColorGradient();
 047        foreach (Renderer r in targets)
 48        {
 049            _materials.Add(r.material);
 50        }
 051        FadeInGhostMaterial();
 052    }
 53
 54    public SkinnedMeshRenderer GetMainRenderer()
 55    {
 056        return meshRenderer;
 57    }
 58
 59    private void InitializeColorGradient()
 60    {
 061        Color.RGBToHSV(baseColor, out startH, out startS, out startV);
 062        Color.RGBToHSV(maxColor, out endH, out endS, out endV);
 063        Color newColor = Color.HSVToRGB(Random.Range(startH, endH), startS, startV);
 064        _ghostMaterial.SetColor("_Color", new Color(newColor.r, newColor.g, newColor.b, 0));
 065    }
 66
 67    public void InjectLodSystem(ILOD lod)
 68    {
 069        this.lod = lod;
 070    }
 71
 72    public void AddTarget(MeshRenderer newTarget)
 73    {
 074        if (newTarget == null)
 075            return;
 76
 077        targets.Add(newTarget);
 078        newTarget?.material.SetVector("_RevealPosition", Vector3.zero);
 079        newTarget?.material.SetVector("_RevealNormal", new Vector3(0, -1, 0));
 080        _materials.Add(newTarget.material);
 081    }
 82
 83    public async UniTask StartAvatarRevealAnimation(bool withTransition, CancellationToken cancellationToken)
 84    {
 085        updateAvatarRevealerRoutine = StartCoroutine(UpdateRevealerPosition());
 86        try
 87        {
 088            if (!withTransition || lod.lodIndex >= 2)
 89            {
 090                SetFullRendered();
 091                return;
 92            }
 93
 094            isRevealing = true;
 095            animation.Play();
 096            await UniTask.WaitUntil(() => !isRevealing, cancellationToken: cancellationToken).AttachExternalCancellation
 097        }
 098        catch(OperationCanceledException)
 99        {
 0100            SetFullRendered();
 0101        }
 102        finally
 103        {
 0104            StopCoroutine(updateAvatarRevealerRoutine);
 0105            SetFullRendered();
 106        }
 0107    }
 108
 109    private IEnumerator UpdateRevealerPosition()
 110    {
 0111        _ghostMaterial.SetVector("_RevealPosition", revealer.transform.localPosition);
 0112        while(true)
 113        {
 0114            foreach (Material m in _materials)
 115            {
 0116                m.SetVector("_RevealPosition", -revealer.transform.localPosition);
 117            }
 0118            yield return new WaitForSeconds(0.01f);
 119        }
 120    }
 121
 122    private async UniTask FadeInGhostMaterial()
 123    {
 124        Color gColor;
 125        Color tempColor;
 0126        while(_ghostMaterial.GetColor("_Color").a < 0.9f)
 127        {
 0128            gColor = _ghostMaterial.GetColor("_Color");
 0129            tempColor = new Color(gColor.r, gColor.g, gColor.b, gColor.a + Time.deltaTime * fadeInSpeed);
 0130            _ghostMaterial.SetColor("_Color", tempColor);
 131
 0132            await UniTask.Delay(50);
 133        }
 0134    }
 135
 136    public void OnRevealAnimationEnd()
 137    {
 0138        isRevealing = false;
 0139        meshRenderer.enabled = false;
 0140    }
 141
 142    private void SetFullRendered()
 143    {
 0144        meshRenderer.enabled = false;
 0145        animation.Stop();
 146        const float REVEALED_POSITION = -10;
 0147        revealer.transform.position = new Vector3(0, REVEALED_POSITION, 0);
 0148        foreach (Material m in _materials)
 149        {
 0150            m.SetVector("_RevealPosition", new Vector3(0, REVEALED_POSITION, 0));
 151        }
 0152        _ghostMaterial?.SetVector("_RevealPosition", new Vector3(0, 2.5f, 0));
 0153        DisableParticleEffects();
 0154        avatarLoaded = true;
 0155    }
 156
 157    public void Reset()
 158    {
 0159        Color gColor = _ghostMaterial.GetColor("_Color");
 0160        Color tempColor = new Color(gColor.r, gColor.g, gColor.b, 0);
 0161        _ghostMaterial.SetColor("_Color", tempColor);
 0162        avatarLoaded = false;
 0163        meshRenderer.enabled = true;
 0164        targets = new List<Renderer>();
 0165        _materials = new List<Material>();
 0166        revealer.transform.position = Vector3.zero;
 0167    }
 168
 169    private void DisableParticleEffects()
 170    {
 0171        foreach (GameObject p in particleEffects)
 172        {
 0173            p.SetActive(false);
 174        }
 0175    }
 176
 177    public void OnDisable()
 178    {
 0179        SetFullRendered();
 0180    }
 181}