4 using System.Collections;
5 using System.Collections.Generic;
6 using System.Diagnostics;
8 using System.Runtime.CompilerServices;
10 using SiliconStudio.Core.Diagnostics;
11 using SiliconStudio.Core.ReferenceCounting;
12 using SiliconStudio.Core.Serialization;
13 using SiliconStudio.Core.Serialization.Converters;
14 using SiliconStudio.Core;
15 using SiliconStudio.Core.Collections;
16 using SiliconStudio.Core.Serialization.Serializers;
18 namespace SiliconStudio.
Paradox.Effects
26 [DebuggerDisplay(
"Count = {Count}")]
27 [DataContract(
"!ParameterCollection")]
31 internal FastListStruct<KeyValuePair<ParameterKey, InternalValue>> valueList;
37 private readonly List<IParameterCollectionInheritanceInternal> sources;
40 private Dictionary<ValueChangedEventKey, Dictionary<ParameterKey, InternalValueChangedDelegate>> valueChangedEvents;
42 private List<ParameterDynamicValue> dynamicValues;
45 internal Dictionary<ParameterKey, int> keyMapping;
62 sources =
new List<IParameterCollectionInheritanceInternal>();
63 valueList =
new FastListStruct<KeyValuePair<ParameterKey, InternalValue>>(4);
68 public delegate
void ValueChangedDelegate(
ParameterKey key, InternalValue internalValue,
object oldValue);
69 internal delegate
void InternalValueChangedDelegate(InternalValue internalValue,
object oldValue);
70 internal event OnUpdateValueDelegate OnUpdateValue;
71 internal event OnUpdateValueDelegate OnInternalValueChange;
73 public string Name {
get; set; }
80 get {
return sources.ToArray(); }
90 foreach (var source
in Sources)
92 foreach (var dynamicValue
in ((IParameterCollectionInheritanceInternal)source).DynamicValues)
95 if (dynamicValues == null || dynamicValues.All(x => x.Target != dynamicValue.Target))
96 yield
return dynamicValue;
100 if (dynamicValues != null)
102 foreach (var dynamicValue
in dynamicValues)
103 yield
return dynamicValue;
110 SetObject(item.Key, item.Value);
118 if (dynamicValues != null)
119 dynamicValues.Clear();
120 if (valueChangedEvents != null)
121 valueChangedEvents.Clear();
127 throw new NotImplementedException();
132 var keyvalues = valueList.Items.Select(x =>
new KeyValuePair<ParameterKey, object>(x.Key, x.Value.Object)).ToList();
133 keyvalues.CopyTo(array, arrayIndex);
138 throw new NotImplementedException();
146 get {
return valueList.Count; }
149 public bool IsReadOnly {
get;
private set; }
156 get {
return valueList.Select(x => x.Key); }
164 internal int InternalCount
166 get {
return valueList.Count; }
172 internal FastListStruct<KeyValuePair<ParameterKey, InternalValue>> InternalValues
174 get {
return valueList; }
184 if (valueChangedEvents == null)
185 valueChangedEvents =
new Dictionary<ValueChangedEventKey, Dictionary<ParameterKey, InternalValueChangedDelegate>>();
188 var delegateKey =
new ValueChangedEventKey(key, valueUpdated);
189 if (valueChangedEvents.ContainsKey(delegateKey))
192 valueChangedEvents.Add(delegateKey,
new Dictionary<ParameterKey, InternalValueChangedDelegate>());
196 var internalValue = GetInternalValue(key);
197 if (internalValue != null)
198 UpdateValueChanged(key, internalValue, null);
202 foreach (var internalValue
in valueList)
204 UpdateValueChanged(internalValue.Key, internalValue.Value, null);
214 internal void RemoveEvent(
ParameterKey key, ValueChangedDelegate valueUpdated)
216 if (valueChangedEvents.ContainsKey(
new ValueChangedEventKey(key, valueUpdated)))
220 var internalValue = GetInternalValue(key);
221 if (internalValue != null)
222 UpdateValueChanged(key, null, internalValue);
226 foreach (var internalValue
in valueList)
228 UpdateValueChanged(internalValue.Key, null, internalValue.Value);
232 valueChangedEvents.Remove(
new ValueChangedEventKey(key, valueUpdated));
246 return GetKeyIndex(key, out index);
251 SetObject(key, value);
256 throw new NotImplementedException();
261 if (key == null)
throw new ArgumentNullException(
"key");
265 if (!GetKeyIndex(key, out index))
270 var internalValue = valueList.Items[index].Value;
272 value = internalValue.Object;
280 return GetObject(key);
284 SetObject(key, value);
292 return valueList.Items.Select(x => x.Key).ToList();
296 IEnumerator IEnumerable.GetEnumerator()
298 return GetEnumerator();
303 return InternalValues.Select(x =>
new KeyValuePair<ParameterKey, object>(x.Key, x.Value.Object)).GetEnumerator();
309 return string.Format(
"ParameterCollection [{0}]", Name);
314 var parameterCollectionText =
new StringBuilder();
315 bool isNextParameter =
false;
316 foreach (var paramValue
in this)
320 parameterCollectionText.Append(itemSeparator);
322 parameterCollectionText.Append(itemTab).Append(paramValue.Key).Append(
": ").Append(paramValue.Value);
323 isNextParameter =
true;
325 return parameterCollectionText.ToString();
336 int index = InternalValueBinarySearch(key);
346 index = InternalValueBinarySearch(key);
360 #if !SILICONSTUDIO_PLATFORM_IOS
362 [MethodImpl(MethodImplOptions.AggressiveInlining)]
367 int end = valueList.Count - 1;
370 int middle = start + ((end - start) >> 1);
371 var hash1 = valueList.Items[middle].Key.HashCode;
372 var hash2 = key.HashCode;
397 int index = InternalValueBinarySearch(key);
404 valueList.Insert(index,
new KeyValuePair<ParameterKey, InternalValue>(key, null));
420 Get(key, out result);
432 if (key == null)
throw new ArgumentNullException(
"key");
435 if (!GetKeyIndex(key, out index))
437 result = key.DefaultMetadataT.DefaultValue;
441 GetValue(valueList.Items[index].Value, out result);
446 if (key == null)
throw new ArgumentNullException(
"key");
449 if (!GetKeyIndex(key, out index))
451 return key.DefaultMetadata.GetDefaultValue();
454 var internalValue = valueList.Items[index].Value;
456 return internalValue.Object;
459 internal void GetValue<T>(InternalValue internalValue, out T result)
461 result = ((InternalValueBase<T>)internalValue).Value;
473 TryGet(key, out result);
486 if (key == null)
throw new ArgumentNullException(
"key");
489 if (!GetKeyIndex(key, out index))
495 GetValue(valueList.Items[index].Value, out result);
501 if (key == null)
throw new ArgumentNullException(
"key");
502 if (dynamicValue == null)
throw new ArgumentNullException(
"dynamicValue");
504 SetDefault(key,
true);
505 dynamicValue.Target = key;
506 if (dynamicValues == null)
507 dynamicValues =
new List<ParameterDynamicValue>();
508 dynamicValues.Add(dynamicValue);
518 if (key == null)
throw new ArgumentNullException(
"key");
521 var index = GetOrCreateKeyIndex(key);
522 if (valueList.Items[index].Value != null && !overrideIfInherited)
525 GetOrCreateInternalValue(index, key, out newValue);
527 if (newValue && OnUpdateValue != null) OnUpdateValue(
this, key, valueList.Items[GetKeyIndex(key)].Value);
538 if (key == null)
throw new ArgumentNullException(
"key");
541 var index = GetOrCreateKeyIndex(key);
542 var internalValue = valueList.Items[index].Value;
543 object oldValue = (internalValue != null && internalValue.ValueChanged != null) ? internalValue.Object : null;
544 internalValue = GetOrCreateInternalValue(index, key, out newValue);
546 ((InternalValueBase<T>)internalValue).Value = value;
547 internalValue.Counter++;
549 if (newValue && OnUpdateValue != null) OnUpdateValue(
this, key, internalValue);
551 if (internalValue.ValueChanged != null)
552 internalValue.ValueChanged(internalValue, oldValue);
563 Set(key, values, 0, values.
Length);
576 if (key == null)
throw new ArgumentNullException(
"key");
579 var index = GetOrCreateKeyIndex(key);
580 var internalValue = (InternalValueArray<T>)valueList.Items[index].Value;
581 object oldValue = (internalValue != null && internalValue.ValueChanged != null) ? internalValue.Object : null;
582 internalValue = (InternalValueArray<T>)GetOrCreateInternalValue(index, key, out newValue);
585 if (internalValue.Value == null || internalValue.Value.Length <
count)
587 if (destinationOffset != 0)
588 throw new InvalidOperationException(
"Should use destinationOffset 0 and real count for first set if no default value.");
589 internalValue.Value =
new T[
count];
592 for (
int i = 0; i <
count; ++i)
593 ((InternalValueArray<T>)internalValue).Value[destinationOffset + i] = values[i];
594 internalValue.Counter++;
596 if (newValue && OnUpdateValue != null) OnUpdateValue(
this, key, internalValue);
598 if (internalValue.ValueChanged != null)
599 internalValue.ValueChanged(internalValue, oldValue);
611 public void Set<T>(
ParameterKey<T[]> key, T[] values,
int sourceOffset,
int destinationOffset,
int count) where T :
struct
613 if (key == null)
throw new ArgumentNullException(
"key");
616 var index = GetOrCreateKeyIndex(key);
617 var internalValue = (InternalValueArray<T>)valueList.Items[index].Value;
618 object oldValue = (internalValue != null && internalValue.ValueChanged != null) ? internalValue.Object : null;
619 internalValue = (InternalValueArray<T>)GetOrCreateInternalValue(index, key, out newValue);
622 if (internalValue.Value == null || internalValue.Value.Length <
count)
624 if (destinationOffset != 0)
625 throw new InvalidOperationException(
"Should use destinationOffset 0 and real count for first set if no default value.");
626 internalValue.Value =
new T[
count];
629 for (
int i = 0; i <
count; ++i)
630 ((InternalValueArray<T>)internalValue).Value[destinationOffset + i] = values[sourceOffset + i];
631 internalValue.Counter++;
633 if (newValue && OnUpdateValue != null) OnUpdateValue(
this, key, internalValue);
635 if (internalValue.ValueChanged != null)
636 internalValue.ValueChanged(internalValue, oldValue);
641 if (key == null)
throw new ArgumentNullException(
"key");
644 var index = GetOrCreateKeyIndex(key);
645 var internalValue = valueList.Items[index].Value;
646 object oldValue = (internalValue != null && internalValue.ValueChanged != null) ? internalValue.Object : null;
647 internalValue = GetOrCreateInternalValue(index, key, out newValue);
649 internalValue.Object = resourceValue;
650 internalValue.Counter++;
652 if (newValue && OnUpdateValue != null) OnUpdateValue(
this, key, internalValue);
654 if (internalValue.ValueChanged != null)
655 internalValue.ValueChanged(internalValue, oldValue);
667 int index = GetKeyIndex(key);
668 if (index < 0)
return;
669 var internalValue = valueList.Items[index].Value;
670 ReleaseValue(valueList.Items[index].Key, valueList.Items[index].Value);
671 valueList.Items[index] =
new KeyValuePair<ParameterKey, InternalValue>(key, null);
673 valueList.RemoveAt(index);
675 OnKeyUpdate(key, null, internalValue);
679 if (OnUpdateValue != null) OnUpdateValue(
this, key, null);
692 foreach (var internalValue2
in parameters.InternalValues)
694 var internalValue1 = GetInternalValue(internalValue2.Key);
698 if (internalValue1 == null && internalValue2.Value.IsDefaultValue(internalValue2.Key))
703 if (!internalValue2.Value.Equals(internalValue1))
721 var oldSources = sources.ToArray();
722 foreach (IParameterCollectionInheritanceInternal source
in newSources)
724 if (sources.Contains(source))
731 UpdateSources(oldSources);
733 if (OnUpdateValue != null) OnUpdateValue(
this, null, null);
738 for (
int i = oldSources.Length; i < sources.Count; ++i)
740 valueList.EnsureCapacity(sources[i].GetInternalValueCount());
743 foreach (var sourceInternalValue
in sources[i].GetInternalValues())
745 var key = sourceInternalValue.Key;
747 var localIndex = GetKeyIndex(key);
749 if (localIndex != -1)
751 if (FindOverrideGroupIndex(valueList.Items[localIndex]) >= FindOverrideGroupIndex(sourceInternalValue))
755 InheritValue(sourceInternalValue.Value, key);
756 localIndex = GetKeyIndex(key);
757 if (OnUpdateValue != null) OnUpdateValue(
this, key, valueList.Items[localIndex].Value);
769 var oldSources = sources.ToArray();
771 var internalValueSources = valueList.Select(x =>
773 var sourceIndex = FindOverrideGroupIndex(x);
774 return sourceIndex == sources.Count ? null : sources[sourceIndex];
777 if (!sources.Remove((IParameterCollectionInheritanceInternal)removedInheritance))
780 UpdateSources(oldSources);
781 if (OnUpdateValue != null) OnUpdateValue(
this, null, null);
783 var removedSources = oldSources.Except(sources).ToArray();
787 for (
int index = 0, index2 = 0; index < this.InternalCount; ++index, ++index2)
789 var internalValue = valueList[index];
790 var key = internalValue.Key;
791 var source = internalValueSources[index2];
792 if (source != null && removedSources.Contains(source))
795 valueList.RemoveAt(index--);
796 if (OnUpdateValue != null) OnUpdateValue(
this, key, null);
797 OnKeyUpdate(key, null, internalValue.Value);
811 int index = GetKeyIndex(key);
816 for (
int i = sources.Count - 1; i >= 0; --i)
818 var source = sources[i];
819 var internalValue = source.GetInternalValue(key);
820 if (internalValue != null)
822 InheritValue(internalValue, key);
828 var oldInternalValue = valueList.Items[index].Value;
829 valueList.RemoveAt(index);
832 OnKeyUpdate(key, null, oldInternalValue);
844 if (internalValue != null)
845 return internalValue.Owner ==
this;
854 if (OnUpdateValue != null)
855 throw new InvalidOperationException(
"Cannot dispose a parameter collection that is used as a source.");
858 for (
int i = 0; i < sources.Count; ++i)
860 var parameterCollection = sources[i].GetParameterCollection();
861 var updateValueDelegate = sources[i].GetUpdateValueDelegate(effectVariableCollection_OnUpdateValue);
862 parameterCollection.OnUpdateValue -= updateValueDelegate;
865 for (
int i = 0; i < InternalCount; i++)
867 ReleaseValue(valueList.Items[i].Key, valueList.Items[i].Value);
876 internal static InternalValue CreateInternalValue(
ParameterKey key)
878 return key.CreateInternalValue();
881 private object GetResource(InternalValue internalValue)
883 return internalValue.Object;
886 private void OnKeyUpdate(ParameterKey key, InternalValue internalValue, InternalValue oldValue)
888 UpdateValueChanged(key, internalValue, oldValue);
889 UpdateKeyMapping(key, internalValue);
897 private void InheritValue(InternalValue internalValue, ParameterKey key)
899 int index = GetKeyIndex(key);
900 var oldInternalValue = index != -1 ? valueList.Items[index].Value : null;
903 index = GetOrCreateKeyIndex(key);
904 valueList.Items[index] =
new KeyValuePair<ParameterKey, InternalValue>(key, internalValue);
907 OnKeyUpdate(key, internalValue, oldInternalValue);
914 private void UpdateSources(IParameterCollectionInheritance[] oldSources)
916 foreach (IParameterCollectionInheritanceInternal source
in oldSources)
918 if (sources.Contains(source))
920 var parameterCollection = source.GetParameterCollection();
921 var updateValueDelegate = source.GetUpdateValueDelegate(effectVariableCollection_OnUpdateValue);
922 parameterCollection.OnUpdateValue -= updateValueDelegate;
925 foreach (IParameterCollectionInheritanceInternal source
in sources)
927 if (oldSources.Contains(source))
929 var parameterCollection = source.GetParameterCollection();
930 var updateValueDelegate = source.GetUpdateValueDelegate(effectVariableCollection_OnUpdateValue);
931 parameterCollection.OnUpdateValue += updateValueDelegate;
940 private int FindOverrideGroupIndex(KeyValuePair<ParameterKey, InternalValue> internalValue)
942 if (internalValue.Value.Owner ==
this)
943 return sources.Count;
946 if (internalValue.Value.Owner != null)
948 int flattenedIndex = sources.IndexOf(internalValue.Value.Owner);
949 if (flattenedIndex != -1)
950 return flattenedIndex;
954 for (
int i = sources.Count - 1; i >= 0; --i)
956 var source = sources[i];
957 if (source.GetInternalValues().Any(x => x.Value == internalValue.Value))
970 private void effectVariableCollection_OnUpdateValue(ParameterCollection source, ParameterKey key, InternalValue sourceInternalValue)
972 effectVariableCollection_OnUpdateValueLocal(source, key, sourceInternalValue);
973 if (OnUpdateValue != null)
974 OnUpdateValue(
this, key, sourceInternalValue);
977 private void effectVariableCollection_OnUpdateValueLocal(ParameterCollection source, ParameterKey key, InternalValue sourceInternalValue)
985 var sourceIndex = sources.IndexOf(source);
987 if (sourceInternalValue == null)
989 int currentIndex = GetKeyIndex(key);
990 if (currentIndex == -1)
993 var currentSourceIndex = FindOverrideGroupIndex(valueList.Items[currentIndex]);
995 if (currentSourceIndex > sourceIndex && currentSourceIndex != -1)
1000 for (
int i = sourceIndex - 1; i >= 0; --i)
1002 var newSource = sources[i];
1003 var internalValue = newSource.GetInternalValue(key);
1004 if (internalValue != null)
1006 InheritValue(internalValue, key);
1016 var sourceKey = key;
1017 var index = GetKeyIndex(sourceKey);
1022 var currentValueSourceIndex = FindOverrideGroupIndex(valueList.Items[index]);
1024 if (sourceIndex >= currentValueSourceIndex)
1026 InheritValue(sourceInternalValue, sourceKey);
1032 InheritValue(sourceInternalValue, sourceKey);
1042 internal void UpdateValueChanged(ParameterKey key, InternalValue newInternalValue, InternalValue oldInternalValue)
1044 if (valueChangedEvents != null)
1046 foreach (var valueChangedEvent
in valueChangedEvents)
1048 if (valueChangedEvent.Key.Key == key || valueChangedEvent.Key.Key == null)
1050 var events = valueChangedEvent.Value;
1051 InternalValueChangedDelegate internalEvent;
1052 if (!events.TryGetValue(key, out internalEvent))
1054 var originalEvent = valueChangedEvent.Key.ValueChanged;
1055 internalEvent = CreateInternalValueChangedEvent(key, internalEvent, originalEvent);
1056 events.Add(key, internalEvent);
1058 if (oldInternalValue != null)
1059 oldInternalValue.ValueChanged -= internalEvent;
1060 if (newInternalValue != null)
1061 newInternalValue.ValueChanged += internalEvent;
1067 private static InternalValueChangedDelegate CreateInternalValueChangedEvent(ParameterKey key, InternalValueChangedDelegate internalEvent, ValueChangedDelegate originalEvent)
1069 internalEvent = (internalValue, oldValue) => originalEvent(key, internalValue, oldValue);
1070 return internalEvent;
1080 internal InternalValue GetUpdatedInternalValue(
int index)
1085 internal T GetResource<T>(
int index)
1087 return (T)GetResource(keys[index]);
1095 private void UpdateKeyMapping(ParameterKey key, InternalValue internalValue)
1099 if (keyMapping != null && keyMapping.TryGetValue(key, out index))
1101 keys[index] = internalValue;
1102 if (OnInternalValueChange != null)
1103 OnInternalValueChange(
this, key, internalValue);
1112 internal void SetKeyMapping(Dictionary<ParameterKey, int> keyMapping)
1114 this.keyMapping = keyMapping;
1115 this.keys =
new InternalValue[keyMapping.Count];
1116 foreach (var internalValue
in valueList)
1118 UpdateKeyMapping(internalValue.Key, internalValue.Value);
1129 private void ReleaseValue(ParameterKey key, InternalValue internalValue)
1131 if (internalValue == null)
1134 if (!key.IsValueType && internalValue.Owner ==
this)
1136 internalValue.Object = null;
1145 internal InternalValue GetInternalValue(ParameterKey key)
1147 int index = GetKeyIndex(key);
1151 return valueList.Items[index].Value;
1161 private InternalValue GetOrCreateInternalValue(
int index, ParameterKey key, out
bool newValue)
1163 var oldInternalValue = valueList.Items[index];
1164 var internalValue = oldInternalValue;
1167 if (internalValue.Value != null && internalValue.Value.Owner !=
this)
1169 internalValue =
new KeyValuePair<ParameterKey, InternalValue>(internalValue.Key, null);
1171 if (internalValue.Value == null)
1174 valueList.Items[index] = internalValue =
new KeyValuePair<ParameterKey, InternalValue>(key, CreateInternalValue(key));
1175 internalValue.Value.Owner =
this;
1177 OnKeyUpdate(key, internalValue.Value, oldInternalValue.Value);
1179 return internalValue.Value;
1182 #region Implements IParameterCollectionInheritanceInternal
1184 int IParameterCollectionInheritanceInternal.GetInternalValueCount()
1186 return InternalCount;
1189 InternalValue IParameterCollectionInheritanceInternal.GetInternalValue(ParameterKey key)
1191 return GetInternalValue(key);
1196 return InternalValues;
1199 ParameterCollection IParameterCollectionInheritanceInternal.GetParameterCollection()
1204 OnUpdateValueDelegate IParameterCollectionInheritanceInternal.GetUpdateValueDelegate(ParameterCollection.OnUpdateValueDelegate original)
1214 internal struct InternalValueReference
1216 public InternalValue Entry;
1227 internal InternalValueChangedDelegate ValueChanged;
1228 internal InternalValueReference[] Dependencies;
1232 throw new NotImplementedException();
1235 public virtual object Object
1237 get {
return null; }
1238 set {
throw new NotImplementedException(); }
1255 public abstract bool IsDefaultValue(
ParameterKey parameterKey);
1259 var builder =
new StringBuilder();
1260 builder.AppendFormat(
"({0}) {1} Count {2}", Owner.Name,
Object, Counter);
1261 return builder.ToString();
1269 internal class InternalValueBase<T> : InternalValue
1276 public override object Object
1278 get {
return Value; }
1279 set { Value = (T)value; }
1282 public override bool IsDefaultValue(ParameterKey parameterKey)
1284 var parameterKeyT = parameterKey as ParameterKey<T>;
1285 if (parameterKeyT == null)
1288 return comparer.Equals(Value, parameterKeyT.DefaultMetadataT.DefaultValue);
1291 public override bool Equals(InternalValue internalValue)
1293 var internalValueT = internalValue as InternalValueBase<T>;
1294 if (internalValueT == null)
1297 return comparer.Equals(
Value, internalValueT.Value);
1302 var currentDataSerializer = dataSerializer;
1303 if (currentDataSerializer == null)
1305 dataSerializer = currentDataSerializer =
MemberSerializer<T>.Create(stream.Context.SerializerSelector);
1308 currentDataSerializer.Serialize(ref
Value, ArchiveMode.Serialize, stream);
1311 protected void SetValue(T value)
1316 protected T GetValue()
1323 internal class InternalValue<
T> : InternalValueBase<T>
1325 public override unsafe
void ReadFrom(IntPtr
dest,
int offset,
int size)
1327 if (offset == 0 && size ==
Utilities.UnsafeSizeOf<T>())
1333 Utilities.CopyMemory(
dest, (IntPtr)Interop.Fixed(ref Value) + offset,
size);
1339 internal class InternalValueArray<
T> : InternalValueBase<T[]>
1341 private int elementSize;
1343 public InternalValueArray(
int length)
1345 elementSize = Utilities.UnsafeSizeOf<
T>();
1349 SetValue(
new T[length]);
1353 public override unsafe
void ReadFrom(IntPtr
dest,
int offset,
int size)
1355 if (GetValue() == null)
1359 int maxSize = (elementSize * GetValue().Length - offset);
1362 Utilities.CopyMemory(
dest, (IntPtr)Interop.Fixed(ref GetValue()[0]) + offset, Math.Min(
size, maxSize));
1366 private struct ValueChangedEventKey : IEquatable<ValueChangedEventKey>
1368 public ParameterKey Key;
1369 public ValueChangedDelegate ValueChanged;
1371 public ValueChangedEventKey(ParameterKey key, ValueChangedDelegate valueChanged)
1374 ValueChanged = valueChanged;
1377 public bool Equals(ValueChangedEventKey other)
1379 return Key.Equals(other.Key) && ValueChanged.Equals(other.ValueChanged);
1382 public override bool Equals(
object obj)
1384 if (ReferenceEquals(null, obj))
return false;
1385 return obj is ValueChangedEventKey && Equals((ValueChangedEventKey)obj);
1388 public override int GetHashCode()
1392 return (Key.GetHashCode()*397) ^ ValueChanged.GetHashCode();
Key of an effect parameter.
ParameterCollection Owner
ParameterCollection()
Initializes a new instance of the ParameterCollection class.
IEnumerator< KeyValuePair< ParameterKey, object > > GetEnumerator()
Base for inheriting ParameterCollection (used by ParameterCollection.AddSources). This allows for dir...
override string ToString()
bool TryGetValue(ParameterKey key, out object value)
void AddSources(params IParameterCollectionInheritance[] newSources)
Adds the sources.
bool RemoveSource(IParameterCollectionInheritance removedInheritance)
Removes the sources.
Base class for converters to/from a data type.
void Add(ParameterKey key, object value)
Key of an gereric effect parameter.
int Length
Gets the number of elements for this key.
void AddEvent(ParameterKey key, ValueChangedDelegate valueUpdated)
Adds an event that will be raised when a value is updated.
SiliconStudio.Paradox.Input.Keys Keys
string ToStringDetailed(string itemSeparator="\r\n", string itemTab=" ")
bool ContainsKey(ParameterKey key)
Determines whether the specified instance contains a parameter key.
void Remove(ParameterKey key)
Removes the specified key and associated value
void SetObject(ParameterKey key, object resourceValue)
void SetDefault(ParameterKey key, bool overrideIfInherited=false)
Sets the default value for the specified key (if undefined, otherwise do nothing).
override string ToString()
int GetOrCreateKeyIndex(ParameterKey key)
Gets or creates an internal value index given its key.
Base class for implementation of SerializationStream.
virtual void ReadFrom(IntPtr dest, int offset, int size)
Helper for serializing members of a class.
bool IsValueOwner(InternalValue internalValue)
Determines whether [is value owner] of [the specified key].
bool Contains(ParameterCollection parameters)
Tests if the values in parameters are contained into this instance. It will automatically handle defa...
ParameterCollection(string name)
Initializes a new instance of the ParameterCollection class.
Use this class to provide a debug output in Visual Studio debugger.
The remove mixin to remove a mixin from current mixins.
object GetObject(ParameterKey key)
int InternalValueBinarySearch(ParameterKey key)
Gets the index of an InternalValue within internalValues given its key.
Describes how to serialize and deserialize an object without knowing its type. Used as a common base ...
Describes how to serialize and deserialize an object of a given type.
bool GetKeyIndex(ParameterKey key, out int index)
_In_ size_t _In_ size_t size
Holds a value inside ParameterCollection.
void Reset(ParameterKey key)
Removes the value locally and try to get a value from a source.
A container to handle a hierarchical collection of effect variables.
Describes a dynamic value with no input.