public VirtualPixel1D FadeTo(ColorBrightness[] values, TimeSpan duration)
{
if (values.Length != this.pixelCount)
throw new ArgumentOutOfRangeException("Invalid ColorBrightness length");
var startColors = new Color[this.pixelCount];
var startBrightness = new double[this.pixelCount];
for (int chn = 0; chn < this.pixelCount; chn++)
{
if (this.color[chn].GetBrightness() == 0)
{
this.color[chn] = values[chn].Color;
this.brightness[chn] = 0;
}
if (values[chn].Color.GetBrightness() == 0)
{
values[chn].Color = this.color[chn];
values[chn].Brightness = 0;
}
startColors[chn] = this.color[chn];
startBrightness[chn] = this.brightness[chn];
}
// 10 steps per second
int steps = (int)(duration.TotalMilliseconds / 100);
for (int i = 1; i < steps; i++)
{
double fadePosition = 1.0 * i / (steps - 1);
for (int chn = 0; chn < values.Length; chn++)
{
double newBrightness = startBrightness[chn] + (values[chn].Brightness - startBrightness[chn]) * fadePosition;
int r = (int)(startColors[chn].R + (values[chn].Color.R - startColors[chn].R) * fadePosition);
int g = (int)(startColors[chn].G + (values[chn].Color.G - startColors[chn].G) * fadePosition);
int b = (int)(startColors[chn].B + (values[chn].Color.B - startColors[chn].B) * fadePosition);
Color newColor = Color.FromArgb(r, g, b);
this.color[chn] = newColor;
this.brightness[chn] = newBrightness;
}
RaiseMultiPixelChanged(0, values.Length);
System.Threading.Thread.Sleep(100);
}
return this;
}