public static EffectIntents ConvertToStaticArrayIntents(EffectIntents intents, TimeSpan duration, bool discrete = false) { if (discrete) { return ConvertToDiscreteStaticArrayIntents(intents, duration); } var interval = VixenSystem.DefaultUpdateTimeSpan; var intervals = (int)(duration.TotalMilliseconds / interval.TotalMilliseconds); EffectIntents effectIntents = new EffectIntents(); foreach (var effectIntent in intents) { RGBValue[] values = new RGBValue[intervals + 1]; for (int i = 0; i < intervals + 1; i++) { var currentTime = TimeSpan.FromMilliseconds(interval.TotalMilliseconds*i); var color = ProcessIntentNodes(effectIntent, currentTime); values[i] = new RGBValue(color); } effectIntents.AddIntentForElement(effectIntent.Key, new StaticArrayIntent<RGBValue>(interval, values, duration), TimeSpan.Zero); } return effectIntents; }
public static StaticArrayIntent<RGBValue> CreateStaticArrayIntent(LightingValue startValue, LightingValue endValue, TimeSpan duration) { var interval = VixenSystem.DefaultUpdateTimeSpan; var intervals = (int) (duration.TotalMilliseconds/interval.TotalMilliseconds); RGBValue[] values = new RGBValue[intervals+1]; var interpolator = Interpolator.Interpolator.Create<LightingValue>(); for (int i = 0; i < intervals+1; i++) { LightingValue sample; double percent = interval.TotalMilliseconds*i/duration.TotalMilliseconds; interpolator.Interpolate(percent, startValue, endValue, out sample); values[i] = new RGBValue(sample.FullColor); } return new StaticArrayIntent<RGBValue>(interval, values, duration); }
protected EffectIntents RenderNode(ElementNode node) { EffectIntents effectIntents = new EffectIntents(); int nFrames = (int)(TimeSpan.TotalMilliseconds / FrameTime); if (nFrames <= 0) return effectIntents; var buffer = new PixelFrameBuffer(BufferWi, BufferHt, UseBaseColor?BaseColor:Color.Transparent); int bufferSize = StringPixelCounts.Sum(); TimeSpan startTime = TimeSpan.Zero; // set up arrays to hold the generated colors var pixels = new RGBValue[bufferSize][]; for (int eidx = 0; eidx < bufferSize; eidx++) pixels[eidx] = new RGBValue[nFrames]; // generate all the pixels for (int frameNum = 0; frameNum < nFrames; frameNum++) { if (UseBaseColor) { var level = BaseLevelCurve.GetValue(GetEffectTimeIntervalPosition(frameNum)*100)/100; buffer.ClearBuffer(level); } else { buffer.ClearBuffer(); } RenderEffect(frameNum, ref buffer); // peel off this frames pixels... if (StringOrientation == StringOrientation.Horizontal) { int i = 0; for (int y = 0; y < BufferHt; y++) { for (int x = 0; x < StringPixelCounts[y]; x++) { pixels[i][frameNum] = new RGBValue(buffer.GetColorAt(x,y)); i++; } } } else { int i = 0; for (int x = 0; x < BufferWi; x++) { for (int y = 0; y < StringPixelCounts[x]; y++) { pixels[i][frameNum] = new RGBValue(buffer.GetColorAt(x, y)); i++; } } } }; // create the intents var frameTs = new TimeSpan(0, 0, 0, 0, FrameTime); List<Element> elements = node.ToList(); int numElements = node.Count(); for (int eidx = 0; eidx < numElements; eidx++) { IIntent intent = new StaticArrayIntent<RGBValue>(frameTs, pixels[eidx], TimeSpan); effectIntents.AddIntentForElement(elements[eidx].Id, intent, startTime); } return effectIntents; }
// renders the given node to the internal ElementData dictionary. If the given node is // not a element, will recursively descend until we render its elements. private void RenderNode(ElementNode node) { int wid; int ht; if (_data.NutcrackerData.StringOrienation == NutcrackerEffects.StringOrientations.Horizontal) { wid = MaxPixelsPerString; ht = StringCount; } else { wid = StringCount; ht = MaxPixelsPerString; } int nFrames = (int)(TimeSpan.TotalMilliseconds / frameMs); var nccore = new NutcrackerEffects(_data.NutcrackerData) {Duration = TimeSpan}; nccore.InitBuffer( wid, ht); int numElements = node.Count(); TimeSpan startTime = TimeSpan.Zero; // OK, we're gonna create 1 intent per element // that intent will hold framesToRender Color values // that it will parcel out as intent states are called for... // set up arrays to hold the generated colors var pixels = new RGBValue[numElements][]; for (int eidx = 0; eidx < numElements; eidx++) pixels[eidx] = new RGBValue[nFrames]; List<ElementNode> nodes = FindLeafParents().ToList(); // generate all the pixels for (int frameNum = 0; frameNum < nFrames; frameNum++) { nccore.RenderNextEffect(_data.NutcrackerData.CurrentEffect); // peel off this frames pixels... if (_data.NutcrackerData.StringOrienation == NutcrackerEffects.StringOrientations.Horizontal) { int i = 0; for (int y = 0; y < ht; y++) { for (int x = 0; x < _stringPixelCounts[y]; x++) { pixels[i][frameNum] = new RGBValue(nccore.GetPixel(x, y)); i++; } } } else { int i = 0; for (int x = 0; x < wid; x++) { for (int y = 0; y < _stringPixelCounts[x]; y++) { pixels[i][frameNum] = new RGBValue(nccore.GetPixel(x, y)); i++; } } } }; // create the intents var frameTs = new TimeSpan(0, 0, 0, 0, frameMs); List<Element> elements = node.ToList(); for (int eidx = 0; eidx < numElements; eidx++) { IIntent intent = new StaticArrayIntent<RGBValue>(frameTs, pixels[eidx], TimeSpan); _elementData.AddIntentForElement(elements[eidx].Id, intent, startTime); } nccore.Dispose(); }
// renders the given node to the internal ElementData dictionary. If the given node is // not a element, will recursively descend until we render its elements. private void RenderNode(ElementNode node) { int wid = 0; int ht = 0; if (_data.NutcrackerData.StringOrienation == NutcrackerEffects.StringOrientations.Horizontal) { wid = PixelsPerString(); ht = StringCount; } else { wid = StringCount; ht = PixelsPerString(); } int nFrames = (int)(TimeSpan.TotalMilliseconds / frameMs); NutcrackerEffects nccore = new NutcrackerEffects(_data.NutcrackerData); nccore.InitBuffer( wid, ht); int totalPixels = nccore.PixelCount(); if( totalPixels != wid * ht) throw new Exception("bad pixel count"); int numElements = node.Count(); if (numElements != totalPixels) Logging.Warn( "numEle " + numElements + " != totalPixels " + totalPixels); TimeSpan startTime = TimeSpan.Zero; //TimeSpan ms50 = new TimeSpan(0, 0, 0, 0, frameMs); Stopwatch timer = new Stopwatch(); timer.Start(); // OK, we're gonna create 1 intent per element // that intent will hold framesToRender Color values // that it will parcel out as intent states are called for... // set up arrays to hold the generated colors var pixels = new RGBValue[numElements][]; for (int eidx = 0; eidx < numElements; eidx++) pixels[eidx] = new RGBValue[nFrames]; // generate all the pixels int pps = PixelsPerString(); int sc = StringCount; for (int frameNum = 0; frameNum < nFrames; frameNum++) { nccore.RenderNextEffect(_data.NutcrackerData.CurrentEffect); // peel off this frames pixels... if (_data.NutcrackerData.StringOrienation == NutcrackerEffects.StringOrientations.Horizontal) { int i = 0; for (int y = 0; y < sc; y++) { for (int x = 0; x < pps; x++) { pixels[i][frameNum] = new RGBValue(nccore.GetPixel(x, y)); i++; } } } else { for (int i = 0; i < numElements; i++) { pixels[i][frameNum] = new RGBValue(nccore.GetPixel(i)); } } }; // create the intents var frameTs = new TimeSpan(0, 0, 0, 0, frameMs); List<Element> elements = node.ToList(); for (int eidx = 0; eidx < numElements; eidx++) { IIntent intent = new StaticArrayIntent<RGBValue>(frameTs, pixels[eidx], TimeSpan); _elementData.AddIntentForElement(elements[eidx].Id, intent, startTime); } timer.Stop(); Logging.Debug(" {0}ms, Frames: {1}, wid: {2}, ht: {3}, pix: {4}, intents: {5}", timer.ElapsedMilliseconds, nFrames, wid, ht, totalPixels, _elementData.Count()); }