Brak opisu
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

RenderPipelineGraphicsSettingsStripper.cs 3.1KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. #if UNITY_EDITOR
  2. using System;
  3. using System.Collections.Generic;
  4. using System.Diagnostics.CodeAnalysis;
  5. using System.Reflection;
  6. namespace UnityEngine.Rendering
  7. {
  8. internal static partial class RenderPipelineGraphicsSettingsStripper
  9. {
  10. private static bool CanRemoveSettings(this List<IStripper> strippers, [DisallowNull] Type settingsType, [DisallowNull] IRenderPipelineGraphicsSettings settings)
  11. {
  12. const BindingFlags flags = BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance;
  13. var canRemoveSettings = true;
  14. object[] methodArgs = { Convert.ChangeType(settings, settingsType) };
  15. foreach (var stripperInstance in strippers)
  16. {
  17. var methodInfo = stripperInstance.GetType().GetMethod($"{nameof(IRenderPipelineGraphicsSettingsStripper<IRenderPipelineGraphicsSettings>.CanRemoveSettings)}", flags);
  18. if (methodInfo != null)
  19. canRemoveSettings &= (bool)methodInfo.Invoke(stripperInstance, methodArgs);
  20. }
  21. return canRemoveSettings;
  22. }
  23. private static bool CanTransferSettingsToPlayer(
  24. [DisallowNull] Dictionary<Type, List<IStripper>> strippersMap,
  25. [DisallowNull] IRenderPipelineGraphicsSettings settings,
  26. out bool isAvailableOnPlayerBuild,
  27. out bool strippersDefined)
  28. {
  29. isAvailableOnPlayerBuild = false;
  30. strippersDefined = false;
  31. var settingsType = settings.GetType();
  32. if (strippersMap.TryGetValue(settingsType, out var strippers))
  33. {
  34. if (!strippers.CanRemoveSettings(settingsType, settings))
  35. isAvailableOnPlayerBuild = true;
  36. strippersDefined = true;
  37. }
  38. else
  39. {
  40. if (settings.isAvailableInPlayerBuild)
  41. isAvailableOnPlayerBuild = true;
  42. }
  43. return isAvailableOnPlayerBuild;
  44. }
  45. public static void PerformStripping(
  46. List<IRenderPipelineGraphicsSettings> settingsList,
  47. List<IRenderPipelineGraphicsSettings> runtimeSettingsList)
  48. {
  49. if (settingsList == null)
  50. throw new ArgumentNullException(nameof(settingsList));
  51. if (runtimeSettingsList == null)
  52. throw new ArgumentNullException(nameof(runtimeSettingsList));
  53. using (var report = new Report())
  54. {
  55. runtimeSettingsList.Clear();
  56. var strippersMap = Fetcher.ComputeStrippersMap();
  57. for (int i = 0; i < settingsList.Count; ++i)
  58. {
  59. var settings = settingsList[i];
  60. if (settings == null)
  61. continue;
  62. if (CanTransferSettingsToPlayer(strippersMap, settings, out var isAvailableOnPlayerBuild, out var strippersDefined))
  63. runtimeSettingsList.Add(settings);
  64. report.AddStrippedSetting(settings.GetType(), isAvailableOnPlayerBuild, strippersDefined);
  65. }
  66. }
  67. }
  68. }
  69. }
  70. #endif