PipelineAssetUtility.cs 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170
  1. using System;
  2. using System.Collections;
  3. using System.Collections.Generic;
  4. using System.Reflection;
  5. using UnityEngine;
  6. using UnityEngine.Rendering;
  7. #if UNITY_EDITOR
  8. using UnityEditor;
  9. #endif
  10. #if URP_OUTLINE && UNITY_2019_1_OR_NEWER
  11. #if UNITY_2019_3_OR_NEWER
  12. using UnityEngine.Rendering.Universal;
  13. #else
  14. using UnityEngine.Rendering.LWRP;
  15. #endif
  16. #endif
  17. #if HDRP_OUTLINE
  18. using UnityEngine.Rendering.HighDefinition;
  19. #endif
  20. namespace EPOOutline
  21. {
  22. public static class PipelineFetcher
  23. {
  24. #if UNITY_2019_1_OR_NEWER
  25. public static RenderPipelineAsset CurrentAsset
  26. {
  27. get
  28. {
  29. #if UNITY_2019_3_OR_NEWER
  30. var pipeline = QualitySettings.renderPipeline;
  31. if (pipeline == null)
  32. pipeline = GraphicsSettings.renderPipelineAsset;
  33. #else
  34. var pipeline = GraphicsSettings.renderPipelineAsset;
  35. #endif
  36. return pipeline;
  37. }
  38. }
  39. #endif
  40. }
  41. #if (URP_OUTLINE || HDRP_OUTLINE) && UNITY_EDITOR && UNITY_2019_1_OR_NEWER
  42. public static class PipelineAssetUtility
  43. {
  44. public static RenderPipelineAsset CurrentAsset
  45. {
  46. get
  47. {
  48. return PipelineFetcher.CurrentAsset;
  49. }
  50. }
  51. public static HashSet<RenderPipelineAsset> ActiveAssets
  52. {
  53. get
  54. {
  55. var set = new HashSet<RenderPipelineAsset>();
  56. if (GraphicsSettings.renderPipelineAsset != null)
  57. set.Add(GraphicsSettings.renderPipelineAsset);
  58. #if UNITY_2019_3_OR_NEWER
  59. var qualitySettingNames = QualitySettings.names;
  60. for (var index = 0; index < qualitySettingNames.Length; index++)
  61. {
  62. var assset = QualitySettings.GetRenderPipelineAssetAt(index);
  63. if (assset == null)
  64. continue;
  65. set.Add(assset);
  66. }
  67. #endif
  68. return set;
  69. }
  70. }
  71. #if URP_OUTLINE
  72. public static object GetDefault(Type type)
  73. {
  74. if(type.IsValueType)
  75. {
  76. return Activator.CreateInstance(type);
  77. }
  78. return null;
  79. }
  80. public static RenderPipelineAsset CreateAsset(string path)
  81. {
  82. var method = typeof(UniversalRenderPipelineAsset)
  83. .GetMethod("CreateRendererAsset", BindingFlags.NonPublic | BindingFlags.Static);
  84. var methodParams = method.GetParameters();
  85. object[] parameters = new object[methodParams.Length];
  86. for (var index = 0; index < methodParams.Length; index++)
  87. parameters[index] = GetDefault(methodParams[index].ParameterType);
  88. var possibleParameters = new object[] {path + " renderer.asset", (RendererType)1, false, "Renderer"};
  89. for (var index = 0; index < Mathf.Min(possibleParameters.Length, parameters.Length); index++)
  90. parameters[index] = possibleParameters[index];
  91. var data = method.Invoke(null, parameters) as ScriptableRendererData;
  92. var pipeline = UniversalRenderPipelineAsset.Create(data);
  93. AssetDatabase.CreateAsset(pipeline, path + ".asset");
  94. return pipeline;
  95. }
  96. #endif
  97. #if HDRP_OUTLINE
  98. public static RenderPipelineAsset CreateHDRPAsset()
  99. {
  100. return ScriptableObject.CreateInstance<HDRenderPipelineAsset>();
  101. }
  102. #endif
  103. public static bool IsURPOrLWRP(RenderPipelineAsset asset)
  104. {
  105. return asset != null &&
  106. (asset.GetType().Name.Equals("LightweightRenderPipelineAsset") ||
  107. asset.GetType().Name.Equals("UniversalRenderPipelineAsset"));
  108. }
  109. public static bool IsHDRP(RenderPipelineAsset asset)
  110. {
  111. return asset != null &&
  112. asset.GetType().Name.Equals("HDRenderPipelineAsset");
  113. }
  114. #if URP_OUTLINE
  115. public static ScriptableRendererData GetRenderer(RenderPipelineAsset asset)
  116. {
  117. using (var so = new SerializedObject(asset))
  118. {
  119. so.Update();
  120. #if URP_OUTLINE
  121. #if UNITY_2019_3_OR_NEWER
  122. var rendererDataList = so.FindProperty("m_RendererDataList");
  123. var assetIndex = so.FindProperty("m_DefaultRendererIndex");
  124. var item = rendererDataList.GetArrayElementAtIndex(assetIndex.intValue);
  125. return item.objectReferenceValue as ScriptableRendererData;
  126. #else
  127. var rendererData = so.FindProperty("m_RendererData");
  128. return rendererData.objectReferenceValue as ScriptableRendererData;
  129. #endif
  130. #else
  131. return null;
  132. #endif
  133. }
  134. }
  135. public static bool IsAssetContainsSRPOutlineFeature(RenderPipelineAsset asset)
  136. {
  137. var data = GetRenderer(asset);
  138. return data.rendererFeatures.Find(x => x is URPOutlineFeature) != null;
  139. }
  140. #endif
  141. }
  142. #endif
  143. }