< Summary

Class:DCL.AssetPromise_Texture
Assembly:AssetPromiseKeeper
File(s):/tmp/workspace/unity-renderer/unity-renderer/Assets/Scripts/MainScripts/DCL/Controllers/AssetManager/Texture/AssetPromise_Texture.cs
Covered lines:56
Uncovered lines:13
Coverable lines:69
Total lines:157
Line coverage:81.1% (56 of 69)
Covered branches:0
Total branches:0

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity NPath complexity Sequence coverage
AssetPromise_Texture(...)0%330100%
OnAfterLoadOrReuse()0%110100%
OnBeforeLoadOrReuse()0%110100%
GetLibraryAssetCheckId()0%110100%
OnCancelLoading()0%220100%
OnLoad(...)0%8.817066.67%
AddToLibrary()0%6.346078.95%
ConstructId(...)0%110100%
GetId()0%110100%
UsesDefaultWrapAndFilterMode()0%220100%

File(s)

/tmp/workspace/unity-renderer/unity-renderer/Assets/Scripts/MainScripts/DCL/Controllers/AssetManager/Texture/AssetPromise_Texture.cs

#LineLine coverage
 1using System;
 2using DCL.Helpers;
 3using MainScripts.DCL.Analytics.PerformanceAnalytics;
 4using UnityEngine;
 5using UnityEngine.Networking;
 6
 7namespace DCL
 8{
 9    public class AssetPromise_Texture : AssetPromise<Asset_Texture>
 10    {
 11        private const string PLAIN_BASE64_PROTOCOL = "data:text/plain;base64,";
 12        private const TextureWrapMode DEFAULT_WRAP_MODE = TextureWrapMode.Clamp;
 13        private const FilterMode DEFAULT_FILTER_MODE = FilterMode.Bilinear;
 14
 15        private readonly string idWithTexSettings;
 16        private readonly string idWithDefaultTexSettings;
 17        private readonly TextureWrapMode wrapMode;
 18        private readonly FilterMode filterMode;
 19        private readonly bool storeDefaultTextureInAdvance = false;
 20        private readonly bool storeTexAsNonReadable = false;
 21        private readonly int maxTextureSize;
 22
 023        public string url { get; }
 24
 25        WebRequestAsyncOperation webRequestOp = null;
 26
 15627        public AssetPromise_Texture(string textureUrl, TextureWrapMode textureWrapMode = DEFAULT_WRAP_MODE, FilterMode t
 28        {
 15629            url = textureUrl;
 15630            wrapMode = textureWrapMode;
 15631            filterMode = textureFilterMode;
 15632            this.storeDefaultTextureInAdvance = storeDefaultTextureInAdvance;
 15633            this.storeTexAsNonReadable = storeTexAsNonReadable;
 15634            maxTextureSize = overrideMaxTextureSize ?? DataStore.i.textureConfig.generalMaxSize.Get();
 15635            idWithDefaultTexSettings = ConstructId(url, DEFAULT_WRAP_MODE, DEFAULT_FILTER_MODE, maxTextureSize);
 15636            idWithTexSettings = UsesDefaultWrapAndFilterMode() ? idWithDefaultTexSettings : ConstructId(url, wrapMode, f
 15637        }
 38
 8339        protected override void OnAfterLoadOrReuse() { }
 40
 14941        protected override void OnBeforeLoadOrReuse() { }
 42
 14943        protected override object GetLibraryAssetCheckId() { return idWithTexSettings; }
 44
 45        protected override void OnCancelLoading()
 46        {
 6647            if (webRequestOp != null)
 6348                webRequestOp.Dispose();
 6649        }
 50
 51        protected override void OnLoad(Action OnSuccess, Action<Exception> OnFail)
 52        {
 53            // Reuse the already-stored default texture, we duplicate it and set the needed config afterwards in AddToLi
 13554            if (library.Contains(idWithDefaultTexSettings) && !UsesDefaultWrapAndFilterMode())
 55            {
 256                OnSuccess?.Invoke();
 257                return;
 58            }
 59
 13360            if (!url.StartsWith(PLAIN_BASE64_PROTOCOL))
 61            {
 13262                webRequestOp = DCL.Environment.i.platform.webRequest.GetTexture(
 63                    url: url,
 64                    OnSuccess: (webRequestResult) =>
 65                    {
 6866                        if (asset != null)
 67                        {
 6868                            Texture2D texture = DownloadHandlerTexture.GetContent(webRequestResult.webRequest);
 6869                            asset.texture = TextureHelpers.ClampSize(texture, maxTextureSize, useGPUCopy: false);
 6870                            asset.resizingFactor = Mathf.Min(1, TextureHelpers.GetScalingFactor(texture.width, texture.h
 6871                            if (TextureUtils.IsQuestionMarkPNG(asset.texture))
 172                                OnFail?.Invoke(new Exception("The texture is a question mark"));
 73                            else
 6774                                OnSuccess?.Invoke();
 6775                        }
 76                        else
 77                        {
 078                            OnFail?.Invoke(new Exception("The texture asset is null"));
 79                        }
 080                    },
 81                    OnFail: (webRequestResult) =>
 82                    {
 5183                        OnFail?.Invoke(new Exception($"Texture promise failed: {webRequestResult?.webRequest?.error}"));
 5184                    });
 13285            }
 86            else
 87            {
 88                //For Base64 protocols we just take the bytes and create the texture
 89                //to avoid Unity's web request issue with large URLs
 90                try {
 191                    string substring = url.Substring(PLAIN_BASE64_PROTOCOL.Length);
 192                    byte[] decodedTexture = Convert.FromBase64String(substring);
 093                    asset.texture = new Texture2D(1, 1);
 094                    asset.texture.LoadImage(decodedTexture);
 095                    asset.resizingFactor = TextureHelpers.GetScalingFactor(asset.texture.width, asset.texture.height, ma
 096                    asset.texture = TextureHelpers.ClampSize(asset.texture, maxTextureSize);
 097                    OnSuccess?.Invoke();
 098                }
 199                catch (Exception e)
 100                {
 1101                    OnFail?.Invoke(e);
 1102                }
 103
 104            }
 1105        }
 106
 107        protected override bool AddToLibrary()
 108        {
 69109            if (storeDefaultTextureInAdvance && !UsesDefaultWrapAndFilterMode())
 110            {
 1111                if (!library.Contains(idWithDefaultTexSettings))
 112                {
 113                    // Save default texture asset
 1114                    asset.id = idWithDefaultTexSettings;
 1115                    asset.ConfigureTexture(DEFAULT_WRAP_MODE, DEFAULT_FILTER_MODE, false);
 116
 1117                    if (!library.Add(asset))
 118                    {
 0119                        Debug.Log("add to library fail?");
 0120                        return false;
 121                    }
 122                }
 123
 124                // By always using library.Get() for the default tex we have stored, we increase its references counter,
 125                // that will come in handy for removing that default tex when there is no one using it
 1126                var defaultTexAsset = library.Get(idWithDefaultTexSettings);
 1127                asset = defaultTexAsset.Clone() as Asset_Texture;
 1128                asset.dependencyAsset = defaultTexAsset;
 1129                asset.texture = TextureHelpers.CopyTexture(defaultTexAsset.texture);
 130            }
 131
 69132            asset.id = idWithTexSettings;
 69133            asset.ConfigureTexture(wrapMode, filterMode, storeTexAsNonReadable);
 134
 69135            if (!library.Add(asset))
 136            {
 0137                Debug.Log("add to library fail?");
 0138                return false;
 139            }
 140
 69141            PerformanceAnalytics.PromiseTextureTracker.Track();
 142
 69143            asset = library.Get(asset.id);
 69144            return true;
 145        }
 146
 168147        string ConstructId(string textureUrl, TextureWrapMode textureWrapMode, FilterMode textureFilterMode, int maxSize
 148
 149        public override object GetId()
 150        {
 151            // We only use the id-with-settings when storing/reading from the library
 630152            return idWithDefaultTexSettings;
 153        }
 154
 202155        public bool UsesDefaultWrapAndFilterMode() { return wrapMode == DEFAULT_WRAP_MODE && filterMode == DEFAULT_FILTE
 156    }
 157}