3 #if PARADOX_EFFECT_COMPILER
5 using System.Collections.Generic;
8 using SiliconStudio.Paradox.Shaders.Parser.Ast;
9 using SiliconStudio.Shaders.Ast;
10 using SiliconStudio.Shaders.Ast.Hlsl;
11 using SiliconStudio.Shaders.Convertor;
13 namespace SiliconStudio.
Paradox.Shaders.Parser
15 public static class ShaderExtensions
18 internal static string associatedClass =
"AssociatedClass";
20 internal static string associatedCompositions =
"AssociatedCompositions";
22 public readonly
static string AssociatedMacrosTag =
"AssociatedMacros";
24 public static void ReplaceAnnotation(
this IAttributes node,
string name, params
object[] values)
26 foreach (var annotation
in node.Attributes.OfType<AttributeDeclaration>())
28 if (annotation.Name == name && annotation.Parameters.Count >= 1)
30 annotation.Parameters = values.Select(x =>
new Literal(x)).ToList();
34 node.Attributes.Add(
new AttributeDeclaration { Name =
new Identifier(name), Parameters = values.Select(x =>
new Literal(x)).ToList() });
37 public static ShaderRootClassType GetMainShaderClass(
this Shader shader)
39 var defaultShader = shader.Declarations.OfType<ShaderRootClassType>().FirstOrDefault(x => x.Name ==
"Shader");
40 if (defaultShader == null)
42 defaultShader =
new ShaderRootClassType(
"Shader");
43 shader.Declarations.Add(defaultShader);
48 public static ShaderRootClassType StartMix()
51 return new ShaderRootClassType(
"Mix");
54 public static ShaderRootClassType
Mix(
this Shader shader, TypeBase mixinClass)
57 var mainShaderClass = shader.GetMainShaderClass();
58 mainShaderClass.Mix(mixinClass);
60 return mainShaderClass;
63 public static ShaderRootClassType
Mix(
this ShaderRootClassType target, TypeBase mixinClass)
65 var typeName =
new TypeName(mixinClass.Name);
66 if (mixinClass is ShaderClassType)
67 typeName.SetTag(associatedClass, mixinClass);
68 target.BaseClasses.Add(typeName);
73 public static ShaderRootClassType
Compose(
this ShaderRootClassType sourceClass,
string variableName, params ShaderClassType[] variableTypes)
75 var currentVariableTypes = (Dictionary<string, ShaderClassType[]>)sourceClass.GetTag(associatedCompositions);
76 if (currentVariableTypes == null)
78 currentVariableTypes =
new Dictionary<string, ShaderClassType[]>();
79 sourceClass.SetTag(associatedCompositions, currentVariableTypes);
82 currentVariableTypes[variableName] = variableTypes;
87 private class NameEqualityComparer : IEqualityComparer<IDeclaration>
89 public bool Equals(IDeclaration x, IDeclaration
y)
91 return x.Name == y.Name;
94 public int GetHashCode(IDeclaration obj)
96 return obj.Name.GetHashCode();
106 public static StructType GetStream(
this Shader shader,
PipelineStage type,
bool input)
109 throw new NotImplementedException();
111 foreach (var typeDecl
in shader.Declarations.OfType<StructType>())
113 var stream = typeDecl.Attributes.OfType<AttributeDeclaration>().FirstOrDefault(x => x.Name ==
"Stream");
116 if ((
string)stream.Parameters[0].Value == (input ?
"Input" :
"Output") && (
string)stream.Parameters[1].Value == type.ToString())
124 public static MethodDefinition GetEntryPoint(
this Shader shader,
ShaderStage type)
126 return shader.Declarations.OfType<MethodDefinition>().FirstOrDefault(f => f.Attributes.OfType<AttributeDeclaration>().Any(
a => a.Name ==
"EntryPoint" && (string)a.Parameters[0].Value == type.ToString()));
_In_ size_t _In_ DXGI_FORMAT _In_ size_t _In_ float size_t y
The compose mixin used to specifiy a composition.
ShaderStage
Enum to specify shader stage.
PipelineStage
Enum to specify pipeline stage.