Paradox Game Engine  v1.0.0 beta06
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Events Macros Pages
EffectParameterKeyStandardGenerator.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 using System.Linq;
6 
7 using SiliconStudio.Core;
8 using SiliconStudio.Core.Serialization;
9 using SiliconStudio.Paradox.Effects;
10 
11 namespace SiliconStudio.Paradox.Assets.Effect.ValueGenerators
12 {
13  /// <summary>
14  /// Default implementation for a <see cref="IEffectParameterGenerator"/> using a dictionary of <see cref="ParameterKey"/>
15  /// associated with:
16  /// <ul>
17  /// <li>An object value</li>
18  /// <li>A list of object value (implementing <see cref="IList{Object}"/></li>
19  /// <li>A value generator <see cref="IEffectParameterValueGenerator"/></li>
20  /// <li>A list of value generator <see cref="IEffectParameterValueGenerator"/></li>
21  /// </ul>
22  /// </summary>
23  [DataContract("!fx.generator.standard")]
24  [SiliconStudio.Core.Serialization.Serializers.DataSerializer(typeof(EffectParameterKeyStandardGeneratorSerializer))]
26  {
28  {
29  foreach (var item in this)
30  {
31  var collectionGenerator = item.Value as EffectParameterValueGeneratorCollection;
32  if (collectionGenerator != null)
33  {
34  foreach (var effectParameterValueGenerator in collectionGenerator)
35  {
36  foreach (var value in effectParameterValueGenerator.GenerateValues(item.Key))
37  {
38  yield return CreateKeyValue(item.Key, value);
39  }
40  }
41  }
42  else
43  {
44  var valueGenerator = item.Value as IEffectParameterValueGenerator;
45  if (valueGenerator != null)
46  {
47  foreach (var value in valueGenerator.GenerateValues(item.Key))
48  {
49  yield return CreateKeyValue(item.Key, value);
50  }
51  }
52  else
53  {
54  var directValues = item.Value as IList<object>;
55  if (directValues != null)
56  {
57  foreach (var value in directValues)
58  {
59  yield return CreateKeyValue(item.Key, value);
60  }
61  }
62  else
63  {
64  yield return CreateKeyValue(item.Key, item.Value);
65  }
66  }
67  }
68  }
69  }
70 
71  // TODO this is not reusable outside this class (in other generators?)
72  private KeyValuePair<ParameterKey, object> CreateKeyValue(ParameterKey key, object value)
73  {
74  // Find the real key instead of key loaded from yaml
75  // as it can be later change at runtime
76  var keyName= key.Name;
77  key = ParameterKeys.FindByName(keyName);
78  if (key == null)
79  {
80  throw new InvalidOperationException("ParameterKey [{0}] was not found from assemblies".ToFormat(keyName));
81  }
82 
83  return new KeyValuePair<ParameterKey, object>(key, key.ConvertValue(value));
84  }
85  }
86 
87  internal static class EffectParameterGeneratorExtensions
88  {
89  private static readonly IList<KeyValuePair<ParameterKey, List<object>>> EmptyKeyValuePairs = new List<KeyValuePair<ParameterKey, List<object>>>().AsReadOnly();
90 
91  public static IList<KeyValuePair<ParameterKey, List<object>>> GenerateKeyValues(this IEffectParameterGenerator generator)
92  {
93  if (generator == null)
94  {
95  return EmptyKeyValuePairs;
96  }
97 
98  var keyValues = new Dictionary<ParameterKey, List<object>>();
99  foreach (var keyValue in generator.Generate())
100  {
101  List<object> values;
102  if (!keyValues.TryGetValue(keyValue.Key, out values))
103  {
104  values = new List<object>();
105  keyValues.Add(keyValue.Key, values);
106  }
107  values.Add(keyValue.Value);
108  }
109  return keyValues.ToList();
110  }
111  }
112 
113  internal class EffectParameterKeyStandardGeneratorSerializer : DataSerializer<EffectParameterKeyStandardGenerator>
114  {
115  /// <inheritdoc/>
116  public override void Serialize(ref EffectParameterKeyStandardGenerator obj, ArchiveMode mode, SerializationStream stream)
117  {
118  if (mode == ArchiveMode.Serialize)
119  {
120  stream.Write(obj.Count);
121  foreach (var item in obj)
122  {
123  stream.SerializeExtended(item.Key, mode);
124  var valueType = item.Value.GetType();
125  if (valueType.IsGenericType && valueType.GetGenericTypeDefinition() == typeof(EffectParameterValuesGenerator<>))
126  {
127  var value = (IEffectParameterValueGenerator)item.Value;
128  var count = value.GenerateValues(item.Key).Count();
129  stream.Write(count);
130  foreach (var item2 in value.GenerateValues(item.Key))
131  {
132  stream.SerializeExtended(item2, mode);
133  }
134  }
135  else
136  {
137  stream.SerializeExtended(item.Value, mode);
138  }
139  }
140  }
141  else if (mode == ArchiveMode.Deserialize)
142  {
143  throw new NotImplementedException();
144  }
145  }
146  }
147 }
Key of an effect parameter.
Definition: ParameterKey.cs:15
Default implementation for a IEffectParameterGenerator using a dictionary of ParameterKey associated ...
_In_ size_t count
Definition: DirectXTexP.h:174
Base class for implementation of SerializationStream.
IEnumerable< KeyValuePair< ParameterKey, object > > Generate()
Generates key-value permutations.
Describes how to serialize and deserialize an object without knowing its type. Used as a common base ...
ArchiveMode
Enumerates the different mode of serialization (either serialization or deserialization).
Definition: ArchiveMode.cs:8