/// <summary> /// Generates a <see cref="ShaderMixinSource" /> for the specified names and parameters. /// </summary> /// <param name="pdxfxEffectName">The name.</param> /// <param name="properties">The properties.</param> /// <returns>The result of the mixin.</returns> /// <exception cref="System.ArgumentNullException"> /// pdxfxEffectName /// or /// properties /// </exception> /// <exception cref="System.ArgumentException">pdxfxEffectName</exception> public static ShaderMixinSource Generate(string pdxfxEffectName, ParameterCollection properties) { if (pdxfxEffectName == null) { throw new ArgumentNullException("pdxfxEffectName"); } if (properties == null) { throw new ArgumentNullException("properties"); } // Get the effect name and child effect name "RootEffectName.ChildEffectName" var effectName = GetEffectName(pdxfxEffectName); var rootEffectName = effectName.Key; var childEffectName = effectName.Value; IShaderMixinBuilder builder; Dictionary <string, IShaderMixinBuilder> builders; lock (RegisteredBuilders) { if (!TryGet(rootEffectName, out builder)) { throw new ArgumentException(string.Format("Pdxfx effect [{0}] not found", rootEffectName), "pdxfxEffectName"); } builders = new Dictionary <string, IShaderMixinBuilder>(RegisteredBuilders); } // TODO cache mixin context and avoid to recreate one (check if if thread concurrency could occur here) var mixinTree = new ShaderMixinSource() { Name = pdxfxEffectName }; var context = new ShaderMixinContext(mixinTree, properties, builders) { ChildEffectName = childEffectName }; try { builder.Generate(mixinTree, context); } catch (ShaderMixinDiscardException discard) { // We don't rethrow as this exception is on purpose to early exit/escape from a shader mixin } return(mixinTree); }
/// <summary> /// Generates a <see cref="ShaderMixinSourceTree" /> for the specified names and parameters. /// </summary> /// <param name="pdxfxEffectName">The name.</param> /// <param name="properties">The properties.</param> /// <returns>The result of the mixin.</returns> /// <exception cref="System.ArgumentNullException"> /// pdxfxEffectName /// or /// properties /// </exception> /// <exception cref="System.ArgumentException">pdxfxEffectName</exception> public static ShaderMixinSourceTree Generate(string pdxfxEffectName, ParameterCollection properties) { if (pdxfxEffectName == null) { throw new ArgumentNullException("pdxfxEffectName"); } if (properties == null) { throw new ArgumentNullException("properties"); } IShaderMixinBuilder builder; Dictionary <string, IShaderMixinBuilder> builders; lock (RegisteredBuilders) { if (!TryGet(pdxfxEffectName, out builder)) { throw new ArgumentException(string.Format("Pdxfx effect [{0}] not found", pdxfxEffectName), "pdxfxEffectName"); } builders = new Dictionary <string, IShaderMixinBuilder>(RegisteredBuilders); } // TODO cache mixin context and avoid to recreate one (check if if thread concurrency could occur here) var context = new ShaderMixinContext(properties, builders); var mixinTree = new ShaderMixinSourceTree() { Name = pdxfxEffectName }; context.BeginChild(mixinTree); builder.Generate(mixinTree, context); context.EndChild(); return(mixinTree); }
/// <summary> /// Generates a <see cref="ShaderMixinSourceTree"/> for the specified names and parameters. /// </summary> /// <param name="pdxfxEffectName">The name.</param> /// <param name="properties">The properties.</param> /// <param name="mainUsedParameters">The parameters when prcessing the mixin.</param> /// <returns>The result of the mixin.</returns> public static ShaderMixinSourceTree Generate(string pdxfxEffectName, ParameterCollection properties, out ShaderMixinParameters mainUsedParameters, out List <ShaderMixinParameters> usedParameters) { if (pdxfxEffectName == null) { throw new ArgumentNullException("pdxfxEffectName"); } if (properties == null) { throw new ArgumentNullException("properties"); } IShaderMixinBuilder builder; Dictionary <string, IShaderMixinBuilder> builders; lock (RegisteredBuilders) { if (!TryGet(pdxfxEffectName, out builder)) { throw new ArgumentException(string.Format("Pdxfx effect [{0}] not found", pdxfxEffectName), "pdxfxEffectName"); } builders = new Dictionary <string, IShaderMixinBuilder>(RegisteredBuilders); } var context = new ShaderMixinContext(properties, builders, pdxfxEffectName); var mixinTree = new ShaderMixinSourceTree() { Name = pdxfxEffectName }; builder.Generate(mixinTree, context); mainUsedParameters = context.GetMainUsedParameters(); usedParameters = context.GetUsedParameters(); return(mixinTree); }