コード例 #1
0
        public void TestStoryboardProducesCorrectStartTimeFadeInAfterOtherEvents(double firstStoryboardEvent, double expectedStartTime, bool addEventToLoop)
        {
            var storyboard = new Storyboard();

            var sprite = new StoryboardSprite("unknown", Anchor.TopLeft, Vector2.Zero);

            // these should be ignored as we have an alpha visibility blocker proceeding this command.
            sprite.TimelineGroup.Scale.Add(Easing.None, -20000, -18000, 0, 1);
            var loopGroup = sprite.AddLoop(-20000, 50);

            loopGroup.Scale.Add(Easing.None, -20000, -18000, 0, 1);

            var target = addEventToLoop ? loopGroup : sprite.TimelineGroup;

            target.Alpha.Add(Easing.None, firstStoryboardEvent, firstStoryboardEvent + 500, 0, 1);

            // these should be ignored due to being in the future.
            sprite.TimelineGroup.Alpha.Add(Easing.None, 18000, 20000, 0, 1);
            loopGroup.Alpha.Add(Easing.None, 18000, 20000, 0, 1);

            storyboard.GetLayer("Background").Add(sprite);

            loadPlayerWithBeatmap(new TestBeatmap(new OsuRuleset().RulesetInfo), storyboard);

            AddAssert($"first frame is {expectedStartTime}", () =>
            {
                Debug.Assert(player.FirstFrameClockTime != null);
                return(Precision.AlmostEquals(player.FirstFrameClockTime.Value, expectedStartTime, lenience_ms));
            });
        }
コード例 #2
0
        public void TestStoryboardProducesCorrectStartTimeFadeInAfterOtherEvents(double firstStoryboardEvent, double expectedStartTime, bool addEventToLoop)
        {
            var storyboard = new Storyboard();

            var sprite = new StoryboardSprite("unknown", Anchor.TopLeft, Vector2.Zero);

            // these should be ignored as we have an alpha visibility blocker proceeding this command.
            sprite.TimelineGroup.Scale.Add(Easing.None, -20000, -18000, 0, 1);
            var loopGroup = sprite.AddLoop(-20000, 50);

            loopGroup.Scale.Add(Easing.None, -20000, -18000, 0, 1);

            var    target     = addEventToLoop ? loopGroup : sprite.TimelineGroup;
            double targetTime = addEventToLoop ? 20000 : 0;

            target.Alpha.Add(Easing.None, targetTime + firstStoryboardEvent, targetTime + firstStoryboardEvent + 500, 0, 1);

            // these should be ignored due to being in the future.
            sprite.TimelineGroup.Alpha.Add(Easing.None, 18000, 20000, 0, 1);
            loopGroup.Alpha.Add(Easing.None, 38000, 40000, 0, 1);

            storyboard.GetLayer("Background").Add(sprite);

            loadPlayerWithBeatmap(new TestBeatmap(new OsuRuleset().RulesetInfo), storyboard);

            AddStep("check first frame time", () =>
            {
                Assert.That(player.FirstFrameClockTime, Is.Not.Null);
                Assert.That(player.FirstFrameClockTime.Value, Is.EqualTo(expectedStartTime).Within(lenience_ms));
            });
        }
コード例 #3
0
        public void TestDecodeLoopCount()
        {
            // all loop sequences in loop-count.osb have a total duration of 2000ms (fade in 0->1000ms, fade out 1000->2000ms).
            const double loop_duration = 2000;

            var decoder = new LegacyStoryboardDecoder();

            using (var resStream = TestResources.OpenResource("loop-count.osb"))
                using (var stream = new LineBufferedReader(resStream))
                {
                    var storyboard = decoder.Decode(stream);

                    StoryboardLayer background = storyboard.Layers.Single(l => l.Depth == 3);

                    // stable ensures that any loop command executes at least once, even if the loop count specified in the .osb is zero or negative.
                    StoryboardSprite zeroTimes = background.Elements.OfType <StoryboardSprite>().Single(s => s.Path == "zero-times.png");
                    Assert.That(zeroTimes.EndTime, Is.EqualTo(1000 + loop_duration));

                    StoryboardSprite oneTime = background.Elements.OfType <StoryboardSprite>().Single(s => s.Path == "one-time.png");
                    Assert.That(oneTime.EndTime, Is.EqualTo(4000 + loop_duration));

                    StoryboardSprite manyTimes = background.Elements.OfType <StoryboardSprite>().Single(s => s.Path == "many-times.png");
                    Assert.That(manyTimes.EndTime, Is.EqualTo(9000 + 40 * loop_duration));
                }
        }
コード例 #4
0
ファイル: SpriteExport.cs プロジェクト: Eve-ning/Storyboarder
        public StoryboardSprite CreateOsuSprite()
        {
            var   sbSprite = new StoryboardSprite(Origins.Centre, SpritePath, 0, 0);
            bool  first    = true;
            var   rotation = 0;
            Event prev     = new Event();

            foreach (var v in Events)
            {
                var curr = new Event(v);
                if (first)
                {
                    prev  = curr;
                    first = false;
                    continue;
                }

                var cmd = new Command(CommandType.Movement, Easing.None,
                                      (int)prev.T, (int)curr.T,
                                      prev.XY, curr.XY);
                sbSprite.Commands.Commands.Add(cmd);
                //1.567193,-1.5685729
                if (curr.R > prev.R)
                {
                }
                var cmdR = new Command(CommandType.Rotation, Easing.None,
                                       (int)prev.T, (int)curr.T,
                                       prev.R, curr.R);
                sbSprite.Commands.Commands.Add(cmdR);
                prev = curr;
            }
            return(sbSprite);
        }
コード例 #5
0
        private Storyboard createStoryboard(double duration)
        {
            var storyboard = new Storyboard();
            var sprite     = new StoryboardSprite("unknown", Anchor.TopLeft, Vector2.Zero);

            sprite.TimelineGroup.Alpha.Add(Easing.None, 0, duration, 1, 0);
            storyboard.GetLayer("Background").Add(sprite);
            return(storyboard);
        }
コード例 #6
0
        public DrawableStoryboardSprite(StoryboardSprite sprite)
        {
            Sprite   = sprite;
            Origin   = sprite.Origin;
            Position = sprite.InitialPosition;

            LifetimeStart = sprite.StartTime;
            LifetimeEnd   = sprite.EndTime;
        }
コード例 #7
0
        public void TestStoryboardProducesCorrectStartTimeSimpleAlpha(double firstStoryboardEvent, double expectedStartTime)
        {
            var storyboard = new Storyboard();

            var sprite = new StoryboardSprite("unknown", Anchor.TopLeft, Vector2.Zero);

            sprite.TimelineGroup.Alpha.Add(Easing.None, firstStoryboardEvent, firstStoryboardEvent + 500, 0, 1);

            storyboard.GetLayer("Background").Add(sprite);

            loadPlayerWithBeatmap(new TestBeatmap(new OsuRuleset().RulesetInfo), storyboard);

            AddStep("check first frame time", () =>
            {
                Assert.That(player.FirstFrameClockTime, Is.Not.Null);
                Assert.That(player.FirstFrameClockTime.Value, Is.EqualTo(expectedStartTime).Within(lenience_ms));
            });
        }
コード例 #8
0
ファイル: TestSceneLeadIn.cs プロジェクト: RCal-Dev/osu
        public void TestStoryboardProducesCorrectStartTimeSimpleAlpha(double firstStoryboardEvent, double expectedStartTime)
        {
            var storyboard = new Storyboard();

            var sprite = new StoryboardSprite("unknown", Anchor.TopLeft, Vector2.Zero);

            sprite.TimelineGroup.Alpha.Add(Easing.None, firstStoryboardEvent, firstStoryboardEvent + 500, 0, 1);

            storyboard.GetLayer("Background").Add(sprite);

            loadPlayerWithBeatmap(new TestBeatmap(new OsuRuleset().RulesetInfo), storyboard);

            AddAssert($"first frame is {expectedStartTime}", () =>
            {
                Debug.Assert(player.FirstFrameClockTime != null);
                return(Precision.AlmostEquals(player.FirstFrameClockTime.Value, expectedStartTime, lenience_ms));
            });
        }
コード例 #9
0
        protected override void ParseFile(StreamReader stream, Beatmap beatmap)
        {
            beatmap.BeatmapInfo.BeatmapVersion = beatmapVersion;

            Section              section          = Section.None;
            bool                 hasCustomColours = false;
            StoryboardSprite     storyboardSprite = null;
            CommandTimelineGroup timelineGroup    = null;

            string line;

            while ((line = stream.ReadLine()) != null)
            {
                if (string.IsNullOrWhiteSpace(line))
                {
                    continue;
                }

                if (line.StartsWith("//"))
                {
                    continue;
                }

                if (line.StartsWith(@"osu file format v"))
                {
                    beatmap.BeatmapInfo.BeatmapVersion = int.Parse(line.Substring(17));
                    continue;
                }

                if (line.StartsWith(@"[") && line.EndsWith(@"]"))
                {
                    if (!Enum.TryParse(line.Substring(1, line.Length - 2), out section))
                    {
                        throw new InvalidDataException($@"Unknown osu section {line}");
                    }
                    continue;
                }

                switch (section)
                {
                case Section.General:
                    handleGeneral(beatmap, line);
                    break;

                case Section.Editor:
                    handleEditor(beatmap, line);
                    break;

                case Section.Metadata:
                    handleMetadata(beatmap, line);
                    break;

                case Section.Difficulty:
                    handleDifficulty(beatmap, line);
                    break;

                case Section.Events:
                    handleEvents(beatmap, line, ref storyboardSprite, ref timelineGroup);
                    break;

                case Section.TimingPoints:
                    handleTimingPoints(beatmap, line);
                    break;

                case Section.Colours:
                    handleColours(beatmap, line, ref hasCustomColours);
                    break;

                case Section.HitObjects:

                    // If the ruleset wasn't specified, assume the osu!standard ruleset.
                    if (parser == null)
                    {
                        parser = new Rulesets.Objects.Legacy.Osu.ConvertHitObjectParser();
                    }

                    var obj = parser.Parse(line);

                    if (obj != null)
                    {
                        beatmap.HitObjects.Add(obj);
                    }

                    break;

                case Section.Variables:
                    handleVariables(line);
                    break;
                }
            }

            foreach (var hitObject in beatmap.HitObjects)
            {
                hitObject.ApplyDefaults(beatmap.ControlPointInfo, beatmap.BeatmapInfo.BaseDifficulty);
            }
        }
コード例 #10
0
        private void handleEvents(Beatmap beatmap, string line, ref StoryboardSprite storyboardSprite, ref CommandTimelineGroup timelineGroup)
        {
            var depth = 0;

            while (line.StartsWith(" ") || line.StartsWith("_"))
            {
                ++depth;
                line = line.Substring(1);
            }

            decodeVariables(ref line);

            string[] split = line.Split(',');

            if (depth == 0)
            {
                storyboardSprite = null;

                EventType type;
                if (!Enum.TryParse(split[0], out type))
                {
                    throw new InvalidDataException($@"Unknown event type {split[0]}");
                }

                switch (type)
                {
                case EventType.Video:
                case EventType.Background:
                    string filename = split[2].Trim('"');

                    if (type == EventType.Background)
                    {
                        beatmap.BeatmapInfo.Metadata.BackgroundFile = filename;
                    }

                    break;

                case EventType.Break:
                    var breakEvent = new BreakPeriod
                    {
                        StartTime = double.Parse(split[1], NumberFormatInfo.InvariantInfo),
                        EndTime   = double.Parse(split[2], NumberFormatInfo.InvariantInfo)
                    };

                    if (!breakEvent.HasEffect)
                    {
                        return;
                    }

                    beatmap.Breaks.Add(breakEvent);
                    break;

                case EventType.Sprite:
                {
                    var layer  = parseLayer(split[1]);
                    var origin = parseOrigin(split[2]);
                    var path   = cleanFilename(split[3]);
                    var x      = float.Parse(split[4], NumberFormatInfo.InvariantInfo);
                    var y      = float.Parse(split[5], NumberFormatInfo.InvariantInfo);
                    storyboardSprite = new StoryboardSprite(path, origin, new Vector2(x, y));
                    beatmap.Storyboard.GetLayer(layer).Add(storyboardSprite);
                }
                break;

                case EventType.Animation:
                {
                    var layer      = parseLayer(split[1]);
                    var origin     = parseOrigin(split[2]);
                    var path       = cleanFilename(split[3]);
                    var x          = float.Parse(split[4], NumberFormatInfo.InvariantInfo);
                    var y          = float.Parse(split[5], NumberFormatInfo.InvariantInfo);
                    var frameCount = int.Parse(split[6]);
                    var frameDelay = double.Parse(split[7], NumberFormatInfo.InvariantInfo);
                    var loopType   = split.Length > 8 ? (AnimationLoopType)Enum.Parse(typeof(AnimationLoopType), split[8]) : AnimationLoopType.LoopForever;
                    storyboardSprite = new StoryboardAnimation(path, origin, new Vector2(x, y), frameCount, frameDelay, loopType);
                    beatmap.Storyboard.GetLayer(layer).Add(storyboardSprite);
                }
                break;

                case EventType.Sample:
                {
                    var time   = double.Parse(split[1], CultureInfo.InvariantCulture);
                    var layer  = parseLayer(split[2]);
                    var path   = cleanFilename(split[3]);
                    var volume = split.Length > 4 ? float.Parse(split[4], CultureInfo.InvariantCulture) : 100;
                    beatmap.Storyboard.GetLayer(layer).Add(new StoryboardSample(path, time, volume));
                }
                break;
                }
            }
            else
            {
                if (depth < 2)
                {
                    timelineGroup = storyboardSprite?.TimelineGroup;
                }

                var commandType = split[0];
                switch (commandType)
                {
                case "T":
                {
                    var triggerName = split[1];
                    var startTime   = split.Length > 2 ? double.Parse(split[2], CultureInfo.InvariantCulture) : double.MinValue;
                    var endTime     = split.Length > 3 ? double.Parse(split[3], CultureInfo.InvariantCulture) : double.MaxValue;
                    var groupNumber = split.Length > 4 ? int.Parse(split[4]) : 0;
                    timelineGroup = storyboardSprite?.AddTrigger(triggerName, startTime, endTime, groupNumber);
                }
                break;

                case "L":
                {
                    var startTime = double.Parse(split[1], CultureInfo.InvariantCulture);
                    var loopCount = int.Parse(split[2]);
                    timelineGroup = storyboardSprite?.AddLoop(startTime, loopCount);
                }
                break;

                default:
                {
                    if (string.IsNullOrEmpty(split[3]))
                    {
                        split[3] = split[2];
                    }

                    var easing    = (Easing)int.Parse(split[1]);
                    var startTime = double.Parse(split[2], CultureInfo.InvariantCulture);
                    var endTime   = double.Parse(split[3], CultureInfo.InvariantCulture);

                    switch (commandType)
                    {
                    case "F":
                    {
                        var startValue = float.Parse(split[4], CultureInfo.InvariantCulture);
                        var endValue   = split.Length > 5 ? float.Parse(split[5], CultureInfo.InvariantCulture) : startValue;
                        timelineGroup?.Alpha.Add(easing, startTime, endTime, startValue, endValue);
                    }
                    break;

                    case "S":
                    {
                        var startValue = float.Parse(split[4], CultureInfo.InvariantCulture);
                        var endValue   = split.Length > 5 ? float.Parse(split[5], CultureInfo.InvariantCulture) : startValue;
                        timelineGroup?.Scale.Add(easing, startTime, endTime, new Vector2(startValue), new Vector2(endValue));
                    }
                    break;

                    case "V":
                    {
                        var startX = float.Parse(split[4], CultureInfo.InvariantCulture);
                        var startY = float.Parse(split[5], CultureInfo.InvariantCulture);
                        var endX   = split.Length > 6 ? float.Parse(split[6], CultureInfo.InvariantCulture) : startX;
                        var endY   = split.Length > 7 ? float.Parse(split[7], CultureInfo.InvariantCulture) : startY;
                        timelineGroup?.Scale.Add(easing, startTime, endTime, new Vector2(startX, startY), new Vector2(endX, endY));
                    }
                    break;

                    case "R":
                    {
                        var startValue = float.Parse(split[4], CultureInfo.InvariantCulture);
                        var endValue   = split.Length > 5 ? float.Parse(split[5], CultureInfo.InvariantCulture) : startValue;
                        timelineGroup?.Rotation.Add(easing, startTime, endTime, MathHelper.RadiansToDegrees(startValue), MathHelper.RadiansToDegrees(endValue));
                    }
                    break;

                    case "M":
                    {
                        var startX = float.Parse(split[4], CultureInfo.InvariantCulture);
                        var startY = float.Parse(split[5], CultureInfo.InvariantCulture);
                        var endX   = split.Length > 6 ? float.Parse(split[6], CultureInfo.InvariantCulture) : startX;
                        var endY   = split.Length > 7 ? float.Parse(split[7], CultureInfo.InvariantCulture) : startY;
                        timelineGroup?.X.Add(easing, startTime, endTime, startX, endX);
                        timelineGroup?.Y.Add(easing, startTime, endTime, startY, endY);
                    }
                    break;

                    case "MX":
                    {
                        var startValue = float.Parse(split[4], CultureInfo.InvariantCulture);
                        var endValue   = split.Length > 5 ? float.Parse(split[5], CultureInfo.InvariantCulture) : startValue;
                        timelineGroup?.X.Add(easing, startTime, endTime, startValue, endValue);
                    }
                    break;

                    case "MY":
                    {
                        var startValue = float.Parse(split[4], CultureInfo.InvariantCulture);
                        var endValue   = split.Length > 5 ? float.Parse(split[5], CultureInfo.InvariantCulture) : startValue;
                        timelineGroup?.Y.Add(easing, startTime, endTime, startValue, endValue);
                    }
                    break;

                    case "C":
                    {
                        var startRed   = float.Parse(split[4], CultureInfo.InvariantCulture);
                        var startGreen = float.Parse(split[5], CultureInfo.InvariantCulture);
                        var startBlue  = float.Parse(split[6], CultureInfo.InvariantCulture);
                        var endRed     = split.Length > 7 ? float.Parse(split[7], CultureInfo.InvariantCulture) : startRed;
                        var endGreen   = split.Length > 8 ? float.Parse(split[8], CultureInfo.InvariantCulture) : startGreen;
                        var endBlue    = split.Length > 9 ? float.Parse(split[9], CultureInfo.InvariantCulture) : startBlue;
                        timelineGroup?.Colour.Add(easing, startTime, endTime,
                                                  new Color4(startRed / 255f, startGreen / 255f, startBlue / 255f, 1),
                                                  new Color4(endRed / 255f, endGreen / 255f, endBlue / 255f, 1));
                    }
                    break;

                    case "P":
                    {
                        var type = split[4];
                        switch (type)
                        {
                        case "A": timelineGroup?.BlendingMode.Add(easing, startTime, endTime, BlendingMode.Additive, startTime == endTime ? BlendingMode.Additive : BlendingMode.Inherit); break;

                        case "H": timelineGroup?.FlipH.Add(easing, startTime, endTime, true, startTime == endTime); break;

                        case "V": timelineGroup?.FlipV.Add(easing, startTime, endTime, true, startTime == endTime); break;
                        }
                    }
                    break;

                    default:
                        throw new InvalidDataException($@"Unknown command type: {commandType}");
                    }
                }
                break;
                }
            }
        }
コード例 #11
0
        private void handleEvents(string line)
        {
            var depth = 0;

            foreach (char c in line)
            {
                if (c == ' ' || c == '_')
                {
                    depth++;
                }
                else
                {
                    break;
                }
            }

            line = line.Substring(depth);

            decodeVariables(ref line);

            string[] split = line.Split(',');

            if (depth == 0)
            {
                storyboardSprite = null;

                if (!Enum.TryParse(split[0], out LegacyEventType type))
                {
                    throw new InvalidDataException($@"Unknown event type: {split[0]}");
                }

                switch (type)
                {
                case LegacyEventType.Video:
                {
                    var offset = Parsing.ParseInt(split[1]);
                    var path   = CleanFilename(split[2]);

                    storyboard.GetLayer("Video").Add(new StoryboardVideo(path, offset));
                    break;
                }

                case LegacyEventType.Sprite:
                {
                    var layer  = parseLayer(split[1]);
                    var origin = parseOrigin(split[2]);
                    var path   = CleanFilename(split[3]);
                    var x      = Parsing.ParseFloat(split[4], Parsing.MAX_COORDINATE_VALUE);
                    var y      = Parsing.ParseFloat(split[5], Parsing.MAX_COORDINATE_VALUE);
                    storyboardSprite = new StoryboardSprite(path, origin, new Vector2(x, y));
                    storyboard.GetLayer(layer).Add(storyboardSprite);
                    break;
                }

                case LegacyEventType.Animation:
                {
                    var layer      = parseLayer(split[1]);
                    var origin     = parseOrigin(split[2]);
                    var path       = CleanFilename(split[3]);
                    var x          = Parsing.ParseFloat(split[4], Parsing.MAX_COORDINATE_VALUE);
                    var y          = Parsing.ParseFloat(split[5], Parsing.MAX_COORDINATE_VALUE);
                    var frameCount = Parsing.ParseInt(split[6]);
                    var frameDelay = Parsing.ParseDouble(split[7]);

                    if (FormatVersion < 6)
                    {
                        // this is random as hell but taken straight from osu-stable.
                        frameDelay = Math.Round(0.015 * frameDelay) * 1.186 * (1000 / 60f);
                    }

                    var loopType = split.Length > 8 ? parseAnimationLoopType(split[8]) : AnimationLoopType.LoopForever;
                    storyboardSprite = new StoryboardAnimation(path, origin, new Vector2(x, y), frameCount, frameDelay, loopType);
                    storyboard.GetLayer(layer).Add(storyboardSprite);
                    break;
                }

                case LegacyEventType.Sample:
                {
                    var time   = Parsing.ParseDouble(split[1]);
                    var layer  = parseLayer(split[2]);
                    var path   = CleanFilename(split[3]);
                    var volume = split.Length > 4 ? Parsing.ParseFloat(split[4]) : 100;
                    storyboard.GetLayer(layer).Add(new StoryboardSampleInfo(path, time, (int)volume));
                    break;
                }
                }
            }
            else
            {
                if (depth < 2)
                {
                    timelineGroup = storyboardSprite?.TimelineGroup;
                }

                var commandType = split[0];

                switch (commandType)
                {
                case "T":
                {
                    var triggerName = split[1];
                    var startTime   = split.Length > 2 ? Parsing.ParseDouble(split[2]) : double.MinValue;
                    var endTime     = split.Length > 3 ? Parsing.ParseDouble(split[3]) : double.MaxValue;
                    var groupNumber = split.Length > 4 ? Parsing.ParseInt(split[4]) : 0;
                    timelineGroup = storyboardSprite?.AddTrigger(triggerName, startTime, endTime, groupNumber);
                    break;
                }

                case "L":
                {
                    var startTime = Parsing.ParseDouble(split[1]);
                    var loopCount = Parsing.ParseInt(split[2]);
                    timelineGroup = storyboardSprite?.AddLoop(startTime, loopCount);
                    break;
                }

                default:
                {
                    if (string.IsNullOrEmpty(split[3]))
                    {
                        split[3] = split[2];
                    }

                    var easing    = (Easing)Parsing.ParseInt(split[1]);
                    var startTime = Parsing.ParseDouble(split[2]);
                    var endTime   = Parsing.ParseDouble(split[3]);

                    switch (commandType)
                    {
                    case "F":
                    {
                        var startValue = Parsing.ParseFloat(split[4]);
                        var endValue   = split.Length > 5 ? Parsing.ParseFloat(split[5]) : startValue;
                        timelineGroup?.Alpha.Add(easing, startTime, endTime, startValue, endValue);
                        break;
                    }

                    case "S":
                    {
                        var startValue = Parsing.ParseFloat(split[4]);
                        var endValue   = split.Length > 5 ? Parsing.ParseFloat(split[5]) : startValue;
                        timelineGroup?.Scale.Add(easing, startTime, endTime, startValue, endValue);
                        break;
                    }

                    case "V":
                    {
                        var startX = Parsing.ParseFloat(split[4]);
                        var startY = Parsing.ParseFloat(split[5]);
                        var endX   = split.Length > 6 ? Parsing.ParseFloat(split[6]) : startX;
                        var endY   = split.Length > 7 ? Parsing.ParseFloat(split[7]) : startY;
                        timelineGroup?.VectorScale.Add(easing, startTime, endTime, new Vector2(startX, startY), new Vector2(endX, endY));
                        break;
                    }

                    case "R":
                    {
                        var startValue = Parsing.ParseFloat(split[4]);
                        var endValue   = split.Length > 5 ? Parsing.ParseFloat(split[5]) : startValue;
                        timelineGroup?.Rotation.Add(easing, startTime, endTime, MathUtils.RadiansToDegrees(startValue), MathUtils.RadiansToDegrees(endValue));
                        break;
                    }

                    case "M":
                    {
                        var startX = Parsing.ParseFloat(split[4]);
                        var startY = Parsing.ParseFloat(split[5]);
                        var endX   = split.Length > 6 ? Parsing.ParseFloat(split[6]) : startX;
                        var endY   = split.Length > 7 ? Parsing.ParseFloat(split[7]) : startY;
                        timelineGroup?.X.Add(easing, startTime, endTime, startX, endX);
                        timelineGroup?.Y.Add(easing, startTime, endTime, startY, endY);
                        break;
                    }

                    case "MX":
                    {
                        var startValue = Parsing.ParseFloat(split[4]);
                        var endValue   = split.Length > 5 ? Parsing.ParseFloat(split[5]) : startValue;
                        timelineGroup?.X.Add(easing, startTime, endTime, startValue, endValue);
                        break;
                    }

                    case "MY":
                    {
                        var startValue = Parsing.ParseFloat(split[4]);
                        var endValue   = split.Length > 5 ? Parsing.ParseFloat(split[5]) : startValue;
                        timelineGroup?.Y.Add(easing, startTime, endTime, startValue, endValue);
                        break;
                    }

                    case "C":
                    {
                        var startRed   = Parsing.ParseFloat(split[4]);
                        var startGreen = Parsing.ParseFloat(split[5]);
                        var startBlue  = Parsing.ParseFloat(split[6]);
                        var endRed     = split.Length > 7 ? Parsing.ParseFloat(split[7]) : startRed;
                        var endGreen   = split.Length > 8 ? Parsing.ParseFloat(split[8]) : startGreen;
                        var endBlue    = split.Length > 9 ? Parsing.ParseFloat(split[9]) : startBlue;
                        timelineGroup?.Colour.Add(easing, startTime, endTime,
                                                  new Color4(startRed / 255f, startGreen / 255f, startBlue / 255f, 1),
                                                  new Color4(endRed / 255f, endGreen / 255f, endBlue / 255f, 1));
                        break;
                    }

                    case "P":
                    {
                        var type = split[4];

                        switch (type)
                        {
                        case "A":
                            timelineGroup?.BlendingParameters.Add(easing, startTime, endTime, BlendingParameters.Additive, startTime == endTime ? BlendingParameters.Additive : BlendingParameters.Inherit);
                            break;

                        case "H":
                            timelineGroup?.FlipH.Add(easing, startTime, endTime, true, startTime == endTime);
                            break;

                        case "V":
                            timelineGroup?.FlipV.Add(easing, startTime, endTime, true, startTime == endTime);
                            break;
                        }

                        break;
                    }

                    default:
                        throw new InvalidDataException($@"Unknown command type: {commandType}");
                    }

                    break;
                }
                }
            }
        }
コード例 #12
0
        private void handleEvents(string line)
        {
            var depth = 0;

            foreach (char c in line)
            {
                if (c == ' ' || c == '_')
                {
                    depth++;
                }
                else
                {
                    break;
                }
            }

            line = line.Substring(depth);

            decodeVariables(ref line);

            string[] split = line.Split(',');

            if (depth == 0)
            {
                storyboardSprite = null;

                if (!Enum.TryParse(split[0], out LegacyEventType type))
                {
                    throw new InvalidDataException($@"Unknown event type: {split[0]}");
                }

                switch (type)
                {
                case LegacyEventType.Sprite:
                {
                    var layer  = parseLayer(split[1]);
                    var origin = parseOrigin(split[2]);
                    var path   = CleanFilename(split[3]);
                    var x      = float.Parse(split[4], NumberFormatInfo.InvariantInfo);
                    var y      = float.Parse(split[5], NumberFormatInfo.InvariantInfo);
                    storyboardSprite = new StoryboardSprite(path, origin, new Vector2(x, y));
                    storyboard.GetLayer(layer).Add(storyboardSprite);
                    break;
                }

                case LegacyEventType.Animation:
                {
                    var layer      = parseLayer(split[1]);
                    var origin     = parseOrigin(split[2]);
                    var path       = CleanFilename(split[3]);
                    var x          = float.Parse(split[4], NumberFormatInfo.InvariantInfo);
                    var y          = float.Parse(split[5], NumberFormatInfo.InvariantInfo);
                    var frameCount = int.Parse(split[6]);
                    var frameDelay = double.Parse(split[7], NumberFormatInfo.InvariantInfo);
                    var loopType   = split.Length > 8 ? (AnimationLoopType)Enum.Parse(typeof(AnimationLoopType), split[8]) : AnimationLoopType.LoopForever;
                    storyboardSprite = new StoryboardAnimation(path, origin, new Vector2(x, y), frameCount, frameDelay, loopType);
                    storyboard.GetLayer(layer).Add(storyboardSprite);
                    break;
                }

                case LegacyEventType.Sample:
                {
                    var time   = double.Parse(split[1], CultureInfo.InvariantCulture);
                    var layer  = parseLayer(split[2]);
                    var path   = CleanFilename(split[3]);
                    var volume = split.Length > 4 ? float.Parse(split[4], CultureInfo.InvariantCulture) : 100;
                    storyboard.GetLayer(layer).Add(new StoryboardSampleInfo(path, time, (int)volume));
                    break;
                }
                }
            }
            else
            {
                if (depth < 2)
                {
                    timelineGroup = storyboardSprite?.TimelineGroup;
                }

                var commandType = split[0];

                switch (commandType)
                {
                case "T":
                {
                    var triggerName = split[1];
                    var startTime   = split.Length > 2 ? double.Parse(split[2], CultureInfo.InvariantCulture) : double.MinValue;
                    var endTime     = split.Length > 3 ? double.Parse(split[3], CultureInfo.InvariantCulture) : double.MaxValue;
                    var groupNumber = split.Length > 4 ? int.Parse(split[4]) : 0;
                    timelineGroup = storyboardSprite?.AddTrigger(triggerName, startTime, endTime, groupNumber);
                    break;
                }

                case "L":
                {
                    var startTime = double.Parse(split[1], CultureInfo.InvariantCulture);
                    var loopCount = int.Parse(split[2]);
                    timelineGroup = storyboardSprite?.AddLoop(startTime, loopCount);
                    break;
                }

                default:
                {
                    if (string.IsNullOrEmpty(split[3]))
                    {
                        split[3] = split[2];
                    }

                    var easing    = (Easing)int.Parse(split[1]);
                    var startTime = double.Parse(split[2], CultureInfo.InvariantCulture);
                    var endTime   = double.Parse(split[3], CultureInfo.InvariantCulture);

                    switch (commandType)
                    {
                    case "F":
                    {
                        var startValue = float.Parse(split[4], CultureInfo.InvariantCulture);
                        var endValue   = split.Length > 5 ? float.Parse(split[5], CultureInfo.InvariantCulture) : startValue;
                        timelineGroup?.Alpha.Add(easing, startTime, endTime, startValue, endValue);
                        break;
                    }

                    case "S":
                    {
                        var startValue = float.Parse(split[4], CultureInfo.InvariantCulture);
                        var endValue   = split.Length > 5 ? float.Parse(split[5], CultureInfo.InvariantCulture) : startValue;
                        timelineGroup?.Scale.Add(easing, startTime, endTime, startValue, endValue);
                        break;
                    }

                    case "V":
                    {
                        var startX = float.Parse(split[4], CultureInfo.InvariantCulture);
                        var startY = float.Parse(split[5], CultureInfo.InvariantCulture);
                        var endX   = split.Length > 6 ? float.Parse(split[6], CultureInfo.InvariantCulture) : startX;
                        var endY   = split.Length > 7 ? float.Parse(split[7], CultureInfo.InvariantCulture) : startY;
                        timelineGroup?.VectorScale.Add(easing, startTime, endTime, new Vector2(startX, startY), new Vector2(endX, endY));
                        break;
                    }

                    case "R":
                    {
                        var startValue = float.Parse(split[4], CultureInfo.InvariantCulture);
                        var endValue   = split.Length > 5 ? float.Parse(split[5], CultureInfo.InvariantCulture) : startValue;
                        timelineGroup?.Rotation.Add(easing, startTime, endTime, MathUtils.RadiansToDegrees(startValue), MathUtils.RadiansToDegrees(endValue));
                        break;
                    }

                    case "M":
                    {
                        var startX = float.Parse(split[4], CultureInfo.InvariantCulture);
                        var startY = float.Parse(split[5], CultureInfo.InvariantCulture);
                        var endX   = split.Length > 6 ? float.Parse(split[6], CultureInfo.InvariantCulture) : startX;
                        var endY   = split.Length > 7 ? float.Parse(split[7], CultureInfo.InvariantCulture) : startY;
                        timelineGroup?.X.Add(easing, startTime, endTime, startX, endX);
                        timelineGroup?.Y.Add(easing, startTime, endTime, startY, endY);
                        break;
                    }

                    case "MX":
                    {
                        var startValue = float.Parse(split[4], CultureInfo.InvariantCulture);
                        var endValue   = split.Length > 5 ? float.Parse(split[5], CultureInfo.InvariantCulture) : startValue;
                        timelineGroup?.X.Add(easing, startTime, endTime, startValue, endValue);
                        break;
                    }

                    case "MY":
                    {
                        var startValue = float.Parse(split[4], CultureInfo.InvariantCulture);
                        var endValue   = split.Length > 5 ? float.Parse(split[5], CultureInfo.InvariantCulture) : startValue;
                        timelineGroup?.Y.Add(easing, startTime, endTime, startValue, endValue);
                        break;
                    }

                    case "C":
                    {
                        var startRed   = float.Parse(split[4], CultureInfo.InvariantCulture);
                        var startGreen = float.Parse(split[5], CultureInfo.InvariantCulture);
                        var startBlue  = float.Parse(split[6], CultureInfo.InvariantCulture);
                        var endRed     = split.Length > 7 ? float.Parse(split[7], CultureInfo.InvariantCulture) : startRed;
                        var endGreen   = split.Length > 8 ? float.Parse(split[8], CultureInfo.InvariantCulture) : startGreen;
                        var endBlue    = split.Length > 9 ? float.Parse(split[9], CultureInfo.InvariantCulture) : startBlue;
                        timelineGroup?.Colour.Add(easing, startTime, endTime,
                                                  new Color4(startRed / 255f, startGreen / 255f, startBlue / 255f, 1),
                                                  new Color4(endRed / 255f, endGreen / 255f, endBlue / 255f, 1));
                        break;
                    }

                    case "P":
                    {
                        var type = split[4];

                        switch (type)
                        {
                        case "A":
                            timelineGroup?.BlendingParameters.Add(easing, startTime, endTime, BlendingParameters.Additive, startTime == endTime ? BlendingParameters.Additive : BlendingParameters.Inherit);
                            break;

                        case "H":
                            timelineGroup?.FlipH.Add(easing, startTime, endTime, true, startTime == endTime);
                            break;

                        case "V":
                            timelineGroup?.FlipV.Add(easing, startTime, endTime, true, startTime == endTime);
                            break;
                        }

                        break;
                    }

                    default:
                        throw new InvalidDataException($@"Unknown command type: {commandType}");
                    }

                    break;
                }
                }
            }
        }
コード例 #13
0
 public void TestIntroStoryboardElement() => testLeadIn(b =>
 {
     var sprite = new StoryboardSprite("unknown", Anchor.TopLeft, Vector2.Zero);
     sprite.TimelineGroup.Alpha.Add(Easing.None, -2000, 0, 0, 1);
     b.Storyboard.GetLayer("Background").Add(sprite);
 });