5 using System.Collections.Generic;
7 using SiliconStudio.Paradox.Graphics;
9 namespace SiliconStudio.
Paradox.Effects
14 internal class EffectParameterUpdaterDefinition : ParameterUpdaterDefinition
16 internal object[] SortedCompilationValues;
18 internal int[] SortedCounters;
20 internal int[] SortedLevels;
22 public EffectParameterUpdaterDefinition(
Effect effect)
27 public void Initialize(
Effect effect)
29 if (effect == null)
throw new ArgumentNullException(
"effect");
31 var parameters = effect.CompilationParameters;
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];
39 for (
int i = 0; i < internalValues.Count; ++i)
41 var internalValue = internalValues[i];
43 SortedKeys[i] = internalValue.Key;
44 SortedKeyHashes[i] = internalValue.Key.HashCode;
45 SortedCompilationValues[i] = internalValue.Value.Object;
46 SortedCounters[i] = internalValue.Value.Counter;
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);
56 public void UpdateCounter(ParameterCollection parameters)
58 var internalValues = parameters.InternalValues;
59 for (
int i = 0; i < internalValues.Count; ++i)
61 SortedCounters[i] = internalValues[i].Value.Counter;
66 internal class EffectParameterUpdater : ParameterUpdater
68 public KeyValuePair<int, ParameterCollection.InternalValue> GetAtIndex(
int index)
70 return InternalValues[index];
73 public bool HasChanged(EffectParameterUpdaterDefinition definition)
75 for (var i = 0; i < definition.SortedLevels.Length; ++i)
77 var kvp = GetAtIndex(i);
78 if (definition.SortedLevels[i] == kvp.Key)
80 if (definition.SortedCounters[i] != kvp.Value.Counter && !Equals(definition.SortedCompilationValues[i], kvp.Value.Object))
85 if (!Equals(definition.SortedCompilationValues[i], kvp.Value.Object))
92 public void ComputeLevels(EffectParameterUpdaterDefinition definition)
94 var levels = definition.SortedLevels;
95 if (levels == null || levels.Length != definition.SortedKeyHashes.Length)
97 levels =
new int[definition.SortedKeyHashes.Length];
100 for (var i = 0; i < levels.Length; ++i)
102 levels[i] = GetAtIndex(i).Key;
105 definition.SortedLevels = levels;
108 public void UpdateCounters(EffectParameterUpdaterDefinition definition)
110 for (var i = 0; i < definition.SortedLevels.Length; ++i)
112 var kvp = GetAtIndex(i);
113 definition.SortedCounters[i] = kvp.Value.Counter;