Example #1
0
        /// <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);
        }