Paradox Game Engine  v1.0.0 beta06
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Events Macros Pages
ShaderMixinManager.cs
Go to the documentation of this file.
1 // Copyright (c) 2014 Silicon Studio Corp. (http://siliconstudio.co.jp)
2 // This file is distributed under GPL v3. See LICENSE.md for details.
3 using System;
4 using System.Collections.Generic;
5 
6 using SiliconStudio.Paradox.Effects;
7 
8 namespace SiliconStudio.Paradox.Shaders
9 {
10  /// <summary>
11  /// Manages <see cref="IShaderMixinBuilder"/> and generation of shader mixins.
12  /// </summary>
13  public class ShaderMixinManager
14  {
15  private static readonly Dictionary<string, IShaderMixinBuilder> RegisteredBuilders = new Dictionary<string, IShaderMixinBuilder>();
16 
17  /// <summary>
18  /// Registers a <see cref="IShaderMixinBuilder"/> with the specified pdxfx effect name.
19  /// </summary>
20  /// <param name="pdxfxEffectName">Name of the mixin.</param>
21  /// <param name="builder">The builder.</param>
22  /// <exception cref="System.ArgumentNullException">
23  /// pdxfxEffectName
24  /// or
25  /// builder
26  /// </exception>
27  public static void Register(string pdxfxEffectName, IShaderMixinBuilder builder)
28  {
29  if (pdxfxEffectName == null)
30  throw new ArgumentNullException("pdxfxEffectName");
31 
32  if (builder == null)
33  throw new ArgumentNullException("builder");
34 
35  lock (RegisteredBuilders)
36  {
37  RegisteredBuilders[pdxfxEffectName] = builder;
38  }
39  }
40 
41  /// <summary>
42  /// Determines whether the specified PDXFX effect is registered.
43  /// </summary>
44  /// <param name="pdxfxEffectName">Name of the PDXFX effect.</param>
45  /// <returns><c>true</c> if the specified PDXFX effect is registered; otherwise, <c>false</c>.</returns>
46  /// <exception cref="System.ArgumentNullException">pdxfxEffectName</exception>
47  public static bool Contains(string pdxfxEffectName)
48  {
49  if (pdxfxEffectName == null) throw new ArgumentNullException("pdxfxEffectName");
50  lock (RegisteredBuilders)
51  {
52  return RegisteredBuilders.ContainsKey(pdxfxEffectName);
53  }
54  }
55 
56  /// <summary>
57  /// Tries to get a <see cref="IShaderMixinBuilder"/> by its name.
58  /// </summary>
59  /// <param name="pdxfxEffectName">Name of the mixin.</param>
60  /// <param name="builder">The builder instance found or null if not found.</param>
61  /// <returns><c>true</c> if the builder was found, <c>false</c> otherwise.</returns>
62  /// <exception cref="System.ArgumentNullException">pdxfxEffectName</exception>
63  public static bool TryGet(string pdxfxEffectName, out IShaderMixinBuilder builder)
64  {
65  if (pdxfxEffectName == null)
66  throw new ArgumentNullException("pdxfxEffectName");
67 
68  lock (RegisteredBuilders)
69  {
70  return RegisteredBuilders.TryGetValue(pdxfxEffectName, out builder);
71  }
72  }
73 
74  /// <summary>
75  /// Generates a <see cref="ShaderMixinSourceTree"/> for the specified names and parameters.
76  /// </summary>
77  /// <param name="pdxfxEffectName">The name.</param>
78  /// <param name="properties">The properties.</param>
79  /// <param name="mainUsedParameters">The parameters when prcessing the mixin.</param>
80  /// <returns>The result of the mixin.</returns>
81  public static ShaderMixinSourceTree Generate(string pdxfxEffectName, ParameterCollection properties, out ShaderMixinParameters mainUsedParameters, out List<ShaderMixinParameters> usedParameters)
82  {
83  if (pdxfxEffectName == null) throw new ArgumentNullException("pdxfxEffectName");
84 
85  if (properties == null)
86  throw new ArgumentNullException("properties");
87 
88  IShaderMixinBuilder builder;
89  Dictionary<string, IShaderMixinBuilder> builders;
90  lock (RegisteredBuilders)
91  {
92  if (!TryGet(pdxfxEffectName, out builder))
93  throw new ArgumentException(string.Format("Pdxfx effect [{0}] not found", pdxfxEffectName), "pdxfxEffectName");
94 
95  builders = new Dictionary<string, IShaderMixinBuilder>(RegisteredBuilders);
96  }
97 
98  var context = new ShaderMixinContext(properties, builders, pdxfxEffectName);
99  var mixinTree = new ShaderMixinSourceTree() { Name = pdxfxEffectName };
100  builder.Generate(mixinTree, context);
101 
102  mainUsedParameters = context.GetMainUsedParameters();
103  usedParameters = context.GetUsedParameters();
104  return mixinTree;
105  }
106 
107  /// <summary>
108  /// Un-register all registered <see cref="IShaderMixinBuilder"/>.
109  /// </summary>
110  public static void UnRegisterAll()
111  {
112  lock (RegisteredBuilders)
113  {
114  RegisteredBuilders.Clear();
115  }
116  }
117  }
118 }
static bool Contains(string pdxfxEffectName)
Determines whether the specified PDXFX effect is registered.
static void UnRegisterAll()
Un-register all registered IShaderMixinBuilder.
A context used when mixin ShaderSource.
static ShaderMixinSourceTree Generate(string pdxfxEffectName, ParameterCollection properties, out ShaderMixinParameters mainUsedParameters, out List< ShaderMixinParameters > usedParameters)
Generates a ShaderMixinSourceTree for the specified names and parameters.
static void Register(string pdxfxEffectName, IShaderMixinBuilder builder)
Registers a IShaderMixinBuilder with the specified pdxfx effect name.
Manages IShaderMixinBuilder and generation of shader mixins.
Interface to be implemented for dynamic mixin generation.
static bool TryGet(string pdxfxEffectName, out IShaderMixinBuilder builder)
Tries to get a IShaderMixinBuilder by its name.
A container to handle a hierarchical collection of effect variables.