Paradox Game Engine  v1.0.0 beta06
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Events Macros Pages
EffectParameterUpdater.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 
4 using System;
5 using System.Collections.Generic;
6 
7 using SiliconStudio.Paradox.Graphics;
8 
9 namespace SiliconStudio.Paradox.Effects
10 {
11  /// <summary>
12  /// Used to detect parameters change for dynamic effect.
13  /// </summary>
14  internal class EffectParameterUpdaterDefinition : ParameterUpdaterDefinition
15  {
16  internal object[] SortedCompilationValues;
17 
18  internal int[] SortedCounters;
19 
20  internal int[] SortedLevels;
21 
22  public EffectParameterUpdaterDefinition(Effect effect)
23  {
24  Initialize(effect);
25  }
26 
27  public void Initialize(Effect effect)
28  {
29  if (effect == null) throw new ArgumentNullException("effect");
30 
31  var parameters = effect.CompilationParameters;
32 
33  var internalValues = parameters.InternalValues;
34  SortedKeys = new ParameterKey[internalValues.Count];
35  SortedKeyHashes = new ulong[internalValues.Count];
36  SortedCompilationValues = new object[internalValues.Count];
37  SortedCounters = new int[internalValues.Count];
38 
39  for (int i = 0; i < internalValues.Count; ++i)
40  {
41  var internalValue = internalValues[i];
42 
43  SortedKeys[i] = internalValue.Key;
44  SortedKeyHashes[i] = internalValue.Key.HashCode;
45  SortedCompilationValues[i] = internalValue.Value.Object;
46  SortedCounters[i] = internalValue.Value.Counter;
47  }
48 
49  var keyMapping = new Dictionary<ParameterKey, int>();
50  for (int i = 0; i < SortedKeys.Length; i++)
51  keyMapping.Add(SortedKeys[i], i);
52  effect.CompilationParameters.SetKeyMapping(keyMapping);
53  effect.DefaultCompilationParameters.SetKeyMapping(keyMapping);
54  }
55 
56  public void UpdateCounter(ParameterCollection parameters)
57  {
58  var internalValues = parameters.InternalValues;
59  for (int i = 0; i < internalValues.Count; ++i)
60  {
61  SortedCounters[i] = internalValues[i].Value.Counter;
62  }
63  }
64  }
65 
66  internal class EffectParameterUpdater : ParameterUpdater
67  {
68  public KeyValuePair<int, ParameterCollection.InternalValue> GetAtIndex(int index)
69  {
70  return InternalValues[index];
71  }
72 
73  public bool HasChanged(EffectParameterUpdaterDefinition definition)
74  {
75  for (var i = 0; i < definition.SortedLevels.Length; ++i)
76  {
77  var kvp = GetAtIndex(i);
78  if (definition.SortedLevels[i] == kvp.Key)
79  {
80  if (definition.SortedCounters[i] != kvp.Value.Counter && !Equals(definition.SortedCompilationValues[i], kvp.Value.Object))
81  return true;
82  }
83  else
84  {
85  if (!Equals(definition.SortedCompilationValues[i], kvp.Value.Object))
86  return true;
87  }
88  }
89  return false;
90  }
91 
92  public void ComputeLevels(EffectParameterUpdaterDefinition definition)
93  {
94  var levels = definition.SortedLevels;
95  if (levels == null || levels.Length != definition.SortedKeyHashes.Length)
96  {
97  levels = new int[definition.SortedKeyHashes.Length];
98  }
99 
100  for (var i = 0; i < levels.Length; ++i)
101  {
102  levels[i] = GetAtIndex(i).Key;
103  }
104 
105  definition.SortedLevels = levels;
106  }
107 
108  public void UpdateCounters(EffectParameterUpdaterDefinition definition)
109  {
110  for (var i = 0; i < definition.SortedLevels.Length; ++i)
111  {
112  var kvp = GetAtIndex(i);
113  definition.SortedCounters[i] = kvp.Value.Counter;
114  }
115  }
116 
117 
118 
119  }
120 }