#if URP_14_0_0_OR_NEWER using System.Collections; using System.Collections.Generic; using System.Reflection; using UnityEngine; using UnityEngine.Rendering.Universal; namespace UnityEngine.XR.MagicLeap { public static class URPExtensions { /// /// Retrieve the first ScriptableRendererFeature of type T found among all of the URP asset's Renderers /// public static ScriptableRendererFeature GetRendererFeature(this UniversalRenderPipelineAsset asset) where T : ScriptableRendererFeature { var universalRenderData = asset.GetRendererList(); if (universalRenderData != null && universalRenderData.Count > 0) { foreach (var renderData in universalRenderData) { foreach (var rendererFeature in renderData.rendererFeatures) { if (rendererFeature is T) { return rendererFeature; } } } } return null; } /// /// Retrieve the ScriptableRendererFeature of type T from the URP Renderer asset /// public static ScriptableRendererFeature GetRendererFeature(this UniversalRendererData asset) where T : ScriptableRendererFeature { foreach (var rendererFeature in asset.rendererFeatures) { if (rendererFeature is T) { return rendererFeature; } } return null; } /// /// Quickly retrieve the first (and probably only) item in the URP asset's Renderer List /// public static UniversalRendererData GetFirstRenderer(this UniversalRenderPipelineAsset asset) { var rendererList = asset.GetRendererList(); if(rendererList != null) { if(rendererList.Count > 0) { return rendererList[0]; } } return null; } /// /// Uses reflection to retrieve the list of UniversalRendererData assets assigned to the URP asset's Renderer List /// public static List GetRendererList(this UniversalRenderPipelineAsset asset) { var type = asset.GetType(); var propertyInfo = type.GetField("m_RendererDataList", BindingFlags.Instance | BindingFlags.NonPublic); if (propertyInfo == null) { return null; } var scriptableRenderDataArray = (ScriptableRendererData[])propertyInfo.GetValue(asset); var urpDataList = new List(); if(scriptableRenderDataArray != null) { foreach(var dataAsset in scriptableRenderDataArray) { if(dataAsset is UniversalRendererData) { urpDataList.Add(dataAsset as UniversalRendererData); } } } return urpDataList; } } } #endif