< Summary

Class:DCL.AvatarMeshCombinerHelper
Assembly:AvatarMeshCombiner
File(s):/tmp/workspace/unity-renderer/unity-renderer/Assets/Scripts/MainScripts/DCL/Components/Avatar/AvatarMeshCombiner/AvatarMeshCombinerHelper.cs
Covered lines:51
Uncovered lines:3
Coverable lines:54
Total lines:136
Line coverage:94.4% (51 of 54)
Covered branches:0
Total branches:0

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity NPath complexity Sequence coverage
AvatarMeshCombinerHelper()0%330100%
AvatarMeshCombinerHelper(...)0%110100%
Combine(...)0%440100%
CombineInternal(...)0%4.014092.59%
UnloadAssets()0%550100%
Dispose()0%110100%

File(s)

/tmp/workspace/unity-renderer/unity-renderer/Assets/Scripts/MainScripts/DCL/Components/Avatar/AvatarMeshCombiner/AvatarMeshCombinerHelper.cs

#LineLine coverage
 1using System;
 2using System.Linq;
 3using UnityEngine;
 4using UnityEngine.Assertions;
 5using Object = UnityEngine.Object;
 6
 7namespace DCL
 8{
 9    /// <summary>
 10    /// AvatarMeshCombinerHelper uses the AvatarMeshCombiner utility class to combine many skinned renderers
 11    /// into a single one.
 12    ///
 13    /// This class will recycle the same gameObject and renderer each time it is called,
 14    /// and binds the AvatarMeshCombiner output to a proper well configured SkinnedMeshRenderer.
 15    /// </summary>
 16    public class AvatarMeshCombinerHelper : IDisposable
 17    {
 118        private static bool VERBOSE = false;
 119        private static ILogger logger = new Logger(Debug.unityLogger.logHandler) { filterLogType = VERBOSE ? LogType.Log
 20
 19021        public GameObject container { get; private set; }
 022        public SkinnedMeshRenderer renderer { get; private set; }
 23
 57024        public AvatarMeshCombinerHelper (GameObject container = null) { this.container = container; }
 25
 26        /// <summary>
 27        /// Combine will use AvatarMeshCombiner to generate a combined avatar mesh.
 28        /// After the avatar is combined, it will generate a new GameObject with a SkinnedMeshRenderer that contains
 29        /// the generated mesh. This GameObject and Renderer will be preserved over any number of Combine() calls.
 30        ///
 31        /// For more details on the combining check out AvatarMeshCombiner.CombineSkinnedMeshes.
 32        /// </summary>
 33        /// <param name="bonesContainer">A SkinnedMeshRenderer that must contain the bones and bindposes that will be us
 34        /// <param name="renderersToCombine">A list of avatar parts to be combined</param>
 35        /// <param name="materialAsset">A material asset that will serve as the base of the combine result. A new materi
 36        /// <returns>true if succeeded, false if not</returns>
 37        public bool Combine(SkinnedMeshRenderer bonesContainer, SkinnedMeshRenderer[] renderersToCombine, Material mater
 38        {
 1439            Assert.IsTrue(bonesContainer != null, "bonesContainer should never be null!");
 1440            Assert.IsTrue(renderersToCombine != null, "renderersToCombine should never be null!");
 1441            Assert.IsTrue(materialAsset != null, "materialAsset should never be null!");
 42
 1443            SkinnedMeshRenderer[] renderers = renderersToCombine;
 44
 45            // Sanitize renderers list
 8746            renderers = renderers.Where( (x) => x != null && x.enabled && x.sharedMesh != null ).ToArray();
 47
 1448            if ( renderers.Length == 0 )
 149                return false;
 50
 1351            bool success = CombineInternal(
 52                bonesContainer,
 53                renderers,
 54                materialAsset);
 55
 56            // Disable original renderers
 15257            for ( int i = 0; i < renderers.Length; i++ )
 58            {
 6359                renderers[i].enabled = false;
 60            }
 61
 1362            return success;
 63        }
 64
 65        private bool CombineInternal(SkinnedMeshRenderer bonesContainer, SkinnedMeshRenderer[] renderers, Material mater
 66        {
 1367            Assert.IsTrue(bonesContainer != null, "bonesContainer should never be null!");
 1368            Assert.IsTrue(bonesContainer.sharedMesh != null, "bonesContainer should never be null!");
 1369            Assert.IsTrue(bonesContainer.sharedMesh.bindposes != null, "bonesContainer bindPoses should never be null!")
 1370            Assert.IsTrue(bonesContainer.bones != null, "bonesContainer bones should never be null!");
 1371            Assert.IsTrue(renderers != null, "renderers should never be null!");
 1372            Assert.IsTrue(materialAsset != null, "materialAsset should never be null!");
 73
 1374            AvatarMeshCombiner.Output output = AvatarMeshCombiner.CombineSkinnedMeshes(
 75                bonesContainer.sharedMesh.bindposes,
 76                bonesContainer.bones,
 77                renderers,
 78                materialAsset);
 79
 1380            if ( !output.isValid )
 81            {
 082                logger.LogError("AvatarMeshCombiner", "Combine failed!");
 083                return false;
 84            }
 85
 1386            Transform rootBone = bonesContainer.rootBone;
 87
 1388            if ( container == null )
 1189                this.container = new GameObject("CombinedAvatar");
 90
 1391            if ( renderer == null )
 1192                renderer = container.AddComponent<SkinnedMeshRenderer>();
 93
 1394            UnloadAssets();
 95
 1396            container.layer = bonesContainer.gameObject.layer;
 1397            renderer.sharedMesh = output.mesh;
 1398            renderer.bones = bonesContainer.bones;
 1399            renderer.rootBone = rootBone;
 13100            renderer.sharedMaterials = output.materials;
 13101            renderer.quality = SkinQuality.Bone4;
 13102            renderer.updateWhenOffscreen = false;
 13103            renderer.skinnedMotionVectors = false;
 13104            renderer.enabled = true;
 105
 13106            logger.Log("AvatarMeshCombiner", "Finish combining avatar. Click here to focus on GameObject.", container);
 13107            return true;
 108        }
 109
 110        private void UnloadAssets()
 111        {
 409112            if (renderer == null)
 385113                return;
 114
 24115            if (renderer.sharedMesh != null)
 13116                Object.Destroy(renderer.sharedMesh);
 117
 24118            if ( renderer.sharedMaterials != null)
 119            {
 114120                foreach ( var material in renderer.sharedMaterials )
 121                {
 33122                    Object.Destroy(material);
 123                }
 124            }
 24125        }
 126
 127        /// <summary>
 128        /// Disposes the created mesh, materials, GameObject and Renderer.
 129        /// </summary>
 130        public void Dispose()
 131        {
 396132            UnloadAssets();
 396133            Object.Destroy(container);
 396134        }
 135    }
 136}