< Summary

Class:SceneLimitsController
Assembly:BuildModeHUD
File(s):/tmp/workspace/unity-renderer/unity-renderer/Assets/DCLPlugins/BuilderInWorld/HUD/BuildModeHUD/Scripts/GodMode/Inspector/SceneLimitsController.cs
Covered lines:76
Uncovered lines:18
Coverable lines:94
Total lines:182
Line coverage:80.8% (76 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%7.465053.85%
AppendUsageAndLimit(...)0%2.062075%
GetHigherLimitPercentInfo()0%6.566075%
IsParcelSceneSquare(...)0%8.058090.91%

File(s)

/tmp/workspace/unity-renderer/unity-renderer/Assets/DCLPlugins/BuilderInWorld/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    {
 426        this.sceneLimitsView = sceneLimitsView;
 27
 428        sceneLimitsView.OnToggleSceneLimitsInfo += ToggleSceneLimitsInfo;
 29
 430        sceneLimitsView.SetUpdateCallback(UpdateInfo);
 431    }
 32
 833    public void Dispose() { sceneLimitsView.OnToggleSceneLimitsInfo -= ToggleSceneLimitsInfo; }
 34
 35    public void SetParcelScene(IParcelScene parcelScene)
 36    {
 237        currentParcelScene = parcelScene;
 238        UpdateInfo();
 239    }
 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    {
 464        if (currentParcelScene == null)
 165            return;
 66
 367        if (IsParcelSceneSquare(currentParcelScene))
 68        {
 369            int size = (int)Math.Sqrt(currentParcelScene.sceneData.parcels.Length);
 370            int meters = size * 16;
 371            sceneLimitsView.SetTitleText($"{size}x{size} LAND <color=#959696>{meters}x{meters}m");
 372        }
 73        else
 74        {
 075            sceneLimitsView.SetTitleText(BIWSettings.CUSTOM_LAND);
 76        }
 77
 378        SceneMetricsModel limits = currentParcelScene.metricsCounter.maxCount;
 379        SceneMetricsModel usage = currentParcelScene.metricsCounter.currentCount;
 80
 381        string leftDesc = AppendUsageAndLimit("ENTITIES", usage.entities, limits.entities);
 382        leftDesc += "\n" + AppendUsageAndLimit("BODIES", usage.bodies, limits.bodies);
 383        leftDesc += "\n" + AppendUsageAndLimit("TRIS", usage.triangles, limits.triangles);
 384        string rightDesc = AppendUsageAndLimit("TEXTURES", usage.textures, limits.textures);
 385        rightDesc += "\n" + AppendUsageAndLimit("MATERIALS", usage.materials, limits.materials);
 386        rightDesc += "\n" + AppendUsageAndLimit("GEOMETRIES", usage.meshes, limits.meshes);
 87
 388        sceneLimitsView.SetLeftDescText(leftDesc);
 389        sceneLimitsView.SetRightDescText(rightDesc);
 90
 391        SetFillInfo();
 392    }
 93
 94    internal void SetFillInfo()
 95    {
 396        float percentAmount = GetHigherLimitPercentInfo();
 397        Color colorToUse = sceneLimitsView.lfColor;
 98
 399        if (percentAmount > 66)
 0100            colorToUse = sceneLimitsView.mfColor;
 101
 3102        if (percentAmount > 85)
 0103            colorToUse = sceneLimitsView.hfColor;
 104
 6105        foreach (Image img in sceneLimitsView.limitUsageFillsImages)
 106        {
 0107            if (img == null)
 108                continue;
 109
 0110            img.fillAmount = percentAmount / 100f;
 0111            img.color = colorToUse;
 112        }
 3113    }
 114
 115    internal string AppendUsageAndLimit(string name, int usage, int limit)
 116    {
 18117        string currentString = $"{name}:   {usage} / <color=#959696>{limit}</color>";
 118
 18119        if (usage > limit)
 0120            currentString = "<color=red>" + currentString + "</color>";
 121
 18122        return currentString;
 123    }
 124
 125    internal float GetHigherLimitPercentInfo()
 126    {
 3127        SceneMetricsModel limits = currentParcelScene.metricsCounter.maxCount;
 3128        SceneMetricsModel usage = currentParcelScene.metricsCounter.currentCount;
 129
 3130        float percentEntities = usage.entities * 100 / limits.entities;
 3131        float percentBodies = usage.bodies * 100 / limits.bodies;
 3132        float percentTris = usage.triangles * 100 / limits.triangles;
 3133        float percentTexture = usage.textures * 100 / limits.textures;
 3134        float percentmats = usage.materials * 100 / limits.materials;
 3135        float percentMeshes = usage.meshes * 100 / limits.meshes;
 136
 3137        float result = percentEntities;
 3138        if (percentBodies > result)
 0139            result = percentBodies;
 3140        if (percentTris > result)
 0141            result = percentTris;
 3142        if (percentTexture > result)
 0143            result = percentTexture;
 3144        if (percentmats > result)
 0145            result = percentmats;
 3146        if (percentMeshes > result)
 0147            result = percentMeshes;
 148
 3149        return result;
 150    }
 151
 152    internal bool IsParcelSceneSquare(IParcelScene scene)
 153    {
 3154        Vector2Int[] parcelsPoints = scene.sceneData.parcels;
 3155        int minX = int.MaxValue;
 3156        int minY = int.MaxValue;
 3157        int maxX = int.MinValue;
 3158        int maxY = int.MinValue;
 159
 12160        foreach (Vector2Int vector in parcelsPoints)
 161        {
 3162            if (vector.x < minX)
 3163                minX = vector.x;
 3164            if (vector.y < minY)
 3165                minY = vector.y;
 3166            if (vector.x > maxX)
 3167                maxX = vector.x;
 3168            if (vector.y > maxY)
 3169                maxY = vector.y;
 170        }
 171
 3172        if (maxX - minX != maxY - minY)
 0173            return false;
 174
 3175        int lateralLengh = Math.Abs((maxX - minX) + 1);
 176
 3177        if (parcelsPoints.Length != lateralLengh * lateralLengh)
 0178            return false;
 179
 3180        return true;
 181    }
 182}