public static void Execute(Vegas vegas)
        {
            var videoTracks = VegasHelper.GetTracks <VideoTrack>(vegas, 1);

            var selectedTrackEvents = VegasHelper.GetTrackEvents(videoTracks);

            var currentPosition = selectedTrackEvents[0].Start;

            //order the list
            ListHelpers.Shuffle(selectedTrackEvents, new Random());

            using (var undo = new UndoBlock("Randomize Events"))
            {
                //update order of the events
                foreach (var selectedTrackEvent in selectedTrackEvents)
                {
                    if (selectedTrackEvent.IsGrouped)
                    {
                        foreach (var groupedTrackEvents in selectedTrackEvent.Group)
                        {
                            groupedTrackEvents.Start = currentPosition;
                        }
                    }
                    else
                    {
                        selectedTrackEvent.Start = currentPosition;
                    }
                    currentPosition += selectedTrackEvent.Length;
                }
            }
        }
Example #2
0
        public static List <TrackInfo> BuildWall(int width, int height, WallBuilderConfiguration configData)
        {
            var delay                 = (decimal)configData.DelayBeforeFirstZoom;
            var columns               = configData.Columns;
            var rows                  = configData.Rows;
            var durationPerFrame      = (decimal)configData.DurationPerFrame;
            var durationBetweenFrames = (decimal)configData.DurationBetweenFrames;
            var padding               = 100;

            var totalCells = columns * rows;
            //var Duration = totalCells * durationPerFrame + totalCells * durationBetweenFrames + durationBetweenFrames;

            var gridX = columns;
            var gridY = rows;

            var maxWidth  = width * gridX;
            var maxHeight = height * gridY;

            var tracks = new List <TrackInfo>();

            for (var x = 0; x < gridX; x++)
            {
                for (var y = 0; y < gridY; y++)
                {
                    var idx = x * gridX + y;
                    var ti  = new TrackInfo();
                    ti.Number  = idx + 1;
                    ti.OffsetX = (width * x);
                    ti.OffsetY = (height * y);
                    tracks.Add(ti);
                }
            }

            var totalKeyFrames = totalCells * 2 + 1;

            var centerX = maxWidth / 2;
            var centerY = maxHeight / 2;

            if (configData.Randomize)
            {
                ListHelpers.Shuffle(tracks, new Random(),
                                    info => { info.NewItem.Number = info.Index + 1; });
            }

            var currentTime     = delay;
            var paddingScale    = (1 - configData.Padding);
            var globalZoomLimit = (1 - configData.ZoomOffset);

            for (var currentKf = 1; currentKf < totalKeyFrames + 1; currentKf++)
            {
                if (currentKf != 0 && currentKf % 2 == 0)
                {
                    //this is a closeup
                    var currentCell  = currentKf / 2;
                    var currentTrack = tracks[currentCell - 1];
                    var targetX      = currentTrack.OffsetX;
                    var targetY      = currentTrack.OffsetY;

                    foreach (var ti in tracks)
                    {
                        var kf = new KeyFrameInfo();
                        kf.Time         = currentTime;
                        kf.PanX         = (ti.OffsetX - targetX); //*globalZoomLimit;
                        kf.PanY         = (ti.OffsetY - targetY); //*globalZoomLimit;
                        kf.Width        = width * paddingScale;   //*globalZoomLimit;
                        kf.Height       = height * paddingScale;  //*globalZoomLimit;
                        kf.KeyframeType = VideoKeyframeType.Smooth;
                        kf.PanZ         = 1000 * globalZoomLimit;
                        ti.KeyFrames.Add(kf);

                        var easing = 1.05m;
                        kf              = new KeyFrameInfo();
                        kf.Time         = currentTime + durationPerFrame / 2;
                        kf.PanX         = (ti.OffsetX - targetX); // * globalZoomLimit * easing;
                        kf.PanY         = (ti.OffsetY - targetY); // * globalZoomLimit * easing;
                        kf.Width        = width * paddingScale;   //*globalZoomLimit* easing;
                        kf.Height       = height * paddingScale;  //*globalZoomLimit* easing;
                        kf.KeyframeType = VideoKeyframeType.Smooth;
                        kf.PanZ         = 1000 * globalZoomLimit * easing;
                        ti.KeyFrames.Add(kf);

                        kf              = new KeyFrameInfo();
                        kf.Time         = currentTime + durationPerFrame;
                        kf.PanX         = (ti.OffsetX - targetX); //*globalZoomLimit;
                        kf.PanY         = (ti.OffsetY - targetY); //*globalZoomLimit;
                        kf.Width        = width * paddingScale;   //*globalZoomLimit;
                        kf.Height       = height * paddingScale;  //*globalZoomLimit;
                        kf.KeyframeType = VideoKeyframeType.Slow;
                        kf.PanZ         = 1000 * globalZoomLimit;
                        ti.KeyFrames.Add(kf);
                    }

                    currentTime += durationPerFrame;
                }
                else
                {
                    var targetX = 0;
                    var targetY = 0;

                    var baseScale         = Math.Min(1m / gridX, 1m / gridY);
                    var postframeTimeStep = durationBetweenFrames;

                    if (currentKf < 2 || currentKf > totalKeyFrames - 2)
                    {
                        //this is a full shot

                        targetX = centerX - width / 2;
                        targetY = centerY - height / 2;
                    }
                    else
                    {
                        //transitional shot

                        var previousCell  = (currentKf - 1) / 2;
                        var nextCell      = (currentKf + 1) / 2;
                        var previousTrack = tracks[previousCell - 1];
                        var nextTrack     = tracks[nextCell - 1];

                        targetX = previousTrack.OffsetX - (previousTrack.OffsetX - nextTrack.OffsetX) / 2;
                        targetY = previousTrack.OffsetY - (previousTrack.OffsetY - nextTrack.OffsetY) / 2;

                        decimal widthDiff   = Math.Abs(previousTrack.OffsetX - nextTrack.OffsetX) + width;
                        decimal heightDiff  = Math.Abs(previousTrack.OffsetY - nextTrack.OffsetY) + height;
                        var     scaleFactor = Math.Min(widthDiff / width, heightDiff / height);
                        baseScale = baseScale * scaleFactor;

                        currentTime += postframeTimeStep = durationBetweenFrames / 2;
                    }

                    if (currentKf == 1 && currentTime != 0)
                    {
                        InsertKeyFrames(width, height, tracks, 0, baseScale, targetX, targetY, paddingScale);
                    }

                    InsertKeyFrames(width, height, tracks, currentTime, baseScale, targetX, targetY, paddingScale);

                    currentTime += postframeTimeStep;
                }
            }

            return(tracks);
        }