From 44c01bbaa2338b9ffd0777d14f6e313a6394619b Mon Sep 17 00:00:00 2001 From: Pavlos Touboulidis Date: Sat, 10 May 2014 17:25:07 +0300 Subject: [PATCH] Remove TileSetData and separate TileSet from Sequences --- OpenRA.Game/GameRules/RulesetCache.cs | 14 +++++++++++--- OpenRA.Game/Graphics/SequenceProvider.cs | 14 +++++++++----- OpenRA.Game/Map/Map.cs | 3 +-- OpenRA.Game/Map/Ruleset.cs | 6 +++++- OpenRA.Game/Map/TileSet.cs | 19 ------------------- OpenRA.Mods.RA/ShroudRenderer.cs | 2 +- .../Widgets/Logic/AssetBrowserLogic.cs | 2 +- 7 files changed, 28 insertions(+), 32 deletions(-) diff --git a/OpenRA.Game/GameRules/RulesetCache.cs b/OpenRA.Game/GameRules/RulesetCache.cs index 8d35b3de03..21b9609aef 100755 --- a/OpenRA.Game/GameRules/RulesetCache.cs +++ b/OpenRA.Game/GameRules/RulesetCache.cs @@ -13,6 +13,7 @@ using System.Collections.Generic; using System.Linq; using OpenRA.FileFormats; using OpenRA.GameRules; +using OpenRA.Graphics; using OpenRA.Support; namespace OpenRA @@ -28,6 +29,7 @@ namespace OpenRA readonly Dictionary musicCache = new Dictionary(); readonly Dictionary movieCache = new Dictionary(); readonly Dictionary tileSetCache = new Dictionary(); + readonly Dictionary sequenceCaches = new Dictionary(); public Action OnProgress = () => { if (Game.modData != null && Game.modData.LoadScreen != null) Game.modData.LoadScreen.Display(); }; @@ -73,10 +75,12 @@ namespace OpenRA movies = LoadYamlRules(movieCache, m.Movies, new List(), (k, v) => k.Value.Value); OnProgress(); using (new PerfTimer("TileSets")) - tileSets = LoadTileSets(tileSetCache, m.TileSets); + tileSets = LoadTileSets(tileSetCache, sequenceCaches, m.TileSets); + + var sequences = sequenceCaches.ToDictionary((kvp) => kvp.Key, (kvp) => new SequenceProvider(kvp.Value, map)); OnProgress(); - return new Ruleset(actors, weapons, voices, notifications, music, movies, tileSets); + return new Ruleset(actors, weapons, voices, notifications, music, movies, tileSets, sequences); } Dictionary LoadYamlRules( @@ -108,7 +112,7 @@ namespace OpenRA return itemSet; } - Dictionary LoadTileSets(Dictionary itemCache, string[] files) + Dictionary LoadTileSets(Dictionary itemCache, Dictionary sequenceCaches, string[] files) { var items = new Dictionary(); @@ -124,6 +128,10 @@ namespace OpenRA t = new TileSet(modData, file); itemCache.Add(file, t); + // every time we load a tile set, we create a sequence cache for it + var sc = new SequenceCache(modData, t); + sequenceCaches.Add(t.Id, sc); + items.Add(t.Id, t); } } diff --git a/OpenRA.Game/Graphics/SequenceProvider.cs b/OpenRA.Game/Graphics/SequenceProvider.cs index ddbe2541bd..7679222c49 100644 --- a/OpenRA.Game/Graphics/SequenceProvider.cs +++ b/OpenRA.Game/Graphics/SequenceProvider.cs @@ -20,10 +20,12 @@ namespace OpenRA.Graphics public class SequenceProvider { readonly Lazy>>> sequences; + public readonly SpriteLoader SpriteLoader; - public SequenceProvider(Map map) + public SequenceProvider(SequenceCache cache, Map map) { - this.sequences = Exts.Lazy(() => map.Rules.TileSets[map.Tileset].Data.SequenceCache.LoadSequences(map)); + this.sequences = Exts.Lazy(() => cache.LoadSequences(map)); + this.SpriteLoader = cache.SpriteLoader; } public Sequence GetSequence(string unitName, string sequenceName) @@ -61,7 +63,8 @@ namespace OpenRA.Graphics public class SequenceCache { readonly ModData modData; - readonly TileSet tileSet; + readonly Lazy spriteLoader; + public SpriteLoader SpriteLoader { get { return spriteLoader.Value; } } readonly Dictionary>> sequenceCache = new Dictionary>>(); @@ -70,7 +73,8 @@ namespace OpenRA.Graphics public SequenceCache(ModData modData, TileSet tileSet) { this.modData = modData; - this.tileSet = tileSet; + + spriteLoader = Exts.Lazy(() => new SpriteLoader(tileSet.Extensions, new SheetBuilder(SheetType.Indexed))); } public IReadOnlyDictionary>> LoadSequences(Map map) @@ -103,7 +107,7 @@ namespace OpenRA.Graphics { t = Exts.Lazy(() => (IReadOnlyDictionary)new ReadOnlyDictionary( node.Value.NodesDict.ToDictionary(x => x.Key, x => - new Sequence(tileSet.Data.SpriteLoader, node.Key, x.Key, x.Value)))); + new Sequence(spriteLoader.Value, node.Key, x.Key, x.Value)))); sequenceCache.Add(key, t); items.Add(node.Key, t); } diff --git a/OpenRA.Game/Map/Map.cs b/OpenRA.Game/Map/Map.cs index 32934f274b..b88c288b52 100644 --- a/OpenRA.Game/Map/Map.cs +++ b/OpenRA.Game/Map/Map.cs @@ -113,7 +113,7 @@ namespace OpenRA [FieldLoader.Ignore] Lazy rules; public Ruleset Rules { get { return rules != null ? rules.Value : null; } } - public SequenceProvider SequenceProvider { get; private set; } + public SequenceProvider SequenceProvider { get { return Rules.Sequences[Tileset]; } } public static Map FromTileset(TileSet tileset) { @@ -246,7 +246,6 @@ namespace OpenRA void PostInit() { rules = Exts.Lazy(() => Game.modData.RulesetCache.LoadMapRules(this)); - SequenceProvider = new SequenceProvider(this); } public Ruleset PreloadRules() diff --git a/OpenRA.Game/Map/Ruleset.cs b/OpenRA.Game/Map/Ruleset.cs index 117a07ee59..576b5cd54c 100644 --- a/OpenRA.Game/Map/Ruleset.cs +++ b/OpenRA.Game/Map/Ruleset.cs @@ -12,6 +12,7 @@ using System; using System.Collections.Generic; using System.Linq; using OpenRA.GameRules; +using OpenRA.Graphics; namespace OpenRA { @@ -24,6 +25,7 @@ namespace OpenRA public readonly IReadOnlyDictionary Music; public readonly IReadOnlyDictionary Movies; public readonly IReadOnlyDictionary TileSets; + public readonly IReadOnlyDictionary Sequences; public Ruleset( IDictionary actors, @@ -32,7 +34,8 @@ namespace OpenRA IDictionary notifications, IDictionary music, IDictionary movies, - IDictionary tileSets) + IDictionary tileSets, + IDictionary sequences) { this.Actors = new ReadOnlyDictionary(actors); this.Weapons = new ReadOnlyDictionary(weapons); @@ -41,6 +44,7 @@ namespace OpenRA this.Music = new ReadOnlyDictionary(music); this.Movies = new ReadOnlyDictionary(movies); this.TileSets = new ReadOnlyDictionary(tileSets); + this.Sequences = new ReadOnlyDictionary(sequences); } public IEnumerable> InstalledMusic { get { return Music.Where(m => m.Value.Exists); } } diff --git a/OpenRA.Game/Map/TileSet.cs b/OpenRA.Game/Map/TileSet.cs index d84772a375..cba1a61f68 100644 --- a/OpenRA.Game/Map/TileSet.cs +++ b/OpenRA.Game/Map/TileSet.cs @@ -82,20 +82,6 @@ namespace OpenRA } } - public class TileSetData - { - Lazy spriteLoader; - public SpriteLoader SpriteLoader { get { return spriteLoader.Value; } } - - public readonly SequenceCache SequenceCache; - - public TileSetData(ModData modData, TileSet tileSet) - { - spriteLoader = Exts.Lazy(() => new SpriteLoader(tileSet.Extensions, new SheetBuilder(SheetType.Indexed))); - SequenceCache = new SequenceCache(modData, tileSet); - } - } - public class TileSet { public readonly string Name; @@ -111,9 +97,6 @@ namespace OpenRA static readonly string[] Fields = { "Name", "Id", "SheetSize", "Palette", "Extensions" }; - [FieldLoader.IgnoreAttribute] - public readonly TileSetData Data; - public TileSet(ModData modData, string filepath) { var yaml = MiniYaml.DictFromFile(filepath); @@ -128,8 +111,6 @@ namespace OpenRA // Templates Templates = yaml["Templates"].NodesDict.Values .Select(y => new TileTemplate(y)).ToDictionary(t => t.Id); - - Data = new TileSetData(modData, this); } public TileSet(string name, string id, string palette, string[] extensions) diff --git a/OpenRA.Mods.RA/ShroudRenderer.cs b/OpenRA.Mods.RA/ShroudRenderer.cs index 8c3e62879f..41a75ef5fe 100644 --- a/OpenRA.Mods.RA/ShroudRenderer.cs +++ b/OpenRA.Mods.RA/ShroudRenderer.cs @@ -95,7 +95,7 @@ namespace OpenRA.Mods.RA { var ts = Game.modData.Manifest.TileSize; var data = Exts.MakeArray(ts.Width * ts.Height, _ => (byte)info.ShroudColor); - var s = map.Rules.TileSets[map.Tileset].Data.SpriteLoader.SheetBuilder.Add(data, ts); + var s = map.SequenceProvider.SpriteLoader.SheetBuilder.Add(data, ts); unexploredTile = new Sprite(s.sheet, s.bounds, s.offset, s.channel, info.ShroudBlend); } else diff --git a/OpenRA.Mods.RA/Widgets/Logic/AssetBrowserLogic.cs b/OpenRA.Mods.RA/Widgets/Logic/AssetBrowserLogic.cs index e3f804b82b..28e73de342 100644 --- a/OpenRA.Mods.RA/Widgets/Logic/AssetBrowserLogic.cs +++ b/OpenRA.Mods.RA/Widgets/Logic/AssetBrowserLogic.cs @@ -196,7 +196,7 @@ namespace OpenRA.Mods.RA.Widgets.Logic return false; currentFilename = filename; - currentSprites = world.Map.Rules.TileSets[world.Map.Tileset].Data.SpriteLoader.LoadAllSprites(filename); + currentSprites = world.Map.SequenceProvider.SpriteLoader.LoadAllSprites(filename); currentFrame = 0; frameSlider.MaximumValue = (float)currentSprites.Length - 1; frameSlider.Ticks = currentSprites.Length;