public StoryboardObject ParseObjectLine(string line)
        {
            StoryboardObject obj = null;

            var data_arr = line.Split(',');

            if ((!Enum.TryParse <StoryboardObjectType>(data_arr[0], true, out var obj_type)) || !(obj_type == StoryboardObjectType.Background || obj_type == StoryboardObjectType.Animation || obj_type == StoryboardObjectType.Sprite))
            {
                Log.Warn($"Unknown/Unsupport Storyboard object type:" + data_arr[0]);
                return(null);
            }

            switch (obj_type)
            {
            case StoryboardObjectType.Background:
                obj = new StoryboardBackgroundObject();
                break;

            case StoryboardObjectType.Sprite:
                obj = new StoryboardObject();
                break;

            case StoryboardObjectType.Animation:
                obj = new StoryboardAnimation();
                break;

            default:
                break;
            }

            if (!(obj is StoryboardBackgroundObject))
            {
                obj.layer = (Layer)Enum.Parse(typeof(Layer), data_arr[1]);

                obj.OriginOffset = AnchorConvert.Convert((Anchor)Enum.Parse(typeof(Anchor), data_arr[2]));

                obj.ImageFilePath = data_arr[3].Trim().Trim('\"').ToString().Replace("/", "\\").ToLower();

                obj.BaseTransformResetAction += (x) => x.Postion = new Vector(data_arr[4].ToSigle(), data_arr[5].ToSigle());

                if (obj is StoryboardAnimation animation)
                {
                    ParseStoryboardAnimation(animation, data_arr);
                }
            }
            else
            {
                //For background object
                obj.ImageFilePath = data_arr[2].Trim().Trim('\"').ToString().Replace("/", "\\").ToLower();

                var position = data_arr.Length > 4 ? new Vector(data_arr[3].ToSigle(), data_arr[4].ToSigle()) : Vector.Zero;

                if (position != Vector.One)
                {
                    obj.BaseTransformResetAction += (x) => x.Postion = position + new Vector(320, 240);
                }
            }

            return(obj);
        }
        public static StoryboardObject Create(BinaryReader reader, StringCacheTable cache)
        {
            StoryboardObject obj = null;
            var id = reader.ReadByte();

            switch (id)
            {
            case 1:
                obj = new StoryboardAnimation();
                break;

            case 2:
                obj = new StoryboardBackgroundObject();

                //clean default commands because there will be added by binary file.
                foreach (var cmd in obj.CommandMap.Values.SelectMany(x => x).ToArray())
                {
                    obj.RemoveCommand(cmd);
                }

                break;

            default:
                obj = new StoryboardObject();
                break;
            }

            obj.OnDeserialize(reader, cache);
            return(obj);
        }
        public DrawableStoryboardAnimation(StoryboardAnimation animation)
        {
            Animation = animation;
            Origin    = animation.Origin;
            Position  = animation.InitialPosition;
            Repeat    = animation.LoopType == AnimationLoopType.LoopForever;

            LifetimeStart = animation.StartTime;
            LifetimeEnd   = animation.EndTime;
        }
        private void ParseStoryboardAnimation(StoryboardAnimation animation, string[] sprite_param)
        {
            int dot_position = animation.ImageFilePath.LastIndexOf('.');

            animation.FrameFileExtension = animation.ImageFilePath.Substring(dot_position);
            animation.FrameBaseImagePath = animation.ImageFilePath.Replace(animation.FrameFileExtension, string.Empty);

            animation.FrameCount = sprite_param[6].ToInt();

            animation.FrameDelay = sprite_param[7].ToSigle();

            animation.LoopType = (LoopType)Enum.Parse(typeof(LoopType), sprite_param[8]);
        }
 public void StopTransformationThread()
 {
     ServiceLocator.DispatcherService.RunOnMainThread(() => StoryboardAnimation.Stop());
 }
Esempio n. 6
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;
                }
            }
        }