From a058b1f5bd49698fd4589854eb57f2e34475ee2b Mon Sep 17 00:00:00 2001 From: penev92 Date: Mon, 26 Jul 2021 00:25:20 +0300 Subject: [PATCH] Split AssetBrowser supported formats Splitting them from one array into separate allows us to then reliably pick how each asset should be presented. Also lets us unhardcode some checks like "if file is .vxl ... else is sprite". --- OpenRA.Mods.Common/AssetBrowser.cs | 5 +- .../Widgets/Logic/AssetBrowserLogic.cs | 63 +++++++++++-------- mods/cnc/mod.yaml | 3 +- mods/d2k/mod.yaml | 3 +- mods/ra/mod.yaml | 3 +- mods/ts/mod.yaml | 4 +- 6 files changed, 50 insertions(+), 31 deletions(-) diff --git a/OpenRA.Mods.Common/AssetBrowser.cs b/OpenRA.Mods.Common/AssetBrowser.cs index 38fa92f091..47debd7282 100644 --- a/OpenRA.Mods.Common/AssetBrowser.cs +++ b/OpenRA.Mods.Common/AssetBrowser.cs @@ -15,7 +15,8 @@ namespace OpenRA { public class AssetBrowser : IGlobalModData { - [FieldLoader.Require] - public readonly string[] SupportedExtensions = Array.Empty(); + public readonly string[] SpriteExtensions = Array.Empty(); + public readonly string[] ModelExtensions = Array.Empty(); + public readonly string[] VideoExtensions = Array.Empty(); } } diff --git a/OpenRA.Mods.Common/Widgets/Logic/AssetBrowserLogic.cs b/OpenRA.Mods.Common/Widgets/Logic/AssetBrowserLogic.cs index a4c5151d4c..5faf1e8396 100644 --- a/OpenRA.Mods.Common/Widgets/Logic/AssetBrowserLogic.cs +++ b/OpenRA.Mods.Common/Widgets/Logic/AssetBrowserLogic.cs @@ -25,6 +25,9 @@ namespace OpenRA.Mods.Common.Widgets.Logic public class AssetBrowserLogic : ChromeLogic { readonly string[] allowedExtensions; + readonly string[] allowedSpriteExtensions; + readonly string[] allowedModelExtensions; + readonly string[] allowedVideoExtensions; readonly IEnumerable acceptablePackages; readonly string[] palettes; readonly World world; @@ -283,7 +286,13 @@ namespace OpenRA.Mods.Common.Widgets.Logic } var assetBrowserModData = modData.Manifest.Get(); - allowedExtensions = assetBrowserModData.SupportedExtensions; + allowedSpriteExtensions = assetBrowserModData.SpriteExtensions; + allowedModelExtensions = assetBrowserModData.ModelExtensions; + allowedVideoExtensions = assetBrowserModData.VideoExtensions; + allowedExtensions = allowedSpriteExtensions + .Union(allowedModelExtensions) + .Union(allowedVideoExtensions) + .ToArray(); acceptablePackages = modData.ModFiles.MountedPackages.Where(p => p.Contents.Any(c => allowedExtensions.Contains(Path.GetExtension(c).ToLowerInvariant()))); @@ -397,30 +406,8 @@ namespace OpenRA.Mods.Common.Widgets.Logic prefix += "|"; } - var video = VideoLoader.GetVideo(Game.ModData.DefaultFileSystem.Open(filename), Game.ModData.VideoLoaders); - if (video != null) - { - player = panel.Get("PLAYER"); - player.Load(prefix + filename); - player.DrawOverlay = false; - isVideoLoaded = true; - - if (frameSlider != null) - { - frameSlider.MaximumValue = (float)player.Video.Frames - 1; - frameSlider.Ticks = 0; - } - - return true; - } - - if (Path.GetExtension(filename.ToLowerInvariant()) == ".vxl") - { - var voxelName = Path.GetFileNameWithoutExtension(filename); - currentVoxel = world.ModelCache.GetModel(voxelName); - currentSprites = null; - } - else + var fileExtension = Path.GetExtension(filename.ToLowerInvariant()); + if (allowedSpriteExtensions.Contains(fileExtension)) { currentSprites = world.Map.Rules.Sequences.SpriteCache[prefix + filename]; currentFrame = 0; @@ -433,6 +420,32 @@ namespace OpenRA.Mods.Common.Widgets.Logic currentVoxel = null; } + else if (allowedModelExtensions.Contains(fileExtension)) + { + var voxelName = Path.GetFileNameWithoutExtension(filename); + currentVoxel = world.ModelCache.GetModel(voxelName); + currentSprites = null; + } + else if (allowedVideoExtensions.Contains(fileExtension)) + { + var video = VideoLoader.GetVideo(Game.ModData.DefaultFileSystem.Open(filename), Game.ModData.VideoLoaders); + if (video != null) + { + + player = panel.Get("PLAYER"); + player.Load(prefix + filename); + player.DrawOverlay = false; + isVideoLoaded = true; + + if (frameSlider != null) + { + frameSlider.MaximumValue = (float)player.Video.Frames - 1; + frameSlider.Ticks = 0; + } + } + } + else + return false; } catch (Exception ex) { diff --git a/mods/cnc/mod.yaml b/mods/cnc/mod.yaml index 02050f693c..cbcb9839e1 100644 --- a/mods/cnc/mod.yaml +++ b/mods/cnc/mod.yaml @@ -239,7 +239,8 @@ SpriteSequenceFormat: ClassicTilesetSpecificSpriteSequence ModelSequenceFormat: PlaceholderModelSequence AssetBrowser: - SupportedExtensions: .shp, .tem, .des, .sno, .jun, .vqa, .wsa + SpriteExtensions: .shp, .tem, .des, .sno, .jun + VideoExtensions: .vqa, .wsa GameSpeeds: DefaultSpeed: default diff --git a/mods/d2k/mod.yaml b/mods/d2k/mod.yaml index f97780903e..5a3923451b 100644 --- a/mods/d2k/mod.yaml +++ b/mods/d2k/mod.yaml @@ -214,7 +214,8 @@ SpriteSequenceFormat: DefaultSpriteSequence ModelSequenceFormat: PlaceholderModelSequence AssetBrowser: - SupportedExtensions: .shp, .r8, .vqa + SpriteExtensions: .shp, .r8 + VideoExtensions: .vqa GameSpeeds: DefaultSpeed: default diff --git a/mods/ra/mod.yaml b/mods/ra/mod.yaml index 5529da8680..d2ed4e56e8 100644 --- a/mods/ra/mod.yaml +++ b/mods/ra/mod.yaml @@ -244,7 +244,8 @@ SpriteSequenceFormat: ClassicTilesetSpecificSpriteSequence ModelSequenceFormat: PlaceholderModelSequence AssetBrowser: - SupportedExtensions: .shp, .tmp, .tem, .des, .sno, .int, .vqa, .wsa + SpriteExtensions: .shp, .tmp, .tem, .des, .sno, .int + VideoExtensions: .vqa, .wsa GameSpeeds: DefaultSpeed: default diff --git a/mods/ts/mod.yaml b/mods/ts/mod.yaml index 94db110b96..66b95d25ca 100644 --- a/mods/ts/mod.yaml +++ b/mods/ts/mod.yaml @@ -272,7 +272,9 @@ SpriteSequenceFormat: TilesetSpecificSpriteSequence ModelSequenceFormat: VoxelModelSequence AssetBrowser: - SupportedExtensions: .shp, .tem, .sno, .vqa, .vxl + SpriteExtensions: .shp, .tem, .sno + ModelExtensions: .vxl + VideoExtensions: .vqa GameSpeeds: DefaultSpeed: default