// Copyright (c) Microsoft Corporation. // Licensed under the MIT License. #if GT_USE_URP using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; namespace Microsoft.MixedReality.GraphicsTools { /// /// Helper component that automatically enables/disables the specified acrylic layer when an object is enabled/disabled /// (notifying the acrylic layer manager and updating the object's material). Attach to any object that uses an acrylic material. /// EnableLayer() & DisableLayer() methods can be used to explicitly enable or disable the designated layer. /// public class AcrylicHelper : MonoBehaviour { [Experimental] [SerializeField] [Range(0, 1)] private int blurLayer = 0; private bool useAcrylic = false; private Graphic cachedGraphic = null; private Coroutine initCoroutine = null; #region Monobehavior methods private void OnEnable() { initCoroutine = StartCoroutine(WaitForAcrylicLayerManager()); } private void OnDisable() { if (initCoroutine != null) { StopCoroutine(initCoroutine); initCoroutine = null; } else { DisableLayer(); } } #endregion #region public methods /// /// Adds a reference to the current blur layer. /// public void EnableLayer() { if (AcrylicLayerManager.Instance != null) { AcrylicLayerManager.Instance.EnableLayer(blurLayer); } } /// /// Removes a reference from the current blur layer. /// public void DisableLayer() { if (AcrylicLayerManager.Instance != null) { AcrylicLayerManager.Instance.DisableLayer(blurLayer); } } #endregion #region private methods private void UpdateMaterialState() { if (cachedGraphic == null) { cachedGraphic = GetComponent(); } if (cachedGraphic != null) { useAcrylic = AcrylicLayerManager.Instance != null && AcrylicLayerManager.Instance.AcrylicActive; SetMaterialState(cachedGraphic.material, "_BLUR_TEXTURE_ENABLE_", useAcrylic && blurLayer == 0); SetMaterialState(cachedGraphic.material, "_BLUR_TEXTURE_2_ENABLE_", useAcrylic && blurLayer == 1); cachedGraphic.SetMaterialDirty(); } } private void SetMaterialState(Material m, string keyword, bool enable) { if (enable) { m.EnableKeyword(keyword); } else { m.DisableKeyword(keyword); } } private IEnumerator WaitForAcrylicLayerManager() { // wait for the AcylicLayerManager to exist while (AcrylicLayerManager.Instance == null) { yield return null; } // then update material/layer UpdateMaterialState(); EnableLayer(); initCoroutine = null; } #endregion } } #endif // GT_USE_URP