暫無描述
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.

ShaderGraphRequirementsPerKeyword.cs 5.1KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132
  1. using System.Collections.Generic;
  2. using System.Linq;
  3. using UnityEditor.ShaderGraph;
  4. namespace UnityEditor.ShaderGraph.Internal
  5. {
  6. sealed class ShaderGraphRequirementsPerKeyword : KeywordDependentCollection<
  7. ShaderGraphRequirements,
  8. ShaderGraphRequirementsPerKeyword.All,
  9. ShaderGraphRequirementsPerKeyword.AllPermutations,
  10. ShaderGraphRequirementsPerKeyword.ForPermutationIndex,
  11. ShaderGraphRequirementsPerKeyword.Base,
  12. ShaderGraphRequirementsPerKeyword.IRequirements,
  13. ShaderGraphRequirementsPerKeyword.IRequirementsSet
  14. >
  15. {
  16. public interface IRequirements : KeywordDependentCollection.IInstance, KeywordDependentCollection.ISet<IRequirements>
  17. {
  18. void SetRequirements(ShaderGraphRequirements value);
  19. ShaderGraphRequirements requirements { get; set; }
  20. }
  21. public interface IRequirementsSet : KeywordDependentCollection.ISet<IRequirements>
  22. {
  23. }
  24. public struct ForPermutationIndex : IRequirements, IRequirementsSet
  25. {
  26. private ShaderGraphRequirementsPerKeyword m_Source;
  27. private int m_PermutationIndex;
  28. public KeywordDependentCollection.KeywordPermutationInstanceType type => KeywordDependentCollection.KeywordPermutationInstanceType.Permutation;
  29. public IEnumerable<IRequirements> instances => Enumerable.Repeat<IRequirements>(this, 1);
  30. public int instanceCount => 1;
  31. public int permutationIndex => m_PermutationIndex;
  32. public ShaderGraphRequirements requirements
  33. {
  34. get => m_Source.GetOrCreateForPermutationIndex(m_PermutationIndex);
  35. set => m_Source.SetForPermutationIndex(m_PermutationIndex, value);
  36. }
  37. public void SetRequirements(ShaderGraphRequirements value) => requirements = value;
  38. internal ForPermutationIndex(ShaderGraphRequirementsPerKeyword source, int index)
  39. {
  40. m_Source = source;
  41. m_PermutationIndex = index;
  42. }
  43. }
  44. public struct Base : IRequirements, IRequirementsSet
  45. {
  46. private ShaderGraphRequirementsPerKeyword m_Source;
  47. public int instanceCount => 1;
  48. public int permutationIndex => -1;
  49. public KeywordDependentCollection.KeywordPermutationInstanceType type => KeywordDependentCollection.KeywordPermutationInstanceType.Base;
  50. public IEnumerable<IRequirements> instances => Enumerable.Repeat<IRequirements>(this, 1);
  51. public ShaderGraphRequirements requirements
  52. {
  53. get => m_Source.baseStorage;
  54. set => m_Source.baseStorage = value;
  55. }
  56. public void SetRequirements(ShaderGraphRequirements value) => requirements = value;
  57. internal Base(ShaderGraphRequirementsPerKeyword source)
  58. {
  59. m_Source = source;
  60. }
  61. }
  62. public struct All : IRequirementsSet
  63. {
  64. private ShaderGraphRequirementsPerKeyword m_Source;
  65. public int instanceCount => m_Source.permutationCount + 1;
  66. internal All(ShaderGraphRequirementsPerKeyword source)
  67. {
  68. m_Source = source;
  69. }
  70. public IEnumerable<IRequirements> instances
  71. {
  72. get
  73. {
  74. var self = this;
  75. return m_Source.permutationStorages
  76. .Select((v, i) => new ForPermutationIndex(self.m_Source, i) as IRequirements)
  77. .Union(Enumerable.Repeat((IRequirements)m_Source.baseInstance, 1));
  78. }
  79. }
  80. }
  81. public struct AllPermutations : IRequirementsSet
  82. {
  83. private ShaderGraphRequirementsPerKeyword m_Source;
  84. public int instanceCount => m_Source.permutationCount;
  85. internal AllPermutations(ShaderGraphRequirementsPerKeyword source)
  86. {
  87. m_Source = source;
  88. }
  89. public IEnumerable<IRequirements> instances
  90. {
  91. get
  92. {
  93. var self = this;
  94. return m_Source.permutationStorages
  95. .Select((v, i) => new ForPermutationIndex(self.m_Source, i) as IRequirements);
  96. }
  97. }
  98. }
  99. public void UnionWith(ShaderGraphRequirementsPerKeyword other)
  100. {
  101. baseStorage = baseStorage.Union(other.baseStorage);
  102. for (var i = 0; i < other.permutationCount; ++i)
  103. SetForPermutationIndex(i,
  104. GetOrCreateForPermutationIndex(i).Union(other.GetOrCreateForPermutationIndex(i)));
  105. }
  106. protected override All CreateAllSmartPointer() => new All(this);
  107. protected override AllPermutations CreateAllPermutationsSmartPointer() => new AllPermutations(this);
  108. protected override ForPermutationIndex CreateForPermutationSmartPointer(int index) => new ForPermutationIndex(this, index);
  109. protected override Base CreateBaseSmartPointer() => new Base(this);
  110. }
  111. }