< Summary

Class:PlayerName
Assembly:PlayerName
File(s):/tmp/workspace/unity-renderer/unity-renderer/Assets/Scripts/MainScripts/DCL/Controllers/PlayerName/PlayerName.cs
Covered lines:65
Uncovered lines:19
Coverable lines:84
Total lines:185
Line coverage:77.3% (65 of 84)
Covered branches:0
Total branches:0

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity NPath complexity Sequence coverage
PlayerName()0%110100%
PlayerName()0%110100%
Awake()0%110100%
OnNamesOpacityChanged(...)0%110100%
OnNamesVisibleChanged(...)0%330100%
SetName(...)0%110100%
AsyncSetName()0%3.333066.67%
Update()0%110100%
Update(...)0%7.057090%
LookAtCamera(...)0%110100%
Show(...)0%220100%
Hide(...)0%330100%
AddVisibilityConstaint(...)0%2100%
RemoveVisibilityConstaint(...)0%2100%
SetForceShow(...)0%42600%
SetIsTalking(...)0%2100%
SetYOffset(...)0%2100%
ScreenSpaceRect(...)0%2100%
ScreenSpacePos(...)0%110100%
ResolveAlphaByDistance(...)0%3.583060%
UpdateVisuals(...)0%110100%
ScalePivotByDistance(...)0%110100%
GetPivotYOffsetByDistance(...)0%2.152066.67%
OnDestroy()0%110100%

File(s)

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

#LineLine coverage
 1using System;
 2using System.Collections.Generic;
 3using Cysharp.Threading.Tasks;
 4using DCL;
 5using TMPro;
 6using UnityEngine;
 7using UnityEngine.UI;
 8
 9[Serializable]
 10public class PlayerName : MonoBehaviour, IPlayerName
 11{
 12    internal const int DEFAULT_CANVAS_SORTING_ORDER = 0;
 13    internal const int FORCE_CANVAS_SORTING_ORDER = 40;
 114    internal static readonly int TALKING_ANIMATOR_BOOL = Animator.StringToHash("Talking");
 15    internal const float ALPHA_TRANSITION_STEP_PER_SECOND =  1f / 0.25f;
 16    internal const float TARGET_ALPHA_SHOW = 1;
 17    internal const float TARGET_ALPHA_HIDE = 0;
 18    internal const int BACKGROUND_HEIGHT = 30;
 19    internal const int BACKGROUND_EXTRA_WIDTH = 10;
 20
 21    [SerializeField] internal Canvas canvas;
 22    [SerializeField] internal CanvasGroup canvasGroup;
 23    [SerializeField] internal TextMeshProUGUI nameText;
 24    [SerializeField] internal Image background;
 25    [SerializeField] internal Transform pivot;
 26    [SerializeField] internal Animator talkingAnimator;
 27
 127228    internal BaseVariable<float> namesOpacity => DataStore.i.HUDs.avatarNamesOpacity;
 127229    internal BaseVariable<bool> namesVisible => DataStore.i.HUDs.avatarNamesVisible;
 30
 31    internal float alpha;
 32    internal float targetAlpha;
 33    internal bool forceShow = false;
 34    internal Color backgroundOriginalColor;
 42835    internal List<string> hideConstraints = new List<string>();
 36
 37    private void Awake()
 38    {
 42439        backgroundOriginalColor = background.color;
 42440        canvas.sortingOrder = DEFAULT_CANVAS_SORTING_ORDER;
 42441        namesVisible.OnChange += OnNamesVisibleChanged;
 42442        namesOpacity.OnChange += OnNamesOpacityChanged;
 42443        OnNamesVisibleChanged(namesVisible.Get(), true);
 42444        OnNamesOpacityChanged(namesOpacity.Get(), 1);
 42445        Show(true);
 42446    }
 86047    internal void OnNamesOpacityChanged(float current, float previous) { background.color = new Color(backgroundOriginal
 48
 85249    internal void OnNamesVisibleChanged(bool current, bool previous) { canvas.enabled = current || forceShow; }
 50
 851    public void SetName(string name) { AsyncSetName(name).Forget(); }
 52    private async UniTaskVoid AsyncSetName(string name)
 53    {
 454        name = await ProfanityFilterSharedInstances.regexFilter.Filter(name);
 455        nameText.text = name;
 456        background.rectTransform.sizeDelta = new Vector2(nameText.GetPreferredValues().x + BACKGROUND_EXTRA_WIDTH, BACKG
 457    }
 58
 8659    private void Update() { Update(Time.deltaTime); }
 60
 61    internal void Update(float deltaTime)
 62    {
 4663        if (hideConstraints.Count > 0)
 64        {
 065            UpdateVisuals(0);
 066            return;
 67        }
 68
 4669        float finalTargetAlpha = forceShow ? TARGET_ALPHA_SHOW : targetAlpha;
 70
 4671        if (!Mathf.Approximately(alpha, finalTargetAlpha))
 2172            alpha = Mathf.MoveTowards(alpha, finalTargetAlpha, ALPHA_TRANSITION_STEP_PER_SECOND * deltaTime);
 2573        else if (alpha == 0)
 74        {
 175            UpdateVisuals(0);
 76            // We are hidden and we dont have to scale, look at camera or anything, we can disable the gameObject
 177            gameObject.SetActive(false);
 178            return;
 79        }
 4580        Vector3 cameraPosition = CommonScriptableObjects.cameraPosition.Get();
 4581        Vector3 cameraRight = CommonScriptableObjects.cameraRight.Get();
 4582        Quaternion cameraRotation = DataStore.i.camera.rotation.Get();
 83
 84        /*
 85         * TODO: We could obtain distance to player from the AvatarLODController but that coupling it's overkill and ugl
 86         * instead we should have a provider so all the subsystems can use it
 87         */
 4588        float distanceToCamera = Vector3.Distance(cameraPosition, gameObject.transform.position);
 4589        float resolvedAlpha = forceShow ? TARGET_ALPHA_SHOW : ResolveAlphaByDistance(alpha, distanceToCamera, forceShow)
 4590        UpdateVisuals(resolvedAlpha);
 4591        ScalePivotByDistance(distanceToCamera);
 4592        LookAtCamera(cameraRight, cameraRotation.eulerAngles);
 4593        pivot.transform.localPosition = Vector3.up * GetPivotYOffsetByDistance(distanceToCamera);
 4594    }
 95
 96    internal void LookAtCamera(Vector3 cameraRight, Vector3 cameraEulerAngles)
 97    {
 4698        Transform cachedTransform = transform;
 4699        cachedTransform.right = -cameraRight; // This will set the Y rotation
 100
 101        // Now we use the negated X axis rotation to make the rotation steady in horizont
 46102        Vector3 finalEulerAngle = cachedTransform.localEulerAngles;
 46103        finalEulerAngle.x = -cameraEulerAngles.x;
 46104        cachedTransform.localEulerAngles = finalEulerAngle;
 46105    }
 106
 107    public void Show(bool instant = false)
 108    {
 435109        targetAlpha = TARGET_ALPHA_SHOW;
 435110        gameObject.SetActive(true);
 435111        if (instant)
 424112            alpha = TARGET_ALPHA_SHOW;
 435113    }
 114
 115    public void Hide(bool instant = false)
 116    {
 19117        targetAlpha = TARGET_ALPHA_HIDE;
 19118        if (instant && !forceShow)
 119        {
 4120            alpha = TARGET_ALPHA_HIDE;
 4121            gameObject.SetActive(false);
 122        }
 19123    }
 124
 125    // Note: Ideally we should separate the LODController logic from this one so we don't have to add constraints
 0126    public void AddVisibilityConstaint(string constraint) { hideConstraints.Add(constraint); }
 127
 0128    public void RemoveVisibilityConstaint(string constraint) { hideConstraints.Remove(constraint); }
 129
 130    public void SetForceShow(bool forceShow)
 131    {
 0132        canvas.enabled = forceShow || namesVisible.Get();
 0133        canvas.sortingOrder = forceShow ? FORCE_CANVAS_SORTING_ORDER : DEFAULT_CANVAS_SORTING_ORDER;
 0134        background.color = new Color(backgroundOriginalColor.r, backgroundOriginalColor.g, backgroundOriginalColor.b, fo
 0135        this.forceShow = forceShow;
 0136        if (this.forceShow)
 0137            gameObject.SetActive(true);
 0138    }
 139
 0140    public void SetIsTalking(bool talking) { talkingAnimator.SetBool(TALKING_ANIMATOR_BOOL, talking); }
 141
 0142    public void SetYOffset(float yOffset) { transform.localPosition = Vector3.up * yOffset; }
 143
 144    public Rect ScreenSpaceRect(Camera mainCamera)
 145    {
 0146        Vector3 origin = mainCamera.WorldToScreenPoint(background.transform.position);
 0147        Vector2 size = background.rectTransform.sizeDelta;
 0148        return new Rect(origin.x, Screen.height - origin.y, size.x, size.y);
 149    }
 150
 23151    public Vector3 ScreenSpacePos(Camera mainCamera) { return mainCamera.WorldToScreenPoint(background.transform.positio
 152
 153    internal static float ResolveAlphaByDistance(float alphaValue, float distanceToCamera, bool forceShow)
 154    {
 45155        if (forceShow)
 0156            return alphaValue;
 157
 158        const float MIN_DISTANCE = 5;
 45159        if (distanceToCamera < MIN_DISTANCE)
 45160            return alphaValue;
 161
 0162        return alphaValue * Mathf.Lerp(1, 0, (distanceToCamera - MIN_DISTANCE) / (DataStore.i.avatarsLOD.LODDistance.Get
 163    }
 164
 92165    internal void UpdateVisuals(float resolvedAlpha) { canvasGroup.alpha = resolvedAlpha; }
 166
 90167    internal void ScalePivotByDistance(float distanceToCamera) { pivot.transform.localScale = Vector3.one * 0.15f * dist
 168
 169    internal float GetPivotYOffsetByDistance(float distanceToCamera)
 170    {
 171        const float NEAR_Y_OFFSET = 0f;
 172        const float FAR_Y_OFFSET = 0.1f;
 173        const float MAX_DISTANCE = 5;
 45174        if (distanceToCamera >= MAX_DISTANCE)
 0175            return FAR_Y_OFFSET;
 176
 45177        return Mathf.Lerp(NEAR_Y_OFFSET, FAR_Y_OFFSET, distanceToCamera / MAX_DISTANCE);
 178    }
 179
 180    private void OnDestroy()
 181    {
 424182        namesVisible.OnChange -= OnNamesVisibleChanged;
 424183        namesOpacity.OnChange -= OnNamesOpacityChanged;
 424184    }
 185}