< Summary

Class:ECSSystems.VideoPlayerSystem.ECSVideoPlayerSystem
Assembly:ECS7Plugin.Systems.VideoPlayer
File(s):/tmp/workspace/unity-renderer/unity-renderer/Assets/DCLPlugins/ECS7/Systems/VideoPlayerSystem/ECSVideoPlayerSystem.cs
Covered lines:58
Uncovered lines:1
Coverable lines:59
Total lines:152
Line coverage:98.3% (58 of 59)
Covered branches:0
Total branches:0
Covered methods:6
Total methods:6
Method coverage:100% (6 of 6)

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity NPath complexity Sequence coverage
ECSVideoPlayerSystem(...)0%110100%
ECSVideoPlayerSystem()0%110100%
Update()0%440100%
UpdateVideoEvent(...)0%88096.3%
UpdateVideoMaterial(...)0%550100%
IsMaterialAssigned(...)0%110100%

File(s)

/tmp/workspace/unity-renderer/unity-renderer/Assets/DCLPlugins/ECS7/Systems/VideoPlayerSystem/ECSVideoPlayerSystem.cs

#LineLine coverage
 1using DCL.ECS7;
 2using DCL.ECS7.ComponentWrapper.Generic;
 3using DCL.ECS7.InternalComponents;
 4using DCL.ECSComponents;
 5using DCL.ECSRuntime;
 6using DCL.Models;
 7using System.Collections.Generic;
 8using System.Linq;
 9using UnityEngine;
 10
 11namespace ECSSystems.VideoPlayerSystem
 12{
 13    public class ECSVideoPlayerSystem
 14    {
 15        private struct VideoEventData
 16        {
 17            public VideoState videoState;
 18            public uint timeStamp;
 19        }
 20
 21        private readonly IInternalECSComponent<InternalVideoPlayer> videoPlayerComponent;
 22        private readonly IInternalECSComponent<InternalVideoMaterial> videoMaterialComponent;
 23        private readonly IInternalECSComponent<InternalEngineInfo> engineInfoComponent;
 24        private readonly IReadOnlyDictionary<int, ComponentWriter> componentsWriter;
 25        private readonly WrappedComponentPool<IWrappedComponent<PBVideoEvent>> videoPool;
 526        private Dictionary<IDCLEntity, VideoEventData> videoEvents = new Dictionary<IDCLEntity, VideoEventData>();
 27
 128        private static readonly Vector2 VIDEO_TEXTURE_SCALE = new Vector2(1, -1);
 29
 530        public ECSVideoPlayerSystem(
 31            IInternalECSComponent<InternalVideoPlayer> videoPlayerComponent,
 32            IInternalECSComponent<InternalVideoMaterial> videoMaterialComponent,
 33            IInternalECSComponent<InternalEngineInfo> engineInfoComponent,
 34            IReadOnlyDictionary<int, ComponentWriter> componentsWriter,
 35            WrappedComponentPool<IWrappedComponent<PBVideoEvent>> videoPool)
 36        {
 537            this.videoPlayerComponent = videoPlayerComponent;
 538            this.videoMaterialComponent = videoMaterialComponent;
 539            this.engineInfoComponent = engineInfoComponent;
 540            this.componentsWriter = componentsWriter;
 541            this.videoPool = videoPool;
 542        }
 43
 44        public void Update()
 45        {
 646            var playerComponents = videoPlayerComponent.GetForAll();
 47
 2448            for (int i = 0; i < playerComponents.Count; ++i)
 49            {
 650                var playerComponentData = playerComponents[i].value;
 651                var playerModel = playerComponentData.model;
 52
 653                playerModel.videoPlayer?.Update();
 54
 655                UpdateVideoEvent(playerModel, playerComponentData);
 56            }
 57
 658            var allMaterialComponent = videoMaterialComponent.GetForAll();
 59
 1860            for (int i = allMaterialComponent.Count - 1; i >= 0; --i)
 61            {
 362                var materialComponentData = allMaterialComponent[i].value;
 363                UpdateVideoMaterial(materialComponentData, materialComponentData.model, materialComponentData.model.vide
 64            }
 665        }
 66
 67        private void UpdateVideoEvent(InternalVideoPlayer videoPlayerModel, ECSComponentData<InternalVideoPlayer> videoP
 68        {
 669            int sceneNumber = videoPlayerComponentData.scene.sceneData.sceneNumber;
 670            componentsWriter.TryGetValue(sceneNumber, out var writer);
 71
 672            if (videoPlayerModel.removed)
 73            {
 174                writer?.Remove(videoPlayerComponentData.entity.entityId, ComponentID.VIDEO_EVENT);
 175                videoEvents.Remove(videoPlayerComponentData.entity);
 176                return;
 77            }
 78
 579            bool videoEventExists = videoEvents.TryGetValue(videoPlayerComponentData.entity, out VideoEventData videoEve
 80
 581            if (!videoEventExists)
 82            {
 483                videoEvent = new VideoEventData()
 84                {
 85                    videoState = VideoState.VsNone,
 86                    timeStamp = 0
 87                };
 88            }
 89
 590            int previousVideoState = videoEventExists ? (int)videoEvent.videoState : -1;
 591            int currentVideoState = (int)videoPlayerModel.videoPlayer.GetState();
 92
 593            if (previousVideoState != currentVideoState)
 94            {
 595                videoEvent.timeStamp++;
 596                videoEvent.videoState = (VideoState)currentVideoState;
 97
 98                // save video event updated data
 599                videoEvents[videoPlayerComponentData.entity] = videoEvent;
 100
 101                // Update GrowOnlyValueSet VideoEvent component for the video player entity
 5102                if (writer == null)
 0103                    return;
 104
 5105                var scene = videoPlayerComponentData.scene;
 106
 5107                var pooledModel = videoPool.Get();
 5108                var model = pooledModel.WrappedComponent.Model;
 5109                model.State = videoEvent.videoState;
 5110                model.CurrentOffset = videoPlayerModel.videoPlayer.GetTime();
 5111                model.VideoLength = videoPlayerModel.videoPlayer.GetDuration();
 5112                model.Timestamp = videoEvent.timeStamp;
 5113                model.TickNumber = engineInfoComponent.GetFor(scene, SpecialEntityId.SCENE_ROOT_ENTITY).Value.model.Scen
 114
 5115                writer.Append(videoPlayerComponentData.entity.entityId, ComponentID.VIDEO_EVENT, pooledModel);
 116            }
 5117        }
 118
 119        private void UpdateVideoMaterial(ECSComponentData<InternalVideoMaterial> materialComponentData, InternalVideoMat
 120        {
 12121            for (int j = texturesData.Count - 1; j >= 0; --j)
 122            {
 3123                var textureData = texturesData[j];
 3124                var playerComponent = videoPlayerComponent.GetFor(materialComponentData.scene, textureData.videoId);
 125
 3126                if (playerComponent != null)
 127                {
 2128                    var playerModel = playerComponent.Value.model;
 2129                    var videoTexture = playerModel.videoPlayer.texture;
 130
 2131                    if (!IsMaterialAssigned(playerModel, model, textureData.textureType) && videoTexture != null)
 132                    {
 2133                        model.material.SetTexture(textureData.textureType, videoTexture);
 134
 135                        // Video textures are vertically flipped since natively the buffer is read from
 136                        // bottom to top, we are scaling the texture in the material to fix that and avoiding the perfor
 137                        // of flipping the texture by code
 2138                        model.material.SetTextureScale(textureData.textureType, VIDEO_TEXTURE_SCALE);
 139
 2140                        playerModel.assignedMaterials.Add(
 141                            new InternalVideoPlayer.MaterialAssigned(model.material, textureData.textureType));
 142                    }
 143                }
 144            }
 3145        }
 146
 147        private static bool IsMaterialAssigned(InternalVideoPlayer player, InternalVideoMaterial videoMaterial, int text
 148        {
 3149            return player.assignedMaterials.Any(data => data.material == videoMaterial.material && data.textureType == t
 150        }
 151    }
 152}