4 using System.Collections.Generic;
7 using SiliconStudio.Paradox.Shaders.Parser.Ast;
8 using SiliconStudio.Paradox.Shaders.Parser.Utility;
9 using SiliconStudio.Shaders.Ast;
10 using SiliconStudio.Shaders.Ast.Hlsl;
11 using SiliconStudio.Shaders.Utility;
12 using SiliconStudio.Shaders.Visitor;
16 namespace SiliconStudio.Paradox.Shaders.Parser.Mixins
24 private Dictionary<string, Variable> variableGenerics;
26 private Dictionary<string, Expression> expressionGenerics;
28 private Dictionary<string, Identifier> identifiersGenerics;
30 private Dictionary<string, string> stringGenerics;
32 private ParadoxClassInstanciator(
ShaderClassType classType, Dictionary<string, Expression> expressions, Dictionary<string, Identifier> identifiers,
LoggerResult log)
35 shaderClassType = classType;
36 expressionGenerics = expressions;
37 identifiersGenerics = identifiers;
39 variableGenerics = shaderClassType.ShaderGenerics.ToDictionary(x => x.Name.Text, x => x);
42 public static void Instanciate(
ShaderClassType classType, Dictionary<string, Expression> expressions, Dictionary<string, Identifier> identifiers,
LoggerResult log)
44 var instanciator =
new ParadoxClassInstanciator(classType, expressions, identifiers, log);
50 stringGenerics = identifiersGenerics.ToDictionary(x => x.Key, x => x.Value.ToString());
52 foreach (var baseClass
in shaderClassType.BaseClasses)
53 VisitDynamic(baseClass);
55 foreach (var member
in shaderClassType.Members)
58 foreach (var variable
in shaderClassType.ShaderGenerics)
60 variable.InitialValue = expressionGenerics[variable.Name.Text];
69 variable.Qualifiers |= StorageQualifier.Const;
70 variable.Qualifiers |= SiliconStudio.Shaders.Ast.Hlsl.StorageQualifier.Static;
72 shaderClassType.Members.Add(variable);
77 protected void Visit(
Variable variable)
79 Visit((
Node)variable);
85 string replacementSemantic;
86 if (stringGenerics.TryGetValue(sem.Name, out replacementSemantic))
88 if (logger != null && !(variableGenerics[sem.Name].Type is
SemanticType))
90 sem.Name = replacementSemantic;
96 var linkName = (string)annotation.Parameters[0].Value;
98 if (String.IsNullOrEmpty(linkName))
101 var replacements =
new List<Tuple<string, int>>();
103 foreach (var
generic in variableGenerics.Where(x => x.Value.Type is
LinkType))
105 var index = linkName.IndexOf(generic.Key, 0);
107 replacements.Add(Tuple.Create(generic.Key, index));
110 if (replacements.Count > 0)
112 var finalString =
"";
113 var currentIndex = 0;
114 foreach (var replacement
in replacements.OrderBy(x => x.Item2))
116 var replacementIndex = replacement.Item2;
117 var stringToReplace = replacement.Item1;
119 if (replacementIndex - currentIndex > 0)
120 finalString += linkName.Substring(currentIndex, replacementIndex - currentIndex);
121 finalString += stringGenerics[stringToReplace];
122 currentIndex = replacementIndex + stringToReplace.Length;
125 if (currentIndex < linkName.Length)
126 finalString += linkName.Substring(currentIndex);
128 annotation.Parameters[0] =
new Literal(finalString);
136 Visit((
Node)identifierGeneric);
138 for (var i = 0; i < identifierGeneric.Identifiers.Count; ++i)
141 if (identifiersGenerics.TryGetValue(identifierGeneric.Identifiers[i].
ToString(), out replacement))
142 identifierGeneric.Identifiers[i] = replacement;
static readonly MessageCode WarningUseSemanticType
SourceSpan Span
Gets or sets the source span.
Qualifier Qualifiers
Gets or sets the qualifiers.
A class to collect parsing/expression messages.
A member reference in the form {this}.{Name}
A generic identifier in the form Typename
List< AttributeBase > Attributes
A reference to a variable.
OrderedSet< CompositeEnum > Values
Gets or sets the values.
override string ToString()
SiliconStudio.Shaders.Ast.StorageQualifier StorageQualifier