private static void AddIntentsToElement(Element element, double[] allPointsTimeOrdered, Curve levelCurve, ColorGradient colorGradient, TimeSpan duration, EffectIntents elementData, bool allowZeroIntensity, Color? color = null) { if (element != null) { double lastPosition = allPointsTimeOrdered[0]; TimeSpan lastEnd = TimeSpan.Zero; for (var i = 1; i < allPointsTimeOrdered.Length; i++) { double position = allPointsTimeOrdered[i]; TimeSpan startTime = lastEnd; TimeSpan timeSpan = TimeSpan.FromMilliseconds(duration.TotalMilliseconds * (position - lastPosition)); if (color == null) { var startColor = colorGradient.GetColorAt(lastPosition); var endColor = colorGradient.GetColorAt(position); var startIntensity = levelCurve.GetValue(lastPosition * 100) / 100; var endIntensity = levelCurve.GetValue(position * 100) / 100; if (allowZeroIntensity || !(startIntensity.Equals(0) && endIntensity.Equals(0))) { IIntent intent = IntentBuilder.CreateIntent(startColor, endColor, startIntensity, endIntensity, timeSpan); elementData.AddIntentForElement(element.Id, intent, startTime); } } else { var startIntensity = (colorGradient.GetProportionOfColorAt(lastPosition, (Color)color) * levelCurve.GetValue(lastPosition * 100) / 100); var endIntensity = (colorGradient.GetProportionOfColorAt(position, (Color)color) * levelCurve.GetValue(position * 100) / 100); if (allowZeroIntensity || !(startIntensity.Equals(0) && endIntensity.Equals(0))) { IIntent intent = IntentBuilder.CreateDiscreteIntent((Color)color, startIntensity, endIntensity, timeSpan); elementData.AddIntentForElement(element.Id, intent, startTime); } } lastPosition = position; lastEnd = startTime + timeSpan; } } }
/// <summary> /// Convienience method to generate intents that knows how to deal with discrete colors. /// </summary> /// <param name="node"></param> /// <param name="gradient"></param> /// <param name="level"></param> /// <param name="startPos"></param> /// <param name="endPos"></param> /// <param name="duration"></param> /// <param name="startTime"></param> /// <param name="isDiscrete"></param> /// <returns></returns> protected EffectIntents GenerateEffectIntents(ElementNode node, ColorGradient gradient, Curve level, double startPos, double endPos, TimeSpan duration, TimeSpan startTime, bool isDiscrete) { EffectIntents result = new EffectIntents(); if (isDiscrete) { IEnumerable<Color> colors = ColorModule.getValidColorsForElementNode(node, false) .Intersect(gradient.GetColorsInGradient()); foreach (Color color in colors) { double proportion = gradient.GetProportionOfColorAt(startPos, color); var startIntensity = (level.GetValue(startPos * 100) / 100) * proportion; proportion = gradient.GetProportionOfColorAt(endPos, color); var endIntensity = (level.GetValue(endPos * 100) / 100) * proportion; if (startIntensity > 0 && endIntensity > 0) { var intent = CreateDiscreteIntent(color, startIntensity, endIntensity, duration); result.AddIntentForElement(node.Element.Id, intent, startTime); } } } else { var startIntensity = level.GetValue(startPos * 100) / 100; var endIntensity = level.GetValue(endPos * 100) / 100; if (startIntensity > 0 && endIntensity > 0) { var intent = CreateIntent(gradient.GetColorAt(startPos), gradient.GetColorAt(endPos), startIntensity, endIntensity, duration); result.AddIntentForElement(node.Element.Id, intent, startTime); } } return result; }