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

ActiveFields.cs 7.8KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using UnityEditor.ShaderGraph;
  5. using UnityEditor.ShaderGraph.Internal;
  6. namespace UnityEditor.ShaderGraph.Internal
  7. {
  8. internal interface IActiveFields : KeywordDependentCollection.IInstance, KeywordDependentCollection.ISet<IActiveFields>
  9. {
  10. IEnumerable<FieldDescriptor> fields { get; }
  11. bool Add(FieldDescriptor field);
  12. bool Contains(FieldDescriptor field);
  13. bool Contains(string value);
  14. }
  15. internal interface IActiveFieldsSet : KeywordDependentCollection.ISet<IActiveFields>
  16. {
  17. void AddAll(FieldDescriptor field);
  18. }
  19. internal class FieldNamePairStorage
  20. {
  21. private HashSet<FieldDescriptor> m_fieldDescriptors;
  22. private HashSet<string> m_fieldNames;
  23. public IEnumerable<FieldDescriptor> fields => m_fieldDescriptors;
  24. public FieldNamePairStorage()
  25. {
  26. m_fieldDescriptors = new HashSet<FieldDescriptor>();
  27. m_fieldNames = new HashSet<string>(StringComparer.Ordinal);
  28. }
  29. public IEnumerable<FieldDescriptor> Union(FieldNamePairStorage other)
  30. {
  31. var output = new HashSet<FieldDescriptor>(m_fieldDescriptors);
  32. output.UnionWith(other.m_fieldDescriptors);
  33. return output;
  34. }
  35. public bool Contains(FieldDescriptor fieldDescriptor)
  36. {
  37. return m_fieldDescriptors.Contains(fieldDescriptor);
  38. }
  39. public bool Contains(string fieldName)
  40. {
  41. return m_fieldNames.Contains(fieldName);
  42. }
  43. public bool Add(FieldDescriptor fieldDescriptor)
  44. {
  45. bool added = m_fieldDescriptors.Add(fieldDescriptor);
  46. if (added)
  47. {
  48. m_fieldNames.Add(fieldDescriptor.ToFieldString());
  49. }
  50. return added;
  51. }
  52. }
  53. internal sealed class ActiveFields : KeywordDependentCollection<
  54. FieldNamePairStorage,
  55. ActiveFields.All,
  56. ActiveFields.AllPermutations,
  57. ActiveFields.ForPermutationIndex,
  58. ActiveFields.Base,
  59. IActiveFields,
  60. IActiveFieldsSet
  61. >
  62. {
  63. public struct ForPermutationIndex : IActiveFields, IActiveFieldsSet
  64. {
  65. private ActiveFields m_Source;
  66. private int m_PermutationIndex;
  67. public KeywordDependentCollection.KeywordPermutationInstanceType type => KeywordDependentCollection.KeywordPermutationInstanceType.Permutation;
  68. public IEnumerable<IActiveFields> instances => Enumerable.Repeat<IActiveFields>(this, 1);
  69. public IEnumerable<FieldDescriptor> fields =>
  70. m_Source.baseStorage.Union(m_Source.GetOrCreateForPermutationIndex(m_PermutationIndex));
  71. public int instanceCount => 1;
  72. public int permutationIndex => m_PermutationIndex;
  73. internal ForPermutationIndex(ActiveFields source, int index)
  74. {
  75. m_Source = source;
  76. m_PermutationIndex = index;
  77. }
  78. public bool Add(FieldDescriptor field)
  79. => m_Source.GetOrCreateForPermutationIndex(m_PermutationIndex).Add(field);
  80. public bool Contains(FieldDescriptor field) =>
  81. m_Source.baseStorage.Contains(field)
  82. || m_Source.GetOrCreateForPermutationIndex(m_PermutationIndex).Contains(field);
  83. public bool Contains(string value) => m_Source.baseStorage.Contains(value)
  84. || m_Source.GetOrCreateForPermutationIndex(m_PermutationIndex).Contains(value);
  85. public void AddAll(FieldDescriptor field) => Add(field);
  86. }
  87. public struct Base : IActiveFields, IActiveFieldsSet
  88. {
  89. private ActiveFields m_Source;
  90. public IEnumerable<FieldDescriptor> fields => m_Source.baseStorage.fields;
  91. public int instanceCount => 1;
  92. public int permutationIndex => -1;
  93. public KeywordDependentCollection.KeywordPermutationInstanceType type => KeywordDependentCollection.KeywordPermutationInstanceType.Base;
  94. public IEnumerable<IActiveFields> instances => Enumerable.Repeat<IActiveFields>(this, 1);
  95. internal Base(ActiveFields source)
  96. {
  97. m_Source = source;
  98. }
  99. public bool Add(FieldDescriptor field) => m_Source.baseStorage.Add(field);
  100. public bool Contains(FieldDescriptor field) => m_Source.baseStorage.Contains(field);
  101. public bool Contains(string value) => m_Source.baseStorage.Contains(value);
  102. public void AddAll(FieldDescriptor field) => Add(field);
  103. }
  104. public struct All : IActiveFieldsSet
  105. {
  106. private ActiveFields m_Source;
  107. public int instanceCount => m_Source.permutationCount + 1;
  108. internal All(ActiveFields source)
  109. {
  110. m_Source = source;
  111. }
  112. public void AddAll(FieldDescriptor field)
  113. {
  114. m_Source.baseInstance.Add(field);
  115. for (var i = 0; i < m_Source.permutationCount; ++i)
  116. m_Source.GetOrCreateForPermutationIndex(i).Add(field);
  117. }
  118. public IEnumerable<IActiveFields> instances
  119. {
  120. get
  121. {
  122. var self = this;
  123. return m_Source.permutationStorages
  124. .Select((v, i) => new ForPermutationIndex(self.m_Source, i) as IActiveFields)
  125. .Union(Enumerable.Repeat((IActiveFields)m_Source.baseInstance, 1));
  126. }
  127. }
  128. }
  129. public struct AllPermutations : IActiveFieldsSet
  130. {
  131. private ActiveFields m_Source;
  132. public int instanceCount => m_Source.permutationCount;
  133. internal AllPermutations(ActiveFields source)
  134. {
  135. m_Source = source;
  136. }
  137. public void AddAll(FieldDescriptor field)
  138. {
  139. for (var i = 0; i < m_Source.permutationCount; ++i)
  140. m_Source.GetOrCreateForPermutationIndex(i).Add(field);
  141. }
  142. public IEnumerable<IActiveFields> instances
  143. {
  144. get
  145. {
  146. var self = this;
  147. return m_Source.permutationStorages
  148. .Select((v, i) => new ForPermutationIndex(self.m_Source, i) as IActiveFields);
  149. }
  150. }
  151. }
  152. public struct NoPermutation : IActiveFields, IActiveFieldsSet
  153. {
  154. private ActiveFields m_Source;
  155. public IEnumerable<FieldDescriptor> fields => m_Source.baseStorage.fields;
  156. public int instanceCount => 1;
  157. public int permutationIndex => -1;
  158. public KeywordDependentCollection.KeywordPermutationInstanceType type => KeywordDependentCollection.KeywordPermutationInstanceType.Base;
  159. internal NoPermutation(ActiveFields source)
  160. {
  161. m_Source = source;
  162. }
  163. public bool Add(FieldDescriptor field) => m_Source.baseInstance.Add(field);
  164. public bool Contains(FieldDescriptor field) => m_Source.baseStorage.Contains(field);
  165. public bool Contains(string value) => m_Source.baseStorage.Contains(value);
  166. public void AddAll(FieldDescriptor field) => Add(field);
  167. public IEnumerable<IActiveFields> instances => Enumerable.Repeat<IActiveFields>(this, 1);
  168. }
  169. protected override All CreateAllSmartPointer() => new All(this);
  170. protected override AllPermutations CreateAllPermutationsSmartPointer() => new AllPermutations(this);
  171. protected override ForPermutationIndex CreateForPermutationSmartPointer(int index) => new ForPermutationIndex(this, index);
  172. protected override Base CreateBaseSmartPointer() => new Base(this);
  173. }
  174. }