From b6e673aa4968a87aa769d8693e57a9a1a414566a Mon Sep 17 00:00:00 2001 From: Juan Molteni Date: Thu, 5 Jun 2025 09:43:17 -0300 Subject: [PATCH 1/2] Option solution number 2 --- .../Tests/Instantiate/AvatarInstantiatorSystemShould.cs | 2 +- .../DCL/AvatarRendering/Emotes/EmbeddedEmotesData.cs | 5 +++-- .../AvatarRendering/Loading/Assets/AttachmentAssetBase.cs | 7 +++---- .../Loading/Assets/AttachmentAssetUtility.cs | 6 ++++++ .../Wearables/Helpers/WearablePolymorphicBehaviour.cs | 4 ++-- .../Wearables/Systems/Load/LoadDefaultWearablesSystem.cs | 2 +- 6 files changed, 16 insertions(+), 10 deletions(-) diff --git a/Explorer/Assets/DCL/AvatarRendering/AvatarShape/Tests/Instantiate/AvatarInstantiatorSystemShould.cs b/Explorer/Assets/DCL/AvatarRendering/AvatarShape/Tests/Instantiate/AvatarInstantiatorSystemShould.cs index 51e33ed1852..3c058adcbcb 100644 --- a/Explorer/Assets/DCL/AvatarRendering/AvatarShape/Tests/Instantiate/AvatarInstantiatorSystemShould.cs +++ b/Explorer/Assets/DCL/AvatarRendering/AvatarShape/Tests/Instantiate/AvatarInstantiatorSystemShould.cs @@ -160,7 +160,7 @@ private IWearable GetMockWearable(string materialName, string category) mockWearable.DTO.Returns(dto); - var rendererInfo = new AttachmentRegularAsset.RendererInfo(skinnedMeshRenderer, fakeABMaterial); + var rendererInfo = new AttachmentRegularAsset.RendererInfo(fakeABMaterial); var wearableAsset = new AttachmentRegularAsset(avatarGameObject, new List { rendererInfo }, null); wearableAsset.AddReference(); diff --git a/Explorer/Assets/DCL/AvatarRendering/Emotes/EmbeddedEmotesData.cs b/Explorer/Assets/DCL/AvatarRendering/Emotes/EmbeddedEmotesData.cs index d5e6853a69e..f71820af029 100644 --- a/Explorer/Assets/DCL/AvatarRendering/Emotes/EmbeddedEmotesData.cs +++ b/Explorer/Assets/DCL/AvatarRendering/Emotes/EmbeddedEmotesData.cs @@ -2,6 +2,7 @@ using DCL.AvatarRendering.Loading.Components; using DCL.AvatarRendering.Loading.DTO; using DCL.AvatarRendering.Wearables.Helpers; +using ECS.StreamableLoading; using ECS.StreamableLoading.AudioClips; using ECS.StreamableLoading.Common.Components; using ECS.StreamableLoading.Textures; @@ -122,9 +123,9 @@ private static AttachmentRegularAsset CreateAttachmentAsset(GameObject glb) var rendererInfos = new List(); foreach (SkinnedMeshRenderer? renderer in glb.GetComponentsInChildren()) - rendererInfos.Add(new AttachmentRegularAsset.RendererInfo(renderer, renderer.sharedMaterial)); + rendererInfos.Add(new AttachmentRegularAsset.RendererInfo(renderer.sharedMaterial)); - return new AttachmentRegularAsset(glb, rendererInfos, ECS.StreamableLoading.IStreamableRefCountData.Null.INSTANCE); + return new AttachmentRegularAsset(glb, rendererInfos, IStreamableRefCountData.Null.INSTANCE); } } } diff --git a/Explorer/Assets/DCL/AvatarRendering/Loading/Assets/AttachmentAssetBase.cs b/Explorer/Assets/DCL/AvatarRendering/Loading/Assets/AttachmentAssetBase.cs index 1ae96e50783..59513645f7b 100644 --- a/Explorer/Assets/DCL/AvatarRendering/Loading/Assets/AttachmentAssetBase.cs +++ b/Explorer/Assets/DCL/AvatarRendering/Loading/Assets/AttachmentAssetBase.cs @@ -1,6 +1,7 @@ using DCL.Optimization.Pools; using DCL.Profiling; using ECS.StreamableLoading; +using ECS.StreamableLoading.AssetBundles; using System; using System.Collections.Generic; using UnityEngine; @@ -61,19 +62,17 @@ protected override void DisposeInternal() public readonly struct RendererInfo { - public readonly SkinnedMeshRenderer SkinnedMeshRenderer; public readonly Material Material; - public RendererInfo(SkinnedMeshRenderer skinnedMeshRenderer, Material material) + public RendererInfo(Material material) { - SkinnedMeshRenderer = skinnedMeshRenderer; Material = material != null ? material : DefaultMaterial.New(); } } public string GetInstanceName() { - var assetBundleData = assetData as ECS.StreamableLoading.AssetBundles.AssetBundleData; + var assetBundleData = assetData as AssetBundleData; return assetBundleData != null ? assetBundleData.GetInstanceName() : $"NOT_AB_{MainAsset.name}"; } } diff --git a/Explorer/Assets/DCL/AvatarRendering/Loading/Assets/AttachmentAssetUtility.cs b/Explorer/Assets/DCL/AvatarRendering/Loading/Assets/AttachmentAssetUtility.cs index d354fd85875..5231c8de509 100644 --- a/Explorer/Assets/DCL/AvatarRendering/Loading/Assets/AttachmentAssetUtility.cs +++ b/Explorer/Assets/DCL/AvatarRendering/Loading/Assets/AttachmentAssetUtility.cs @@ -22,6 +22,12 @@ public static CachedAttachment InstantiateWearable(this IAttachmentsAssetsCache else { var instantiatedWearable = Object.Instantiate(originalAsset.MainAsset, parent); + + //A wearable cannot have a MeshRenderer, only SkinnedMeshRenderer. + //We need to destroy it if thats the case + foreach (MeshRenderer? mr in instantiatedWearable.GetComponentsInChildren(includeInactive: true)) + Object.DestroyImmediate(mr.gameObject); + instantiatedWearable.name = originalAsset.GetInstanceName(); cachedWearable = new CachedAttachment(originalAsset, instantiatedWearable, outlineCompatible); } diff --git a/Explorer/Assets/DCL/AvatarRendering/Wearables/Helpers/WearablePolymorphicBehaviour.cs b/Explorer/Assets/DCL/AvatarRendering/Wearables/Helpers/WearablePolymorphicBehaviour.cs index 5f56c0643dc..9eeaf76b68e 100644 --- a/Explorer/Assets/DCL/AvatarRendering/Wearables/Helpers/WearablePolymorphicBehaviour.cs +++ b/Explorer/Assets/DCL/AvatarRendering/Wearables/Helpers/WearablePolymorphicBehaviour.cs @@ -331,7 +331,7 @@ public static AttachmentRegularAsset ToRegularAsset(this StreamableLoadingResult using PoolExtensions.Scope> pooledList = go.GetComponentsInChildrenIntoPooledList(); foreach (SkinnedMeshRenderer skinnedMeshRenderer in pooledList.Value) - rendererInfos.Add(new AttachmentRegularAsset.RendererInfo(skinnedMeshRenderer, skinnedMeshRenderer.sharedMaterial)); + rendererInfos.Add(new AttachmentRegularAsset.RendererInfo(skinnedMeshRenderer.sharedMaterial)); return new AttachmentRegularAsset(go, rendererInfos, result.Asset); } @@ -346,7 +346,7 @@ public static AttachmentRegularAsset ToRegularAsset(this StreamableLoadingResult using PoolExtensions.Scope> pooledList = go.GetComponentsInChildrenIntoPooledList(); foreach (SkinnedMeshRenderer skinnedMeshRenderer in pooledList.Value) - rendererInfos.Add(new AttachmentRegularAsset.RendererInfo(skinnedMeshRenderer, skinnedMeshRenderer.sharedMaterial)); + rendererInfos.Add(new AttachmentRegularAsset.RendererInfo(skinnedMeshRenderer.sharedMaterial)); return new AttachmentRegularAsset(go, rendererInfos, result.Asset); } diff --git a/Explorer/Assets/DCL/AvatarRendering/Wearables/Systems/Load/LoadDefaultWearablesSystem.cs b/Explorer/Assets/DCL/AvatarRendering/Wearables/Systems/Load/LoadDefaultWearablesSystem.cs index 7b6bc033d6a..88d177ca761 100644 --- a/Explorer/Assets/DCL/AvatarRendering/Wearables/Systems/Load/LoadDefaultWearablesSystem.cs +++ b/Explorer/Assets/DCL/AvatarRendering/Wearables/Systems/Load/LoadDefaultWearablesSystem.cs @@ -91,7 +91,7 @@ public override void Initialize() foreach (var skinnedMeshRenderer in emptyDefaultWearable.GetComponentsInChildren()) { skinnedMeshRenderer.sharedMesh = mesh; - rendererInfos.Add(new AttachmentRegularAsset.RendererInfo(skinnedMeshRenderer, skinnedMeshRenderer.sharedMaterial)); + rendererInfos.Add(new AttachmentRegularAsset.RendererInfo(skinnedMeshRenderer.sharedMaterial)); } IWearable emptyWearable = wearableStorage.GetOrAddByDTO(wearableDTO, false); From a23c8815061a98be9133fe784f48ffe0c9dc73de Mon Sep 17 00:00:00 2001 From: Juan Molteni Date: Sat, 7 Jun 2025 18:36:54 -0300 Subject: [PATCH 2/2] Using pool version --- .../Loading/Assets/AttachmentAssetUtility.cs | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/Explorer/Assets/DCL/AvatarRendering/Loading/Assets/AttachmentAssetUtility.cs b/Explorer/Assets/DCL/AvatarRendering/Loading/Assets/AttachmentAssetUtility.cs index 5231c8de509..cab6b67b40f 100644 --- a/Explorer/Assets/DCL/AvatarRendering/Loading/Assets/AttachmentAssetUtility.cs +++ b/Explorer/Assets/DCL/AvatarRendering/Loading/Assets/AttachmentAssetUtility.cs @@ -23,10 +23,12 @@ public static CachedAttachment InstantiateWearable(this IAttachmentsAssetsCache { var instantiatedWearable = Object.Instantiate(originalAsset.MainAsset, parent); + using PoolExtensions.Scope> meshRenderers = instantiatedWearable.GetComponentsInChildrenIntoPooledList(true); + //A wearable cannot have a MeshRenderer, only SkinnedMeshRenderer. - //We need to destroy it if thats the case - foreach (MeshRenderer? mr in instantiatedWearable.GetComponentsInChildren(includeInactive: true)) - Object.DestroyImmediate(mr.gameObject); + //We need to destroy it form the source wearable + for (var i = 0; i < meshRenderers.Value.Count; i++) + Object.DestroyImmediate(meshRenderers.Value[i].gameObject); instantiatedWearable.name = originalAsset.GetInstanceName(); cachedWearable = new CachedAttachment(originalAsset, instantiatedWearable, outlineCompatible);