< Summary

Class:DCLServices.MapRendererV2.MapLayers.Atlas.SatelliteAtlas.SatelliteChunkController
Assembly:MapRendererV2
File(s):/tmp/workspace/unity-renderer/unity-renderer/Assets/DCLServices/MapRendererV2/MapLayers/Atlas/SatelliteAtlas/SatelliteChunkController.cs
Covered lines:23
Uncovered lines:13
Coverable lines:36
Total lines:101
Line coverage:63.8% (23 of 36)
Covered branches:0
Total branches:0
Covered methods:3
Total methods:4
Method coverage:75% (3 of 4)

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity NPath complexity Sequence coverage
SatelliteChunkController(...)0%110100%
Dispose()0%30500%
LoadImage()0%330100%
GetTextureFromWebAsync()0%29.8911046.15%

File(s)

/tmp/workspace/unity-renderer/unity-renderer/Assets/DCLServices/MapRendererV2/MapLayers/Atlas/SatelliteAtlas/SatelliteChunkController.cs

#LineLine coverage
 1using Cysharp.Threading.Tasks;
 2using DCL;
 3using DCL.Helpers;
 4using MainScripts.DCL.Helpers.Utils;
 5using System;
 6using System.Threading;
 7using UnityEngine;
 8using UnityEngine.Networking;
 9using Object = UnityEngine.Object;
 10
 11namespace DCLServices.MapRendererV2.MapLayers.Atlas.SatelliteAtlas
 12{
 13    public class SatelliteChunkController : IChunkController
 14    {
 15        private const string CHUNKS_API = "https://media.githubusercontent.com/media/genesis-city/genesis.city/master/ma
 16
 17        private readonly SpriteRenderer spriteRenderer;
 18
 19        private Service<IWebRequestController> webRequestController;
 20
 21        private CancellationTokenSource internalCts;
 22        private CancellationTokenSource linkedCts;
 23        private int webRequestAttempts;
 24
 55025        public SatelliteChunkController(SpriteRenderer prefab, Vector3 chunkLocalPosition, Vector2Int coordsCenter, Tran
 26        {
 55027            internalCts = new CancellationTokenSource();
 28
 55029            spriteRenderer = Object.Instantiate(prefab, parent);
 55030            spriteRenderer.transform.localPosition = chunkLocalPosition;
 55031            spriteRenderer.sortingOrder = drawOrder;
 32
 33#if UNITY_EDITOR
 55034            spriteRenderer.gameObject.name = $"Chunk {coordsCenter.x},{coordsCenter.y}";
 35#endif
 55036        }
 37
 38        public void Dispose()
 39        {
 040            internalCts?.Cancel();
 041            linkedCts?.Dispose();
 042            linkedCts = null;
 43
 044            internalCts?.Dispose();
 045            internalCts = null;
 46
 047            if (spriteRenderer)
 048                Utils.SafeDestroy(spriteRenderer.gameObject);
 049        }
 50
 51        public async UniTask LoadImage(Vector2Int chunkId, float chunkWorldSize, CancellationToken ct)
 52        {
 55053            webRequestAttempts = 0;
 55054            linkedCts = CancellationTokenSource.CreateLinkedTokenSource(internalCts.Token, ct);
 55
 55056            var url = $"{CHUNKS_API}{chunkId.x}%2C{chunkId.y}.jpg";
 57
 165058            UnityWebRequest webRequest = await GetTextureFromWebAsync(url, ct: linkedCts.Token);
 59
 8160            Texture2D texture = CreateTexture(webRequest.downloadHandler.data);
 8161            texture.wrapMode = TextureWrapMode.Clamp;
 62
 8163            float pixelsPerUnit = texture.width / chunkWorldSize;
 64
 8165            spriteRenderer.sprite = Sprite.Create(texture, new Rect(0, 0, texture.width, texture.height), Vector2Ext.One
 66                0, SpriteMeshType.FullRect, Vector4.one, false);
 67
 8168            return;
 69
 70            Texture2D CreateTexture(byte[] data)
 71            {
 8172                var texture2D = new Texture2D(1, 1);
 8173                texture2D.LoadImage(data);
 8174                return texture2D;
 75            }
 8176        }
 77
 78        private async UniTask<UnityWebRequest> GetTextureFromWebAsync(string url, int maxAttempts = 3, CancellationToken
 79        {
 80            UnityWebRequest webRequest;
 81#if UNITY_EDITOR
 82            // fixes editor exception for downloading pictures from github: "UnityWebRequestException: Unable to complet
 173183            try { webRequest = await webRequestController.Ref.GetTextureAsync(url, cancellationToken: linkedCts.Token); 
 084            catch (UnityWebRequestException e) when (e.Message.Contains("Unable to complete SSL connection"))
 85            {
 086                if (webRequestAttempts < maxAttempts)
 87                {
 088                    webRequestAttempts++;
 089                    webRequest = await GetTextureFromWebAsync(url, ct: linkedCts.Token);
 90                }
 91                else
 092                    throw;
 93            }
 94#else
 95            webRequest = await webRequestController.Ref.GetTextureAsync(url, cancellationToken: linkedCts.Token);
 96#endif
 97
 8198            return webRequest;
 8199        }
 100    }
 101}