< Summary

Class:DCL.ECSComponents.AvatarShapeComponentHandler
Assembly:DCL.ECSComponents.AvatarShape
File(s):/tmp/workspace/unity-renderer/unity-renderer/Assets/DCLPlugins/ECS7/ECSComponents/AvatarShape/Handler/AvatarShapeComponentHandler.cs
Covered lines:0
Uncovered lines:39
Coverable lines:39
Total lines:105
Line coverage:0% (0 of 39)
Covered branches:0
Total branches:0
Covered methods:0
Total methods:6
Method coverage:0% (0 of 6)

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity NPath complexity Sequence coverage
AvatarShapeComponentHandler(...)0%2100%
OnComponentCreated(...)0%2100%
OnComponentRemoved(...)0%12300%
OnComponentModelUpdated(...)0%20400%
OnCombinedRendererUpdate(...)0%6200%
IsRendererGoingToChange(...)0%6200%

File(s)

/tmp/workspace/unity-renderer/unity-renderer/Assets/DCLPlugins/ECS7/ECSComponents/AvatarShape/Handler/AvatarShapeComponentHandler.cs

#LineLine coverage
 1using DCL.Controllers;
 2using DCL.ECS7.InternalComponents;
 3using DCL.ECSRuntime;
 4using DCL.Models;
 5using UnityEngine;
 6
 7namespace DCL.ECSComponents
 8{
 9    /// <summary>
 10    /// This class will handle the avatar shape for the global scenes and the scenes that use it
 11    /// Take into account that this component uses a pool to manage the prefabs
 12    /// </summary>
 13    public class AvatarShapeComponentHandler : IECSComponentHandler<PBAvatarShape>
 14    {
 15        internal IAvatarShape avatar;
 16        private readonly Pool pool;
 17        private readonly PoolableObject poolableObject;
 18        private readonly IInternalECSComponent<InternalRenderers> renderersInternalComponent;
 19        private IParcelScene scene;
 20        private IDCLEntity entity;
 21        private Renderer renderer;
 22        private PBAvatarShape prevModel;
 23
 24        private bool isAvatarInitialized = false;
 25
 026        public AvatarShapeComponentHandler(Pool pool, IInternalECSComponent<InternalRenderers> renderersComponent)
 27        {
 028            this.pool = pool;
 029            poolableObject = pool.Get();
 030            renderersInternalComponent = renderersComponent;
 031            avatar = poolableObject.gameObject.GetComponent<AvatarShape>();
 032        }
 33
 34        public void OnComponentCreated(IParcelScene scene, IDCLEntity entity)
 35        {
 036            this.scene = scene;
 037            this.entity = entity;
 38
 039            avatar.transform.SetParent(entity.gameObject.transform, false);
 40
 041            avatar.internalAvatar.OnCombinedRendererUpdate += OnCombinedRendererUpdate;
 042        }
 43
 44        public void OnComponentRemoved(IParcelScene scene, IDCLEntity entity)
 45        {
 046            if (avatar == null)
 047                return;
 48
 049            avatar.internalAvatar.OnCombinedRendererUpdate -= OnCombinedRendererUpdate;
 50
 051            if (renderer)
 52            {
 053                renderersInternalComponent.RemoveRenderer(scene, entity, renderer);
 54            }
 55
 056            avatar.Cleanup();
 057            pool.Release(poolableObject);
 058            avatar = null;
 059            isAvatarInitialized = false;
 060        }
 61
 62        public void OnComponentModelUpdated(IParcelScene scene, IDCLEntity entity, PBAvatarShape model)
 63        {
 064            if (!isAvatarInitialized)
 65            {
 066                avatar.Init();
 067                isAvatarInitialized = true;
 68            }
 69
 70            // We assume avatar combined renderer is going to change by checking equality
 71            // between model update
 72            // we should refactor this avatar shape handler
 73            // so the assumption is fair enough for the moment
 074            if (renderer && IsRendererGoingToChange(model, prevModel))
 75            {
 076                renderersInternalComponent.RemoveRenderer(scene, entity, renderer);
 77            }
 78
 079            prevModel = model;
 080            avatar.ApplyModel(scene, entity, model);
 081        }
 82
 83        private void OnCombinedRendererUpdate(Renderer newRenderer)
 84        {
 085            if (renderer)
 86            {
 087                renderersInternalComponent.RemoveRenderer(scene, entity, renderer);
 88            }
 89
 090            renderersInternalComponent.AddRenderer(scene, entity, newRenderer);
 091            renderer = newRenderer;
 092        }
 93
 94        private static bool IsRendererGoingToChange(PBAvatarShape newModel, PBAvatarShape prevModel)
 95        {
 096            if (prevModel == null) return false;
 97
 098            prevModel.ExpressionTriggerId = newModel.ExpressionTriggerId;
 099            prevModel.ExpressionTriggerTimestamp = newModel.ExpressionTriggerTimestamp;
 0100            prevModel.Talking = newModel.Talking;
 101
 0102            return !prevModel.Equals(newModel);
 103        }
 104    }
 105}