4 using System.Collections.Generic;
7 using SiliconStudio.Paradox.Shaders.Parser.Analysis;
8 using SiliconStudio.Paradox.Shaders.Parser.Ast;
9 using SiliconStudio.Shaders.Ast;
11 namespace SiliconStudio.
Paradox.Shaders.Parser.Mixins
13 internal class ModuleMixin
15 #region Public members
20 public string MixinName;
25 public string MixinGenericName;
35 public MixinVirtualTable LocalVirtualTable =
new MixinVirtualTable();
40 public MixinVirtualTable VirtualTable =
new MixinVirtualTable();
45 public List<Node> RemainingNodes =
new List<Node>();
50 public List<ModuleMixin> BaseMixins =
new List<ModuleMixin>();
55 public List<ModuleMixin> InheritanceList =
new List<ModuleMixin>();
60 public HashSet<ModuleMixin> MinimalContext = null;
65 public Dictionary<Variable, ModuleMixin> VariableDependencies =
new Dictionary<Variable, ModuleMixin>();
70 public Dictionary<Variable, ModuleMixin> StageInitVariableDependencies =
new Dictionary<Variable, ModuleMixin>();
75 public ReferencesPool ClassReferences =
new ReferencesPool();
80 public ReferencesPool StaticReferences =
new ReferencesPool();
85 public ReferencesPool ExternReferences =
new ReferencesPool();
90 public ReferencesPool StageInitReferences =
new ReferencesPool();
95 public ParadoxParsingInfo ParsingInfo {
get; set; }
100 public int OccurenceId = 0;
105 public HashSet<Variable> PotentialConflictingVariables =
new HashSet<Variable>();
110 public HashSet<MethodDeclaration> PotentialConflictingMethods =
new HashSet<MethodDeclaration>();
115 public bool StageOnlyClass =
false;
130 public AnalysisStatus ModuleMixinBuildStatus = AnalysisStatus.None;
140 public AnalysisStatus SemanticAnalysisStatus = AnalysisStatus.None;
153 throw new Exception(
"[ModuleMixin.SetShaderAst] Shader has already been set");
155 MixinName = shader.Name.Text;
160 #region Public methods
169 foreach (var method
in LocalVirtualTable.Methods)
171 if (method.Method.IsSameSignature(expression) && method.Method is
MethodDefinition)
183 foreach (var method
in FindMethod(expression))
186 for (
int i = InheritanceList.Count - 1; i >= 0; --i)
188 foreach (var method
in InheritanceList[i].FindMethod(expression))
200 return LocalVirtualTable.Variables.Where(x => x.Variable.Name.Text == variableName);
208 public List<VariableShaderCouple> FindAllVariablesByName(
string variableName)
210 var resList = FindVariableByName(variableName).ToList();
212 for (
int i = InheritanceList.Count - 1; i >= 0; --i)
213 resList.AddRange(InheritanceList[i].FindVariableByName(variableName));
226 return VirtualTable.GetMethod(info.Shader, info.Slot);
237 return VirtualTable.GetMethod(info.Shader, info.Slot);
249 var thisMethod = VirtualTable.GetMethod(info.Shader, info.Slot);
251 if (thisMethod == null)
254 var startIndex = mixin ==
this ? InheritanceList.Count : InheritanceList.IndexOf(mixin);
256 for (
int i = startIndex - 1; i >= 0; --i)
258 var dep = InheritanceList[i];
259 var array = VirtualTable.VirtualTableGroup[dep.MixinName];
260 for (
int j = 0; j < array.Length; ++j)
262 var method = array[j];
263 if (method == thisMethod)
264 return dep.VirtualTable.VirtualTableGroup[dep.MixinName][j];
A method definition with a body of statements.
Toplevel container of a shader parsing result.
object GetTag(object tagKey)
Gets a tag value associated to this node..
AnalysisStatus
A status needed to analyze the mixin in the correct order within a compilation module ...