diff --git a/OpenRA.Game/Widgets/VqaPlayerWidget.cs b/OpenRA.Game/Widgets/VqaPlayerWidget.cs index a3a3c40b04..eb52a87396 100644 --- a/OpenRA.Game/Widgets/VqaPlayerWidget.cs +++ b/OpenRA.Game/Widgets/VqaPlayerWidget.cs @@ -30,6 +30,7 @@ namespace OpenRA.Widgets Action onComplete; public bool Paused { get { return paused; } } + public VqaReader Video { get { return video; } } readonly World world; [ObjectCreator.UseCtor] diff --git a/OpenRA.Mods.Common/Widgets/Logic/AssetBrowserLogic.cs b/OpenRA.Mods.Common/Widgets/Logic/AssetBrowserLogic.cs index 41a5d8586f..ad67d0f8a4 100644 --- a/OpenRA.Mods.Common/Widgets/Logic/AssetBrowserLogic.cs +++ b/OpenRA.Mods.Common/Widgets/Logic/AssetBrowserLogic.cs @@ -35,11 +35,13 @@ namespace OpenRA.Mods.Common.Widgets.Logic string currentPalette; string currentFilename; Sprite[] currentSprites; + VqaPlayerWidget player = null; + bool isVideoLoaded = false; int currentFrame; readonly World world; - static readonly string[] AllowedExtensions = { ".shp", ".r8", "tmp", ".tem", ".des", ".sno", ".int", ".jun" }; + static readonly string[] AllowedExtensions = { ".shp", ".r8", "tmp", ".tem", ".des", ".sno", ".int", ".jun", ".vqa" }; [ObjectCreator.UseCtor] public AssetBrowserLogic(Widget widget, Action onExit, World world) @@ -79,8 +81,13 @@ namespace OpenRA.Mods.Common.Widgets.Logic spriteWidget.GetSprite = () => currentSprites != null ? currentSprites[currentFrame] : null; currentPalette = spriteWidget.Palette; spriteWidget.GetPalette = () => currentPalette; + spriteWidget.IsVisible = () => !isVideoLoaded; } + var playerWidget = panel.GetOrNull("PLAYER"); + if (playerWidget != null) + playerWidget.IsVisible = () => isVideoLoaded; + var paletteDropDown = panel.GetOrNull("PALETTE_SELECTOR"); if (paletteDropDown != null) { @@ -105,28 +112,56 @@ namespace OpenRA.Mods.Common.Widgets.Logic var frameContainer = panel.GetOrNull("FRAME_SELECTOR"); if (frameContainer != null) - frameContainer.IsVisible = () => currentSprites != null && currentSprites.Length > 1; + frameContainer.IsVisible = () => (currentSprites != null && currentSprites.Length > 1) || (player != null && player.Video != null && player.Video.Frames > 1); frameSlider = panel.Get("FRAME_SLIDER"); - frameSlider.OnChange += x => { currentFrame = (int)Math.Round(x); }; - frameSlider.GetValue = () => currentFrame; + if (frameSlider != null) + { + frameSlider.OnChange += x => + { + if (!isVideoLoaded) + currentFrame = (int)Math.Round(x); + }; + + frameSlider.GetValue = () => isVideoLoaded ? player.Video.CurrentFrame : currentFrame; + frameSlider.IsDisabled = () => isVideoLoaded; + } var frameText = panel.GetOrNull("FRAME_COUNT"); if (frameText != null) - frameText.GetText = () => "{0} / {1}".F(currentFrame + 1, currentSprites.Length); + { + frameText.GetText = () => + isVideoLoaded ? + "{0} / {1}".F(player.Video.CurrentFrame + 1, player.Video.Frames) : + "{0} / {1}".F(currentFrame + 1, currentSprites.Length); + } var playButton = panel.GetOrNull("BUTTON_PLAY"); if (playButton != null) { - playButton.OnClick = () => animateFrames = true; - playButton.IsVisible = () => !animateFrames; + playButton.OnClick = () => + { + if (isVideoLoaded) + player.Play(); + else + animateFrames = true; + }; + + playButton.IsVisible = () => isVideoLoaded ? player.Paused : !animateFrames; } var pauseButton = panel.GetOrNull("BUTTON_PAUSE"); if (pauseButton != null) { - pauseButton.OnClick = () => animateFrames = false; - pauseButton.IsVisible = () => animateFrames; + pauseButton.OnClick = () => + { + if (isVideoLoaded) + player.Pause(); + else + animateFrames = false; + }; + + pauseButton.IsVisible = () => isVideoLoaded ? !player.Paused : animateFrames; } var stopButton = panel.GetOrNull("BUTTON_STOP"); @@ -134,19 +169,40 @@ namespace OpenRA.Mods.Common.Widgets.Logic { stopButton.OnClick = () => { - frameSlider.Value = 0; - currentFrame = 0; - animateFrames = false; + if (isVideoLoaded) + player.Stop(); + else + { + frameSlider.Value = 0; + currentFrame = 0; + animateFrames = false; + } }; } var nextButton = panel.GetOrNull("BUTTON_NEXT"); if (nextButton != null) - nextButton.OnClick = SelectNextFrame; + { + nextButton.OnClick = () => + { + if (!isVideoLoaded) + nextButton.OnClick = SelectNextFrame; + }; + + nextButton.IsVisible = () => !isVideoLoaded; + } var prevButton = panel.GetOrNull("BUTTON_PREV"); if (prevButton != null) - prevButton.OnClick = SelectPreviousFrame; + { + prevButton.OnClick = () => + { + if (!isVideoLoaded) + SelectPreviousFrame(); + }; + + prevButton.IsVisible = () => !isVideoLoaded; + } assetList = panel.Get("ASSET_LIST"); template = panel.Get("ASSET_TEMPLATE"); @@ -154,7 +210,13 @@ namespace OpenRA.Mods.Common.Widgets.Logic var closeButton = panel.GetOrNull("CLOSE_BUTTON"); if (closeButton != null) - closeButton.OnClick = () => { Ui.CloseWindow(); onExit(); }; + closeButton.OnClick = () => + { + if (isVideoLoaded) + player.Stop(); + Ui.CloseWindow(); + onExit(); + }; } void SelectNextFrame() @@ -221,17 +283,36 @@ namespace OpenRA.Mods.Common.Widgets.Logic bool LoadAsset(string filename) { + if (isVideoLoaded) + { + player.Stop(); + player = null; + isVideoLoaded = false; + } + if (string.IsNullOrEmpty(filename)) return false; if (!GlobalFileSystem.Exists(filename)) return false; - currentFilename = filename; - currentSprites = world.Map.SequenceProvider.SpriteLoader.LoadAllSprites(filename); - currentFrame = 0; - frameSlider.MaximumValue = (float)currentSprites.Length - 1; - frameSlider.Ticks = currentSprites.Length; + if (Path.GetExtension(filename) == ".vqa") + { + player = panel.Get("PLAYER"); + currentFilename = filename; + player.Load(filename); + isVideoLoaded = true; + frameSlider.MaximumValue = (float)player.Video.Frames - 1; + frameSlider.Ticks = 0; + } + else + { + currentFilename = filename; + currentSprites = world.Map.SequenceProvider.SpriteLoader.LoadAllSprites(filename); + currentFrame = 0; + frameSlider.MaximumValue = (float)currentSprites.Length - 1; + frameSlider.Ticks = currentSprites.Length; + } return true; } diff --git a/mods/cnc/chrome/assetbrowser.yaml b/mods/cnc/chrome/assetbrowser.yaml index 07254566b5..5978575875 100644 --- a/mods/cnc/chrome/assetbrowser.yaml +++ b/mods/cnc/chrome/assetbrowser.yaml @@ -100,6 +100,9 @@ Container@ASSETBROWSER_PANEL: Sprite@SPRITE: Width: PARENT_RIGHT Height: PARENT_BOTTOM + VqaPlayer@PLAYER: + Width: PARENT_RIGHT + Height: PARENT_BOTTOM Container@FRAME_SELECTOR: X: 190 Y: 395 diff --git a/mods/ra/chrome/assetbrowser.yaml b/mods/ra/chrome/assetbrowser.yaml index bf6734f644..a211ead23f 100644 --- a/mods/ra/chrome/assetbrowser.yaml +++ b/mods/ra/chrome/assetbrowser.yaml @@ -95,6 +95,9 @@ Background@ASSETBROWSER_PANEL: Sprite@SPRITE: Width: PARENT_RIGHT Height: PARENT_BOTTOM + VqaPlayer@PLAYER: + Width: PARENT_RIGHT + Height: PARENT_BOTTOM Container@FRAME_SELECTOR: X: 190 Y: 425