3 using System.Collections.Generic;
5 namespace SiliconStudio.
Paradox.Effects
10 internal abstract class ParameterUpdaterDefinition
12 public ParameterKey[] SortedKeys {
get;
protected set; }
14 public ulong[] SortedKeyHashes {
get;
protected set; }
20 internal class ParameterUpdater
22 protected KeyValuePair<int, ParameterCollection.InternalValue>[] InternalValues;
24 public ParameterUpdater()
26 InternalValues =
new KeyValuePair<int, ParameterCollection.InternalValue>[8];
29 public void Update(ParameterUpdaterDefinition definition, ParameterCollection[] parameterCollections,
int levelCount)
31 var sortedKeyHashes = definition.SortedKeyHashes;
32 var sortedKeyHashesLength = sortedKeyHashes.Length;
33 if (sortedKeyHashesLength == 0)
36 if (sortedKeyHashesLength > InternalValues.Length)
37 InternalValues =
new KeyValuePair<int, ParameterCollection.InternalValue>[sortedKeyHashesLength];
40 for (
int i = 0; i < sortedKeyHashesLength; ++i)
41 InternalValues[i] =
new KeyValuePair<int, ParameterCollection.InternalValue>();
44 var collection = parameterCollections[0];
45 var keys = collection.keys;
46 for (
int i = 0; i < keys.Length; ++i)
48 var internalValue = keys[i];
49 if (internalValue != null)
50 InternalValues[i] =
new KeyValuePair<int, ParameterCollection.InternalValue>(0, internalValue);
54 for (
int levelIndex = 1; levelIndex < levelCount; ++levelIndex)
56 var level = parameterCollections[levelIndex].valueList;
58 var currentHash = sortedKeyHashes[index];
59 int internalValueCount = level.Count;
60 var items = level.Items;
67 for (
int i = 0; i < internalValueCount; ++i)
69 var internalValue = items[i];
70 var expectedHash = internalValue.Key.HashCode;
72 while (currentHash < expectedHash)
74 if (++index >= sortedKeyHashesLength)
76 currentHash = sortedKeyHashes[index];
78 if (currentHash == expectedHash)
81 InternalValues[index] =
new KeyValuePair<int, ParameterCollection.InternalValue>(levelIndex, internalValue.Value);
87 public object GetObject(
int index)
89 return (InternalValues[index].Value).Object;