/// <summary> /// Hide the avatar and clean up its components. /// </summary> public virtual void Hide() { if (umaData != null) { umaData.CleanTextures(); umaData.CleanMesh(true); umaData.CleanAvatar(); Destroy(umaData.umaRoot); umaData.umaRoot = null; umaData.SetRenderers(null); umaData.animator = null; umaData.firstBake = true; umaData.skeleton = null; } umaRace = null; }
/// <summary> /// Hide the avatar and clean up its components. /// </summary> public virtual void Hide(bool DestroyRoot = true) { if (umaData != null) { umaData.CleanTextures(); umaData.CleanMesh(true); umaData.CleanAvatar(); if (DestroyRoot) { UMAUtils.DestroySceneObject(umaData.umaRoot); umaData.umaRoot = null; umaData.skeleton = null; } umaData.SetRenderers(null); umaData.animator = null; umaData.firstBake = true; } umaRace = null; }
protected override void Start() { if (generatedMaterialLookup == null) { generatedMaterialLookup = new Dictionary <GeneratedMaterialLookupKey, UMAData.GeneratedMaterial>(20); } else { generatedMaterialLookup.Clear(); } backUpTexture = umaData.backUpTextures(); umaData.CleanTextures(); generatedMaterials = new List <UMAData.GeneratedMaterial>(20); atlassedMaterials.Clear(); uniqueRenderers.Clear(); SlotData[] slots = umaData.umaRecipe.slotDataList; for (int i = 0; i < slots.Length; i++) { SlotData slot = slots[i]; if (slot == null) { continue; } if (slot.Suppressed) { continue; } //Keep a running list of unique RendererHashes from our slots //Null rendererAsset gets added, which is good, it is the default renderer. if (!uniqueRenderers.Contains(slot.rendererAsset)) { uniqueRenderers.Add(slot.rendererAsset); } // Let's only add the default overlay if the slot has meshData and NO overlays // This should be able to be removed if default overlay/textures are ever added to uma materials... if ((slot.asset.meshData != null) && (slot.OverlayCount == 0)) { if (umaGenerator.defaultOverlaydata != null) { slot.AddOverlay(umaGenerator.defaultOverlaydata); } } OverlayData overlay0 = slot.GetOverlay(0); if ((slot.asset.material != null) && (overlay0 != null)) { GeneratedMaterialLookupKey lookupKey = new GeneratedMaterialLookupKey { overlayList = slot.GetOverlayList(), rendererAsset = slot.rendererAsset }; UMAData.GeneratedMaterial generatedMaterial; if (!generatedMaterialLookup.TryGetValue(lookupKey, out generatedMaterial)) { generatedMaterial = FindOrCreateGeneratedMaterial(slot.asset.material, slot.rendererAsset); generatedMaterialLookup.Add(lookupKey, generatedMaterial); } int validOverlayCount = 0; for (int j = 0; j < slot.OverlayCount; j++) { var overlay = slot.GetOverlay(j); if (overlay != null) { validOverlayCount++; #if (UNITY_STANDALONE || UNITY_IOS || UNITY_ANDROID || UNITY_PS4 || UNITY_XBOXONE) && !UNITY_2017_3_OR_NEWER //supported platforms for procedural materials if (overlay.isProcedural) { overlay.GenerateProceduralTextures(); } #endif } } UMAData.MaterialFragment tempMaterialDefinition = new UMAData.MaterialFragment(); tempMaterialDefinition.baseOverlay = new UMAData.textureData(); tempMaterialDefinition.baseOverlay.textureList = overlay0.textureArray; tempMaterialDefinition.baseOverlay.alphaTexture = overlay0.alphaMask; tempMaterialDefinition.baseOverlay.overlayType = overlay0.overlayType; tempMaterialDefinition.umaMaterial = slot.asset.material; tempMaterialDefinition.baseColor = overlay0.colorData.color; tempMaterialDefinition.size = overlay0.pixelCount; tempMaterialDefinition.overlays = new UMAData.textureData[validOverlayCount - 1]; tempMaterialDefinition.overlayColors = new Color32[validOverlayCount - 1]; tempMaterialDefinition.rects = new Rect[validOverlayCount - 1]; tempMaterialDefinition.overlayData = new OverlayData[validOverlayCount]; tempMaterialDefinition.channelMask = new Color[validOverlayCount][]; tempMaterialDefinition.channelAdditiveMask = new Color[validOverlayCount][]; tempMaterialDefinition.overlayData[0] = slot.GetOverlay(0); tempMaterialDefinition.channelMask[0] = slot.GetOverlay(0).colorData.channelMask; tempMaterialDefinition.channelAdditiveMask[0] = slot.GetOverlay(0).colorData.channelAdditiveMask; tempMaterialDefinition.slotData = slot; int overlayID = 0; for (int j = 1; j < slot.OverlayCount; j++) { OverlayData overlay = slot.GetOverlay(j); if (overlay == null) { continue; } if (IsUVCoordinates(overlay.rect)) { tempMaterialDefinition.rects[overlayID] = ScaleToBase(overlay.rect, overlay0.textureArray[0]); } else { tempMaterialDefinition.rects[overlayID] = overlay.rect; // JRRM: Convert here into base overlay coordinates? } tempMaterialDefinition.overlays[overlayID] = new UMAData.textureData(); tempMaterialDefinition.overlays[overlayID].textureList = overlay.textureArray; tempMaterialDefinition.overlays[overlayID].alphaTexture = overlay.alphaMask; tempMaterialDefinition.overlays[overlayID].overlayType = overlay.overlayType; tempMaterialDefinition.overlayColors[overlayID] = overlay.colorData.color; overlayID++; tempMaterialDefinition.overlayData[overlayID] = overlay; tempMaterialDefinition.channelMask[overlayID] = overlay.colorData.channelMask; tempMaterialDefinition.channelAdditiveMask[overlayID] = overlay.colorData.channelAdditiveMask; } tempMaterialDefinition.overlayList = lookupKey.overlayList; tempMaterialDefinition.isRectShared = false; for (int j = 0; j < generatedMaterial.materialFragments.Count; j++) { if (tempMaterialDefinition.overlayList == generatedMaterial.materialFragments[j].overlayList) { tempMaterialDefinition.isRectShared = true; tempMaterialDefinition.rectFragment = generatedMaterial.materialFragments[j]; break; } } generatedMaterial.materialFragments.Add(tempMaterialDefinition); } } //**************************************************** //* Set parameters based on shader parameter mapping //**************************************************** for (int i = 0; i < generatedMaterials.Count; i++) { UMAData.GeneratedMaterial ugm = generatedMaterials[i]; if (ugm.umaMaterial.shaderParms != null) { for (int j = 0; j < ugm.umaMaterial.shaderParms.Length; j++) { UMAMaterial.ShaderParms parm = ugm.umaMaterial.shaderParms[j]; if (ugm.material.HasProperty(parm.ParameterName)) { foreach (OverlayColorData ocd in umaData.umaRecipe.sharedColors) { if (ocd.name == parm.ColorName) { ugm.material.SetColor(parm.ParameterName, ocd.color); break; } } } } } } packTexture = new MaxRectsBinPack(umaGenerator.atlasResolution, umaGenerator.atlasResolution, false); }
protected override void Start() { if (generatedMaterialLookup == null) { generatedMaterialLookup = new Dictionary <List <OverlayData>, UMAData.GeneratedMaterial>(20); } else { generatedMaterialLookup.Clear(); } backUpTexture = umaData.backUpTextures(); umaData.CleanTextures(); generatedMaterials = new List <UMAData.GeneratedMaterial>(20); atlassedMaterials.Clear(); SlotData[] slots = umaData.umaRecipe.slotDataList; for (int i = 0; i < slots.Length; i++) { var slot = slots[i]; if (slot == null) { continue; } if (slot.asset.material != null && slot.GetOverlay(0) != null) { var overlayList = slot.GetOverlayList(); UMAData.GeneratedMaterial generatedMaterial; if (!generatedMaterialLookup.TryGetValue(overlayList, out generatedMaterial)) { generatedMaterial = FindOrCreateGeneratedMaterial(slots[i].asset.material); generatedMaterialLookup.Add(overlayList, generatedMaterial); } var tempMaterialDefinition = new UMAData.MaterialFragment(); tempMaterialDefinition.baseTexture = slots[i].GetOverlay(0).asset.textureList; tempMaterialDefinition.size = tempMaterialDefinition.baseTexture[0].width * tempMaterialDefinition.baseTexture[0].height; tempMaterialDefinition.baseColor = slots[i].GetOverlay(0).colorData.color; tempMaterialDefinition.umaMaterial = slots[i].asset.material; int overlays = 0; for (int overlayCounter = 0; overlayCounter < slots[i].OverlayCount; overlayCounter++) { var overlay = slots[i].GetOverlay(overlayCounter); if (overlay != null) { overlays++; } } tempMaterialDefinition.overlays = new UMAData.textureData[overlays - 1]; tempMaterialDefinition.overlayColors = new Color32[overlays - 1]; tempMaterialDefinition.rects = new Rect[overlays - 1]; tempMaterialDefinition.overlayData = new OverlayData[overlays]; tempMaterialDefinition.channelMask = new Color[overlays][]; tempMaterialDefinition.channelAdditiveMask = new Color[overlays][]; tempMaterialDefinition.overlayData[0] = slots[i].GetOverlay(0); tempMaterialDefinition.channelMask[0] = slots[i].GetOverlay(0).colorData.channelMask; tempMaterialDefinition.channelAdditiveMask[0] = slots[i].GetOverlay(0).colorData.channelAdditiveMask; tempMaterialDefinition.slotData = slots[i]; int overlayID = 0; for (int overlayCounter = 0; overlayCounter < slots[i].OverlayCount - 1; overlayCounter++) { var overlay = slots[i].GetOverlay(overlayCounter + 1); if (overlay == null) { continue; } tempMaterialDefinition.overlays[overlayID] = new UMAData.textureData(); tempMaterialDefinition.rects[overlayID] = overlay.rect; tempMaterialDefinition.overlays[overlayID].textureList = overlay.asset.textureList; tempMaterialDefinition.overlayColors[overlayID] = overlay.colorData.color; tempMaterialDefinition.channelMask[overlayID + 1] = overlay.colorData.channelMask; tempMaterialDefinition.channelAdditiveMask[overlayID + 1] = overlay.colorData.channelAdditiveMask; tempMaterialDefinition.overlayData[overlayID + 1] = overlay; overlayID++; } tempMaterialDefinition.overlayList = slots[i].GetOverlayList(); tempMaterialDefinition.isRectShared = false; for (int j = 0; j < generatedMaterial.materialFragments.Count; j++) { if (generatedMaterial.materialFragments[j].overlayList == tempMaterialDefinition.overlayList) { tempMaterialDefinition.isRectShared = true; tempMaterialDefinition.rectFragment = generatedMaterial.materialFragments[j]; break; } } generatedMaterial.materialFragments.Add(tempMaterialDefinition); } } packTexture = new MaxRectsBinPack(umaGenerator.atlasResolution, umaGenerator.atlasResolution, false); }
protected override void Start() { if (generatedMaterialLookup == null) { generatedMaterialLookup = new Dictionary <List <OverlayData>, UMAData.GeneratedMaterial>(20); } else { generatedMaterialLookup.Clear(); } backUpTexture = umaData.backUpTextures(); umaData.CleanTextures(); generatedMaterials = new List <UMAData.GeneratedMaterial>(20); atlassedMaterials.Clear(); rendererCount = 0; SlotData[] slots = umaData.umaRecipe.slotDataList; for (int i = 0; i < slots.Length; i++) { var slot = slots[i]; if (slot == null) { continue; } if ((slot.asset.material != null) && (slot.GetOverlay(0) != null)) { if (!slot.asset.material.RequireSeperateRenderer) { // At least one slot that doesn't require a seperate renderer, so we reserve renderer 0 for those. rendererCount = 1; break; } } } for (int i = 0; i < slots.Length; i++) { SlotData slot = slots[i]; if (slot == null) { continue; } // Let's only add the default overlay if the slot has overlays and NO meshData if ((slot.asset.meshData != null) && (slot.OverlayCount == 0)) { if (umaGenerator.defaultOverlaydata != null) { slot.AddOverlay(umaGenerator.defaultOverlaydata); } } OverlayData overlay0 = slot.GetOverlay(0); if ((slot.asset.material != null) && (overlay0 != null)) { List <OverlayData> overlayList = slot.GetOverlayList(); UMAData.GeneratedMaterial generatedMaterial; if (!generatedMaterialLookup.TryGetValue(overlayList, out generatedMaterial)) { generatedMaterial = FindOrCreateGeneratedMaterial(slot.asset.material); generatedMaterialLookup.Add(overlayList, generatedMaterial); } int validOverlayCount = 0; for (int j = 0; j < slot.OverlayCount; j++) { var overlay = slot.GetOverlay(j); if (overlay != null) { validOverlayCount++; #if UNITY_STANDALONE || UNITY_IOS || UNITY_ANDROID || UNITY_PS4 || UNITY_XBOXONE //supported platforms for procedural materials if (overlay.isProcedural) { overlay.GenerateProceduralTextures(); } #endif } } UMAData.MaterialFragment tempMaterialDefinition = new UMAData.MaterialFragment(); tempMaterialDefinition.baseOverlay = new UMAData.textureData(); tempMaterialDefinition.baseOverlay.textureList = overlay0.textureArray; tempMaterialDefinition.baseOverlay.alphaTexture = overlay0.alphaMask; tempMaterialDefinition.baseOverlay.overlayType = overlay0.overlayType; tempMaterialDefinition.umaMaterial = slot.asset.material; tempMaterialDefinition.baseColor = overlay0.colorData.color; tempMaterialDefinition.size = overlay0.pixelCount; tempMaterialDefinition.overlays = new UMAData.textureData[validOverlayCount - 1]; tempMaterialDefinition.overlayColors = new Color32[validOverlayCount - 1]; tempMaterialDefinition.rects = new Rect[validOverlayCount - 1]; tempMaterialDefinition.overlayData = new OverlayData[validOverlayCount]; tempMaterialDefinition.channelMask = new Color[validOverlayCount][]; tempMaterialDefinition.channelAdditiveMask = new Color[validOverlayCount][]; tempMaterialDefinition.overlayData[0] = slot.GetOverlay(0); tempMaterialDefinition.channelMask[0] = slot.GetOverlay(0).colorData.channelMask; tempMaterialDefinition.channelAdditiveMask[0] = slot.GetOverlay(0).colorData.channelAdditiveMask; tempMaterialDefinition.slotData = slot; int overlayID = 0; for (int j = 1; j < slot.OverlayCount; j++) { OverlayData overlay = slot.GetOverlay(j); if (overlay == null) { continue; } tempMaterialDefinition.rects[overlayID] = overlay.rect; tempMaterialDefinition.overlays[overlayID] = new UMAData.textureData(); tempMaterialDefinition.overlays[overlayID].textureList = overlay.textureArray; tempMaterialDefinition.overlays[overlayID].alphaTexture = overlay.alphaMask; tempMaterialDefinition.overlays[overlayID].overlayType = overlay.overlayType; tempMaterialDefinition.overlayColors[overlayID] = overlay.colorData.color; overlayID++; tempMaterialDefinition.overlayData[overlayID] = overlay; tempMaterialDefinition.channelMask[overlayID] = overlay.colorData.channelMask; tempMaterialDefinition.channelAdditiveMask[overlayID] = overlay.colorData.channelAdditiveMask; } tempMaterialDefinition.overlayList = overlayList; tempMaterialDefinition.isRectShared = false; for (int j = 0; j < generatedMaterial.materialFragments.Count; j++) { if (tempMaterialDefinition.overlayList == generatedMaterial.materialFragments[j].overlayList) { tempMaterialDefinition.isRectShared = true; tempMaterialDefinition.rectFragment = generatedMaterial.materialFragments[j]; break; } } generatedMaterial.materialFragments.Add(tempMaterialDefinition); } } packTexture = new MaxRectsBinPack(umaGenerator.atlasResolution, umaGenerator.atlasResolution, false); }