< Summary

Class:DCL.PreviewSceneLimitsWarning
Assembly:PreviewSceneLimitsWarning
File(s):/tmp/workspace/unity-renderer/unity-renderer/Assets/Scripts/MainScripts/DCL/WorldRuntime/Debugging/Panels/PreviewSceneLimitsWarning/PreviewSceneLimitsWarning.cs
Covered lines:0
Uncovered lines:73
Coverable lines:73
Total lines:178
Line coverage:0% (0 of 73)
Covered branches:0
Total branches:0

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity NPath complexity Sequence coverage
PreviewSceneLimitsWarning()0%2100%
PreviewSceneLimitsWarning(...)0%2100%
Dispose()0%2100%
SetActive(...)0%30500%
StopChecking()0%2100%
OnKernelConfigChanged(...)0%6200%
UpdateRoutine()0%12300%
HandleWarningNotification()0%1101000%
IsLimitReached(...)0%90900%
ShowNotification(...)0%12300%

File(s)

/tmp/workspace/unity-renderer/unity-renderer/Assets/Scripts/MainScripts/DCL/WorldRuntime/Debugging/Panels/PreviewSceneLimitsWarning/PreviewSceneLimitsWarning.cs

#LineLine coverage
 1using System;
 2using System.Collections;
 3using DCL.Controllers;
 4using DCL.NotificationModel;
 5using UnityEngine;
 6using Type = DCL.NotificationModel.Type;
 7
 8namespace DCL
 9{
 10    public class PreviewSceneLimitsWarning : IDisposable
 11    {
 12        private const string NOTIFICATION_GROUP = "SceneLimitationExceeded";
 13        private const string NOTIFICATION_MESSAGE = "Scene's limits exceeded: {0}";
 14
 15        internal const float CHECK_INTERVAL = 0.2f;
 16
 17        private int sceneNumber;
 18        private Coroutine updateRoutine;
 19        private bool isActive = false;
 20
 21        internal bool isShowingNotification = false;
 22
 23        private readonly IWorldState worldState;
 24
 025        private static readonly Model limitReachedNotification = new Model()
 26        {
 27            type = Type.WARNING,
 28            groupID = NOTIFICATION_GROUP,
 29            message = NOTIFICATION_MESSAGE
 30        };
 31
 032        public PreviewSceneLimitsWarning(IWorldState worldState)
 33        {
 034            this.worldState = worldState;
 035        }
 36
 37        public void Dispose()
 38        {
 039            KernelConfig.i.OnChange -= OnKernelConfigChanged;
 040            StopChecking();
 041        }
 42
 43        public void SetActive(bool active)
 44        {
 045            if (active && !isActive)
 46            {
 047                sceneNumber = KernelConfig.i.Get().debugConfig.sceneLimitsWarningSceneNumber;
 048                KernelConfig.i.OnChange += OnKernelConfigChanged;
 049                updateRoutine = CoroutineStarter.Start(UpdateRoutine());
 50            }
 51
 052            if (!active && isActive)
 53            {
 054                KernelConfig.i.OnChange -= OnKernelConfigChanged;
 055                StopChecking();
 56            }
 57
 058            isActive = active;
 059        }
 60
 61        private void StopChecking()
 62        {
 063            CoroutineStarter.Stop(updateRoutine);
 064            ShowNotification(false);
 065        }
 66
 67        internal void OnKernelConfigChanged(KernelConfigModel current, KernelConfigModel previous)
 68        {
 069            sceneNumber = current.debugConfig.sceneLimitsWarningSceneNumber;
 070            if (sceneNumber <= 0)
 71            {
 072                StopChecking();
 73            }
 074        }
 75
 76        // NOTE: we are doing the check inside a coroutine since scene might be unloaded and loaded again
 77        private IEnumerator UpdateRoutine()
 78        {
 079            while (true)
 80            {
 081                HandleWarningNotification();
 082                yield return WaitForSecondsCache.Get(CHECK_INTERVAL);
 83            }
 84        }
 85
 86        internal void HandleWarningNotification()
 87        {
 088            bool isLimitReached = false;
 089            bool isLimitReachedAndMessageChanged = false;
 90
 091            if (sceneNumber > 0)
 92            {
 093                worldState.TryGetScene(sceneNumber, out IParcelScene scene);
 094                ISceneMetricsCounter metricsController = scene?.metricsCounter;
 095                SceneMetricsModel currentMetrics = metricsController?.currentCount;
 096                SceneMetricsModel limit = metricsController?.maxCount;
 97
 098                string warningMessage = null;
 099                isLimitReached = IsLimitReached(currentMetrics, limit, ref warningMessage);
 0100                if (isLimitReached)
 101                {
 0102                    string prevMessage = limitReachedNotification.message;
 0103                    string newMessage = string.Format(NOTIFICATION_MESSAGE, warningMessage);
 0104                    limitReachedNotification.message = newMessage;
 0105                    isLimitReachedAndMessageChanged = prevMessage != newMessage;
 106                }
 107            }
 108
 0109            if (isShowingNotification != isLimitReached || isLimitReachedAndMessageChanged)
 110            {
 0111                ShowNotification(isLimitReached);
 112            }
 0113        }
 114
 115        private static bool IsLimitReached(SceneMetricsModel currentMetrics, SceneMetricsModel limit,
 116            ref string message)
 117        {
 0118            if (currentMetrics == null || limit == null)
 0119                return false;
 120
 0121            if (currentMetrics.materials > limit.materials)
 122            {
 0123                message = $"Materials ({currentMetrics.materials}/{limit.materials})";
 0124                return true;
 125            }
 126
 0127            if (currentMetrics.triangles > limit.triangles)
 128            {
 0129                message = $"Triangles ({currentMetrics.triangles}/{limit.triangles})";
 0130                return true;
 131            }
 132
 0133            if (currentMetrics.meshes > limit.meshes)
 134            {
 0135                message = $"Meshes ({currentMetrics.meshes}/{limit.meshes})";
 0136                return true;
 137            }
 138
 0139            if (currentMetrics.entities > limit.entities)
 140            {
 0141                message = $"Entities ({currentMetrics.entities}/{limit.entities})";
 0142                return true;
 143            }
 144
 0145            if (currentMetrics.bodies > limit.bodies)
 146            {
 0147                message = $"Bodies ({currentMetrics.bodies}/{limit.bodies})";
 0148                return true;
 149            }
 150
 0151            if (currentMetrics.sceneHeight > limit.sceneHeight)
 152            {
 0153                message = $"Height ({currentMetrics.sceneHeight}/{limit.sceneHeight})";
 0154                return true;
 155            }
 156
 0157            return false;
 158        }
 159
 160        private void ShowNotification(bool show)
 161        {
 0162            isShowingNotification = show;
 163
 0164            var notificationsController = NotificationsController.i;
 165
 0166            if (notificationsController == null)
 0167                return;
 168
 0169            if (show)
 170            {
 0171                notificationsController.ShowNotification(limitReachedNotification);
 0172                return;
 173            }
 174
 0175            notificationsController.DismissAllNotifications(limitReachedNotification.groupID);
 0176        }
 177    }
 178}