/// <summary> /// Loads generic classes that may appear in the mixin /// </summary> /// <param name="mixinInfo">The mixin to investigate</param> /// <param name="macros">The macros.</param> /// <param name="macrosString">The macros string.</param> private void LoadNecessaryShaders(ModuleMixinInfo mixinInfo, SiliconStudio.Shaders.Parser.ShaderMacro[] macros, string macrosString) { if (!mixinInfo.Instanciated) { return; } // Look for all the generic calls var shaderDependencyVisitor = new ShaderDependencyVisitor(mixinInfo.Log, ShaderLoader.SourceManager); shaderDependencyVisitor.Run(mixinInfo.MixinAst); foreach (var foundClass in shaderDependencyVisitor.FoundClasses) { var classSource = new ShaderClassSource(foundClass, null); var foundMixinInfo = GetModuleMixinInfo(classSource, macros, macrosString); mixinInfo.MinimalContext.UnionWith(foundMixinInfo.MinimalContext); } foreach (var id in shaderDependencyVisitor.FoundIdentifiers) { var genericClass = id.Item1; ModuleMixinInfo.CleanIdentifiers(genericClass.Identifiers); var genericParams = BuildShaderGenericParameters(genericClass); var classSource = new ShaderClassSource(genericClass.Text, genericParams); var instanciatedClassInfo = GetModuleMixinInfo(classSource, macros, macrosString); mixinInfo.MinimalContext.UnionWith(instanciatedClassInfo.MinimalContext); var newId = new Identifier(instanciatedClassInfo.MixinName); if (id.Item2 is TypeName) // in the baseclass list or in a variable declaration { (id.Item2 as TypeName).Name = newId; } else if (id.Item2 is VariableReferenceExpression) { (id.Item2 as VariableReferenceExpression).Name = newId; } else if (id.Item2 is MemberReferenceExpression) { (id.Item2 as MemberReferenceExpression).Member = newId; } } }
/// <summary> /// Loads generic classes that may appear in the mixin /// </summary> /// <param name="mixinInfo">The mixin to investigate</param> /// <param name="macros">The macros.</param> /// <param name="macrosString">The macros string.</param> private void LoadNecessaryShaders(ModuleMixinInfo mixinInfo, SiliconStudio.Shaders.Parser.ShaderMacro[] macros, string macrosString) { if (!mixinInfo.Instanciated) return; // Look for all the generic calls var shaderDependencyVisitor = new ShaderDependencyVisitor(mixinInfo.Log, ShaderLoader.SourceManager); shaderDependencyVisitor.Run(mixinInfo.MixinAst); foreach (var foundClass in shaderDependencyVisitor.FoundClasses) { var classSource = new ShaderClassSource(foundClass, null); var foundMixinInfo = GetModuleMixinInfo(classSource, macros, macrosString); mixinInfo.MinimalContext.UnionWith(foundMixinInfo.MinimalContext); } foreach (var id in shaderDependencyVisitor.FoundIdentifiers) { var genericClass = id.Item1; ModuleMixinInfo.CleanIdentifiers(genericClass.Identifiers); var genericParams = BuildShaderGenericParameters(genericClass); var classSource = new ShaderClassSource(genericClass.Text, genericParams); var instanciatedClassInfo = GetModuleMixinInfo(classSource, macros, macrosString); mixinInfo.MinimalContext.UnionWith(instanciatedClassInfo.MinimalContext); var newId = new Identifier(instanciatedClassInfo.MixinName); if (id.Item2 is TypeName) // in the baseclass list or in a variable declaration (id.Item2 as TypeName).Name = newId; else if (id.Item2 is VariableReferenceExpression) (id.Item2 as VariableReferenceExpression).Name = newId; else if (id.Item2 is MemberReferenceExpression) (id.Item2 as MemberReferenceExpression).Member = newId; } }