private void convertToCommands(OsbSprite sprite, double?startTime, double?endTime, double timeOffset, bool loopable) { var startStateTime = loopable ? (startTime ?? StartState.Time) + timeOffset : (double?)null; var endStateTime = loopable ? (endTime ?? EndState.Time) + timeOffset : (double?)null; finalPositions.ForEachPair((start, end) => sprite.Move(start.Time, end.Time, start.Value, end.Value), new Vector2(320, 240), p => new Vector2((float)Math.Round(p.X, PositionDecimals), (float)Math.Round(p.Y, PositionDecimals)), startStateTime, loopable: loopable); var useVectorScaling = finalScales.Any(k => k.Value.X != k.Value.Y); finalScales.ForEachPair((start, end) => { if (useVectorScaling) { sprite.ScaleVec(start.Time, end.Time, start.Value, end.Value); } else { sprite.Scale(start.Time, end.Time, start.Value.X, end.Value.X); } }, Vector2.One, s => new Vector2((float)Math.Round(s.X, ScaleDecimals), (float)Math.Round(s.Y, ScaleDecimals)), startStateTime, loopable: loopable); finalRotations.ForEachPair((start, end) => sprite.Rotate(start.Time, end.Time, start.Value, end.Value), 0, r => (float)Math.Round(r, RotationDecimals), startStateTime, loopable: loopable); finalColors.ForEachPair((start, end) => sprite.Color(start.Time, end.Time, start.Value, end.Value), CommandColor.White, c => CommandColor.FromRgb(c.R, c.G, c.B), startStateTime, loopable: loopable); finalOpacities.ForEachPair((start, end) => sprite.Fade(start.Time, end.Time, start.Value, end.Value), -1, o => (float)Math.Round(o, OpacityDecimals), startStateTime, endStateTime, loopable: loopable); flipH.ForEachFlag((fromTime, toTime) => sprite.FlipH(fromTime, toTime)); flipV.ForEachFlag((fromTime, toTime) => sprite.FlipV(fromTime, toTime)); additive.ForEachFlag((fromTime, toTime) => sprite.Additive(fromTime, toTime)); }
private void parseEventsSection(StreamReader reader) { OsbSprite osbSprite = null; var inCommandGroup = false; reader.ParseSectionLines(line => { if (line.StartsWith("//")) { return; } var depth = 0; while (line.Substring(depth).StartsWith(" ")) { ++depth; } var trimmedLine = applyVariables(line.Trim()); var values = trimmedLine.Split(','); if (inCommandGroup && depth < 2) { osbSprite.EndGroup(); inCommandGroup = false; } switch (values[0]) { case "Sprite": { var layerName = values[1]; var origin = (OsbOrigin)Enum.Parse(typeof(OsbOrigin), values[2]); var path = removePathQuotes(values[3]); var x = float.Parse(values[4], CultureInfo.InvariantCulture); var y = float.Parse(values[5], CultureInfo.InvariantCulture); osbSprite = GetLayer(layerName).CreateSprite(path, origin, new Vector2(x, y)); } break; case "Animation": { var layerName = values[1]; var origin = (OsbOrigin)Enum.Parse(typeof(OsbOrigin), values[2]); var path = removePathQuotes(values[3]); var x = float.Parse(values[4], CultureInfo.InvariantCulture); var y = float.Parse(values[5], CultureInfo.InvariantCulture); var frameCount = int.Parse(values[6]); var frameDelay = double.Parse(values[7], CultureInfo.InvariantCulture); var loopType = (OsbLoopType)Enum.Parse(typeof(OsbLoopType), values[8]); osbSprite = GetLayer(layerName).CreateAnimation(path, frameCount, frameDelay, loopType, origin, new Vector2(x, y)); } break; case "Sample": { var time = double.Parse(values[1], CultureInfo.InvariantCulture); var layerName = values[2]; var path = removePathQuotes(values[3]); var volume = float.Parse(values[4], CultureInfo.InvariantCulture); GetLayer(layerName).CreateSample(path, time, volume); } break; case "T": { var triggerName = values[1]; var startTime = double.Parse(values[2], CultureInfo.InvariantCulture); var endTime = double.Parse(values[3], CultureInfo.InvariantCulture); var groupNumber = values.Length > 4 ? int.Parse(values[4]) : 0; osbSprite.StartTriggerGroup(triggerName, startTime, endTime, groupNumber); inCommandGroup = true; } break; case "L": { var startTime = double.Parse(values[1], CultureInfo.InvariantCulture); var loopCount = int.Parse(values[2]); osbSprite.StartLoopGroup(startTime, loopCount); inCommandGroup = true; } break; default: { if (string.IsNullOrEmpty(values[3])) { values[3] = values[2]; } var commandType = values[0]; var easing = (OsbEasing)int.Parse(values[1]); var startTime = double.Parse(values[2], CultureInfo.InvariantCulture); var endTime = double.Parse(values[3], CultureInfo.InvariantCulture); switch (commandType) { case "F": { var startValue = double.Parse(values[4], CultureInfo.InvariantCulture); var endValue = values.Length > 5 ? double.Parse(values[5], CultureInfo.InvariantCulture) : startValue; osbSprite.Fade(easing, startTime, endTime, startValue, endValue); } break; case "S": { var startValue = double.Parse(values[4], CultureInfo.InvariantCulture); var endValue = values.Length > 5 ? double.Parse(values[5], CultureInfo.InvariantCulture) : startValue; osbSprite.Scale(easing, startTime, endTime, startValue, endValue); } break; case "V": { var startX = double.Parse(values[4], CultureInfo.InvariantCulture); var startY = double.Parse(values[5], CultureInfo.InvariantCulture); var endX = values.Length > 6 ? double.Parse(values[6], CultureInfo.InvariantCulture) : startX; var endY = values.Length > 7 ? double.Parse(values[7], CultureInfo.InvariantCulture) : startY; osbSprite.ScaleVec(easing, startTime, endTime, startX, startY, endX, endY); } break; case "R": { var startValue = double.Parse(values[4], CultureInfo.InvariantCulture); var endValue = values.Length > 5 ? double.Parse(values[5], CultureInfo.InvariantCulture) : startValue; osbSprite.Rotate(easing, startTime, endTime, startValue, endValue); } break; case "M": { var startX = double.Parse(values[4], CultureInfo.InvariantCulture); var startY = double.Parse(values[5], CultureInfo.InvariantCulture); var endX = values.Length > 6 ? double.Parse(values[6], CultureInfo.InvariantCulture) : startX; var endY = values.Length > 7 ? double.Parse(values[7], CultureInfo.InvariantCulture) : startY; osbSprite.Move(easing, startTime, endTime, startX, startY, endX, endY); } break; case "MX": { var startValue = double.Parse(values[4], CultureInfo.InvariantCulture); var endValue = values.Length > 5 ? double.Parse(values[5], CultureInfo.InvariantCulture) : startValue; osbSprite.MoveX(easing, startTime, endTime, startValue, endValue); } break; case "MY": { var startValue = double.Parse(values[4], CultureInfo.InvariantCulture); var endValue = values.Length > 5 ? double.Parse(values[5], CultureInfo.InvariantCulture) : startValue; osbSprite.MoveY(easing, startTime, endTime, startValue, endValue); } break; case "C": { var startX = double.Parse(values[4], CultureInfo.InvariantCulture); var startY = double.Parse(values[5], CultureInfo.InvariantCulture); var startZ = double.Parse(values[6], CultureInfo.InvariantCulture); var endX = values.Length > 7 ? double.Parse(values[7], CultureInfo.InvariantCulture) : startX; var endY = values.Length > 8 ? double.Parse(values[8], CultureInfo.InvariantCulture) : startY; var endZ = values.Length > 9 ? double.Parse(values[9], CultureInfo.InvariantCulture) : startZ; osbSprite.Color(easing, startTime, endTime, startX / 255f, startY / 255f, startZ / 255f, endX / 255f, endY / 255f, endZ / 255f); } break; case "P": { var type = values[4]; switch (type) { case "A": osbSprite.Additive(startTime, endTime); break; case "H": osbSprite.FlipH(startTime, endTime); break; case "V": osbSprite.FlipV(startTime, endTime); break; } } break; } } break; } }, false); if (inCommandGroup) { osbSprite.EndGroup(); inCommandGroup = false; } }