< Summary

Class:SceneLimitsController
Assembly:BuildModeHUD
File(s):/tmp/workspace/unity-renderer/unity-renderer/Assets/Scripts/MainScripts/DCL/Controllers/HUD/BuildModeHUD/Scripts/GodMode/Inspector/SceneLimitsController.cs
Covered lines:79
Uncovered lines:15
Coverable lines:94
Total lines:182
Line coverage:84% (79 of 94)
Covered branches:0
Total branches:0

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity NPath complexity Sequence coverage
Initialize(...)0%110100%
Dispose()0%110100%
SetParcelScene(...)0%110100%
ToggleSceneLimitsInfo()0%6200%
Enable()0%110100%
Disable()0%110100%
UpdateInfo()0%33095%
SetFillInfo()0%5.095084.62%
AppendUsageAndLimit(...)0%2.062075%
GetHigherLimitPercentInfo()0%6.566075%
IsParcelSceneSquare(...)0%8.058090.91%

File(s)

/tmp/workspace/unity-renderer/unity-renderer/Assets/Scripts/MainScripts/DCL/Controllers/HUD/BuildModeHUD/Scripts/GodMode/Inspector/SceneLimitsController.cs

#LineLine coverage
 1using DCL;
 2using DCL.Configuration;
 3using DCL.Controllers;
 4using System;
 5using UnityEngine;
 6using UnityEngine.UI;
 7
 8public interface ISceneLimitsController
 9{
 10    void Initialize(ISceneLimitsView sceneLimitsView);
 11    void Dispose();
 12    void SetParcelScene(IParcelScene parcelScene);
 13    void ToggleSceneLimitsInfo();
 14    void Enable();
 15    void Disable();
 16    void UpdateInfo();
 17}
 18
 19public class SceneLimitsController : ISceneLimitsController
 20{
 21    internal ISceneLimitsView sceneLimitsView;
 22    internal IParcelScene currentParcelScene;
 23
 24    public void Initialize(ISceneLimitsView sceneLimitsView)
 25    {
 3026        this.sceneLimitsView = sceneLimitsView;
 27
 3028        sceneLimitsView.OnToggleSceneLimitsInfo += ToggleSceneLimitsInfo;
 29
 3030        sceneLimitsView.SetUpdateCallback(UpdateInfo);
 3031    }
 32
 833    public void Dispose() { sceneLimitsView.OnToggleSceneLimitsInfo -= ToggleSceneLimitsInfo; }
 34
 35    public void SetParcelScene(IParcelScene parcelScene)
 36    {
 937        currentParcelScene = parcelScene;
 938        UpdateInfo();
 939    }
 40
 41    public void ToggleSceneLimitsInfo()
 42    {
 043        if (!sceneLimitsView.isBodyActived)
 044            Enable();
 45        else
 046            Disable();
 047    }
 48
 49    public void Enable()
 50    {
 151        sceneLimitsView.SetBodyActive(true);
 152        sceneLimitsView.SetDetailsToggleAsOpen();
 153        UpdateInfo();
 154    }
 55
 56    public void Disable()
 57    {
 158        sceneLimitsView.SetBodyActive(false);
 159        sceneLimitsView.SetDetailsToggleAsClose();
 160    }
 61
 62    public void UpdateInfo()
 63    {
 1164        if (currentParcelScene == null)
 165            return;
 66
 1067        if (IsParcelSceneSquare(currentParcelScene))
 68        {
 1069            int size = (int)Math.Sqrt(currentParcelScene.sceneData.parcels.Length);
 1070            int meters = size * 16;
 1071            sceneLimitsView.SetTitleText($"{size}x{size} LAND <color=#959696>{meters}x{meters}m");
 1072        }
 73        else
 74        {
 075            sceneLimitsView.SetTitleText(BIWSettings.CUSTOM_LAND);
 76        }
 77
 1078        SceneMetricsModel limits = currentParcelScene.metricsCounter.GetLimits();
 1079        SceneMetricsModel usage = currentParcelScene.metricsCounter.GetModel();
 80
 1081        string leftDesc = AppendUsageAndLimit("ENTITIES", usage.entities, limits.entities);
 1082        leftDesc += "\n" + AppendUsageAndLimit("BODIES", usage.bodies, limits.bodies);
 1083        leftDesc += "\n" + AppendUsageAndLimit("TRIS", usage.triangles, limits.triangles);
 1084        string rightDesc = AppendUsageAndLimit("TEXTURES", usage.textures, limits.textures);
 1085        rightDesc += "\n" + AppendUsageAndLimit("MATERIALS", usage.materials, limits.materials);
 1086        rightDesc += "\n" + AppendUsageAndLimit("GEOMETRIES", usage.meshes, limits.meshes);
 87
 1088        sceneLimitsView.SetLeftDescText(leftDesc);
 1089        sceneLimitsView.SetRightDescText(rightDesc);
 90
 1091        SetFillInfo();
 1092    }
 93
 94    internal void SetFillInfo()
 95    {
 1096        float percentAmount = GetHigherLimitPercentInfo();
 1097        Color colorToUse = sceneLimitsView.lfColor;
 98
 1099        if (percentAmount > 66)
 0100            colorToUse = sceneLimitsView.mfColor;
 101
 10102        if (percentAmount > 85)
 0103            colorToUse = sceneLimitsView.hfColor;
 104
 34105        foreach (Image img in sceneLimitsView.limitUsageFillsImages)
 106        {
 7107            if (img == null)
 108                continue;
 109
 7110            img.fillAmount = percentAmount / 100f;
 7111            img.color = colorToUse;
 112        }
 10113    }
 114
 115    internal string AppendUsageAndLimit(string name, int usage, int limit)
 116    {
 60117        string currentString = $"{name}:   {usage} / <color=#959696>{limit}</color>";
 118
 60119        if (usage > limit)
 0120            currentString = "<color=red>" + currentString + "</color>";
 121
 60122        return currentString;
 123    }
 124
 125    internal float GetHigherLimitPercentInfo()
 126    {
 10127        SceneMetricsModel limits = currentParcelScene.metricsCounter.GetLimits();
 10128        SceneMetricsModel usage = currentParcelScene.metricsCounter.GetModel();
 129
 10130        float percentEntities = usage.entities * 100 / limits.entities;
 10131        float percentBodies = usage.bodies * 100 / limits.bodies;
 10132        float percentTris = usage.triangles * 100 / limits.triangles;
 10133        float percentTexture = usage.textures * 100 / limits.textures;
 10134        float percentmats = usage.materials * 100 / limits.materials;
 10135        float percentMeshes = usage.meshes * 100 / limits.meshes;
 136
 10137        float result = percentEntities;
 10138        if (percentBodies > result)
 0139            result = percentBodies;
 10140        if (percentTris > result)
 0141            result = percentTris;
 10142        if (percentTexture > result)
 0143            result = percentTexture;
 10144        if (percentmats > result)
 0145            result = percentmats;
 10146        if (percentMeshes > result)
 0147            result = percentMeshes;
 148
 10149        return result;
 150    }
 151
 152    internal bool IsParcelSceneSquare(IParcelScene scene)
 153    {
 10154        Vector2Int[] parcelsPoints = scene.sceneData.parcels;
 10155        int minX = int.MaxValue;
 10156        int minY = int.MaxValue;
 10157        int maxX = int.MinValue;
 10158        int maxY = int.MinValue;
 159
 40160        foreach (Vector2Int vector in parcelsPoints)
 161        {
 10162            if (vector.x < minX)
 10163                minX = vector.x;
 10164            if (vector.y < minY)
 10165                minY = vector.y;
 10166            if (vector.x > maxX)
 10167                maxX = vector.x;
 10168            if (vector.y > maxY)
 10169                maxY = vector.y;
 170        }
 171
 10172        if (maxX - minX != maxY - minY)
 0173            return false;
 174
 10175        int lateralLengh = Math.Abs((maxX - minX) + 1);
 176
 10177        if (parcelsPoints.Length != lateralLengh * lateralLengh)
 0178            return false;
 179
 10180        return true;
 181    }
 182}