public bool HasChanged(DynamicEffectParameterUpdaterDefinition definition)
        {
            for (var i = 0; i < definition.SortedLevels.Length; ++i)
            {
                var kvp = GetAtIndex(i);

                // We can skip keys defined by the first level (which is the effect default parameters + key mapping)
                // TODO: Make sure this is a valid assumption in all cases
                if (kvp.DirtyCount == 0)
                {
                    continue;
                }

                if (definition.SortedLevels[i] == kvp.DirtyCount)
                {
                    if (definition.SortedCounters[i] != kvp.Value.Counter && !kvp.Value.ValueEquals(definition.SortedCompilationValues[i]))
                    {
                        return(true);
                    }
                }
                else
                {
                    if (!kvp.Value.ValueEquals(definition.SortedCompilationValues[i]))
                    {
                        return(true);
                    }
                }
            }
            return(false);
        }
 public void UpdateCounters(DynamicEffectParameterUpdaterDefinition definition)
 {
     for (var i = 0; i < definition.SortedLevels.Length; ++i)
     {
         var kvp = GetAtIndex(i);
         definition.SortedCounters[i] = kvp.Value.Counter;
     }
 }
 public void UpdateCounters(DynamicEffectParameterUpdaterDefinition definition)
 {
     for (var i = 0; i < definition.SortedLevels.Length; ++i)
     {
         var kvp = GetAtIndex(i);
         definition.SortedCounters[i] = kvp.Value.Counter;
     }
 }
        public void ComputeLevels(DynamicEffectParameterUpdaterDefinition definition)
        {
            var levels = definition.SortedLevels;
            if (levels == null || levels.Length != definition.SortedKeyHashes.Length)
            {
                levels = new int[definition.SortedKeyHashes.Length];
            }

            for (var i = 0; i < levels.Length; ++i)
            {
                levels[i] = GetAtIndex(i).DirtyCount;
            }

            definition.SortedLevels = levels;            
        }
        public void ComputeLevels(DynamicEffectParameterUpdaterDefinition definition)
        {
            var levels = definition.SortedLevels;

            if (levels == null || levels.Length != definition.SortedKeyHashes.Length)
            {
                levels = new int[definition.SortedKeyHashes.Length];
            }

            for (var i = 0; i < levels.Length; ++i)
            {
                levels[i] = GetAtIndex(i).DirtyCount;
            }

            definition.SortedLevels = levels;
        }
        public bool HasChanged(DynamicEffectParameterUpdaterDefinition definition)
        {
            for (var i = 0; i < definition.SortedLevels.Length; ++i)
            {
                var kvp = GetAtIndex(i);

                // We can skip keys defined by the first level (which is the effect default parameters + key mapping)
                // TODO: Make sure this is a valid assumption in all cases
                if (kvp.DirtyCount == 0)
                    continue;

                if (definition.SortedLevels[i] == kvp.DirtyCount)
                {
                    if (definition.SortedCounters[i] != kvp.Value.Counter && !kvp.Value.ValueEquals(definition.SortedCompilationValues[i]))
                        return true;
                }
                else
                {
                    if (!kvp.Value.ValueEquals(definition.SortedCompilationValues[i]))
                        return true;
                }
            }
            return false;          
        }