6 using SiliconStudio.Paradox.Shaders.Parser.Ast;
7 using SiliconStudio.Shaders.Ast;
8 using SiliconStudio.Shaders.Ast.Hlsl;
9 using SiliconStudio.Shaders.Visitor;
13 internal partial class ShaderKeySourceGenerator
15 public ShaderKeySourceGenerator(ShaderKeyClass shaderKeyClass)
17 this.ShaderKeyClass = shaderKeyClass;
20 public ShaderKeyClass ShaderKeyClass {
get; set; }
22 internal static ShaderKeyClass GenerateShaderKeyClass(
ShaderClassType shaderClassType)
24 ShaderKeyClass shaderKeyClass = null;
29 if (decl.Qualifiers.Contains(SiliconStudio.Shaders.Ast.Hlsl.StorageQualifier.Extern)
30 || decl.Qualifiers.Contains(SiliconStudio.Shaders.Ast.Hlsl.StorageQualifier.Const)
39 ShaderKeyVariable variable = null;
40 var type = decl.Type.ResolveType();
42 bool processInitialValue =
false;
47 type = ((ArrayType)type).Type.ResolveType();
52 processInitialValue =
true;
53 variable =
new ShaderKeyVariable(decl.Name, ((ScalarType)type).Type.FullName,
58 processInitialValue =
true;
59 var typeName =
"Vector" + ((VectorType)type).Dimension;
62 if (((VectorType)type).Dimension == 3)
64 else if (((VectorType)type).Dimension == 4)
67 throw new NotSupportedException(
"Color attribute is only valid for float3/float4.");
69 variable =
new ShaderKeyVariable(decl.Name, typeName,
74 processInitialValue =
true;
77 else if (type is
TextureType || IsStringInList(type.Name,
"Texture1D",
"RWTexture1D",
"Texture2D",
"RWTexture2D",
"Texture3D",
"RWTexture3D"))
86 IsStringInList(type.Name,
"StructuredBuffer",
"RWStructuredBuffer",
"ConsumeStructuredBuffer",
87 "AppendStructuredBuffer"))
94 variable.Category = ShaderKeyVariableCategory.ArrayValue;
99 throw new NotSupportedException();
102 if (decl.InitialValue != null && processInitialValue)
104 variable.InitialValue = decl.InitialValue.ToString();
107 if (isArray && variable.InitialValue.Contains(
"{"))
108 variable.InitialValue =
"new " + variable.Type +
"[] " + variable.InitialValue;
110 else if (isArray && processInitialValue)
113 var dimensions = ((ArrayType)decl.Type.ResolveType()).Dimensions;
114 if (dimensions.Count != 1)
115 throw new NotSupportedException();
117 var expressionResult = expressionEvaluator.Evaluate(dimensions[0]);
118 if (expressionResult.HasErrors)
119 throw new InvalidOperationException();
120 variable.InitialValue =
"new " + variable.Type +
"[" + expressionResult.Value +
"]";
121 variable.Type +=
"[]";
124 if (variable.InitialValue != null)
127 if (variable.InitialValue.StartsWith(
"float2")
128 || variable.InitialValue.StartsWith(
"float3")
129 || variable.InitialValue.StartsWith(
"float4"))
130 variable.InitialValue = variable.InitialValue.Replace(
"float",
"new Vector");
134 variable.InitialValue = variable.InitialValue.Replace(
"Vector3",
"Color3");
135 variable.InitialValue = variable.InitialValue.Replace(
"Vector4",
"Color4");
139 var variableType = decl.Attributes.OfType<
AttributeDeclaration>().Where(x => x.Name ==
"Type").Select(x => (string)x.Parameters[0].Value).FirstOrDefault();
140 if (variableType != null)
141 variable.Type = variableType;
143 variable.Map = decl.Attributes.OfType<
AttributeDeclaration>().Where(x => x.Name ==
"Map").Select(x => (string)x.Parameters[0].Value).FirstOrDefault();
146 if (shaderKeyClass == null)
147 shaderKeyClass =
new ShaderKeyClass(shaderClassType.
Name +
"Keys");
148 shaderKeyClass.Variables.Add(variable);
152 Console.WriteLine(
"Could not process variable {0}.{1} of type {2}", shaderClassType.Name, decl.Name,
156 return shaderKeyClass;
159 private static bool IsStringInList(
string value, params
string[] list)
161 return list.Any(str => string.Compare(value, str, StringComparison.InvariantCultureIgnoreCase) == 0);
Base class for all vector types
ShaderKeyVariableCategory
static readonly SiliconStudio.Shaders.Ast.StorageQualifier Stream
Stream keyword (stream).
Identifier Name
Gets or sets the name of this declaration
Let the emitter choose the style.
Base class for all generic types.
List< Node > Members
Gets or sets the members.
Identifier Name
Gets or sets the type name.