Remove TileSetData and separate TileSet from Sequences

This commit is contained in:
Pavlos Touboulidis
2014-05-10 17:25:07 +03:00
parent 750fc4e02c
commit 44c01bbaa2
7 changed files with 28 additions and 32 deletions

View File

@@ -13,6 +13,7 @@ using System.Collections.Generic;
using System.Linq; using System.Linq;
using OpenRA.FileFormats; using OpenRA.FileFormats;
using OpenRA.GameRules; using OpenRA.GameRules;
using OpenRA.Graphics;
using OpenRA.Support; using OpenRA.Support;
namespace OpenRA namespace OpenRA
@@ -28,6 +29,7 @@ namespace OpenRA
readonly Dictionary<string, MusicInfo> musicCache = new Dictionary<string, MusicInfo>(); readonly Dictionary<string, MusicInfo> musicCache = new Dictionary<string, MusicInfo>();
readonly Dictionary<string, string> movieCache = new Dictionary<string, string>(); readonly Dictionary<string, string> movieCache = new Dictionary<string, string>();
readonly Dictionary<string, TileSet> tileSetCache = new Dictionary<string, TileSet>(); readonly Dictionary<string, TileSet> tileSetCache = new Dictionary<string, TileSet>();
readonly Dictionary<string, SequenceCache> sequenceCaches = new Dictionary<string, SequenceCache>();
public Action OnProgress = () => { if (Game.modData != null && Game.modData.LoadScreen != null) Game.modData.LoadScreen.Display(); }; 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<MiniYamlNode>(), (k, v) => k.Value.Value); movies = LoadYamlRules(movieCache, m.Movies, new List<MiniYamlNode>(), (k, v) => k.Value.Value);
OnProgress(); OnProgress();
using (new PerfTimer("TileSets")) 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(); OnProgress();
return new Ruleset(actors, weapons, voices, notifications, music, movies, tileSets); return new Ruleset(actors, weapons, voices, notifications, music, movies, tileSets, sequences);
} }
Dictionary<string, T> LoadYamlRules<T>( Dictionary<string, T> LoadYamlRules<T>(
@@ -108,7 +112,7 @@ namespace OpenRA
return itemSet; return itemSet;
} }
Dictionary<string, TileSet> LoadTileSets(Dictionary<string, TileSet> itemCache, string[] files) Dictionary<string, TileSet> LoadTileSets(Dictionary<string, TileSet> itemCache, Dictionary<string, SequenceCache> sequenceCaches, string[] files)
{ {
var items = new Dictionary<string, TileSet>(); var items = new Dictionary<string, TileSet>();
@@ -124,6 +128,10 @@ namespace OpenRA
t = new TileSet(modData, file); t = new TileSet(modData, file);
itemCache.Add(file, t); 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); items.Add(t.Id, t);
} }
} }

View File

@@ -20,10 +20,12 @@ namespace OpenRA.Graphics
public class SequenceProvider public class SequenceProvider
{ {
readonly Lazy<IReadOnlyDictionary<string, Lazy<IReadOnlyDictionary<string, Sequence>>>> sequences; readonly Lazy<IReadOnlyDictionary<string, Lazy<IReadOnlyDictionary<string, Sequence>>>> 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) public Sequence GetSequence(string unitName, string sequenceName)
@@ -61,7 +63,8 @@ namespace OpenRA.Graphics
public class SequenceCache public class SequenceCache
{ {
readonly ModData modData; readonly ModData modData;
readonly TileSet tileSet; readonly Lazy<SpriteLoader> spriteLoader;
public SpriteLoader SpriteLoader { get { return spriteLoader.Value; } }
readonly Dictionary<string, Lazy<IReadOnlyDictionary<string, Sequence>>> sequenceCache = new Dictionary<string, Lazy<IReadOnlyDictionary<string, Sequence>>>(); readonly Dictionary<string, Lazy<IReadOnlyDictionary<string, Sequence>>> sequenceCache = new Dictionary<string, Lazy<IReadOnlyDictionary<string, Sequence>>>();
@@ -70,7 +73,8 @@ namespace OpenRA.Graphics
public SequenceCache(ModData modData, TileSet tileSet) public SequenceCache(ModData modData, TileSet tileSet)
{ {
this.modData = modData; this.modData = modData;
this.tileSet = tileSet;
spriteLoader = Exts.Lazy(() => new SpriteLoader(tileSet.Extensions, new SheetBuilder(SheetType.Indexed)));
} }
public IReadOnlyDictionary<string, Lazy<IReadOnlyDictionary<string, Sequence>>> LoadSequences(Map map) public IReadOnlyDictionary<string, Lazy<IReadOnlyDictionary<string, Sequence>>> LoadSequences(Map map)
@@ -103,7 +107,7 @@ namespace OpenRA.Graphics
{ {
t = Exts.Lazy(() => (IReadOnlyDictionary<string, Sequence>)new ReadOnlyDictionary<string, Sequence>( t = Exts.Lazy(() => (IReadOnlyDictionary<string, Sequence>)new ReadOnlyDictionary<string, Sequence>(
node.Value.NodesDict.ToDictionary(x => x.Key, x => 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); sequenceCache.Add(key, t);
items.Add(node.Key, t); items.Add(node.Key, t);
} }

View File

@@ -113,7 +113,7 @@ namespace OpenRA
[FieldLoader.Ignore] Lazy<Ruleset> rules; [FieldLoader.Ignore] Lazy<Ruleset> rules;
public Ruleset Rules { get { return rules != null ? rules.Value : null; } } 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) public static Map FromTileset(TileSet tileset)
{ {
@@ -246,7 +246,6 @@ namespace OpenRA
void PostInit() void PostInit()
{ {
rules = Exts.Lazy(() => Game.modData.RulesetCache.LoadMapRules(this)); rules = Exts.Lazy(() => Game.modData.RulesetCache.LoadMapRules(this));
SequenceProvider = new SequenceProvider(this);
} }
public Ruleset PreloadRules() public Ruleset PreloadRules()

View File

@@ -12,6 +12,7 @@ using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
using OpenRA.GameRules; using OpenRA.GameRules;
using OpenRA.Graphics;
namespace OpenRA namespace OpenRA
{ {
@@ -24,6 +25,7 @@ namespace OpenRA
public readonly IReadOnlyDictionary<string, MusicInfo> Music; public readonly IReadOnlyDictionary<string, MusicInfo> Music;
public readonly IReadOnlyDictionary<string, string> Movies; public readonly IReadOnlyDictionary<string, string> Movies;
public readonly IReadOnlyDictionary<string, TileSet> TileSets; public readonly IReadOnlyDictionary<string, TileSet> TileSets;
public readonly IReadOnlyDictionary<string, SequenceProvider> Sequences;
public Ruleset( public Ruleset(
IDictionary<string, ActorInfo> actors, IDictionary<string, ActorInfo> actors,
@@ -32,7 +34,8 @@ namespace OpenRA
IDictionary<string, SoundInfo> notifications, IDictionary<string, SoundInfo> notifications,
IDictionary<string, MusicInfo> music, IDictionary<string, MusicInfo> music,
IDictionary<string, string> movies, IDictionary<string, string> movies,
IDictionary<string, TileSet> tileSets) IDictionary<string, TileSet> tileSets,
IDictionary<string, SequenceProvider> sequences)
{ {
this.Actors = new ReadOnlyDictionary<string, ActorInfo>(actors); this.Actors = new ReadOnlyDictionary<string, ActorInfo>(actors);
this.Weapons = new ReadOnlyDictionary<string, WeaponInfo>(weapons); this.Weapons = new ReadOnlyDictionary<string, WeaponInfo>(weapons);
@@ -41,6 +44,7 @@ namespace OpenRA
this.Music = new ReadOnlyDictionary<string, MusicInfo>(music); this.Music = new ReadOnlyDictionary<string, MusicInfo>(music);
this.Movies = new ReadOnlyDictionary<string, string>(movies); this.Movies = new ReadOnlyDictionary<string, string>(movies);
this.TileSets = new ReadOnlyDictionary<string, TileSet>(tileSets); this.TileSets = new ReadOnlyDictionary<string, TileSet>(tileSets);
this.Sequences = new ReadOnlyDictionary<string, SequenceProvider>(sequences);
} }
public IEnumerable<KeyValuePair<string, MusicInfo>> InstalledMusic { get { return Music.Where(m => m.Value.Exists); } } public IEnumerable<KeyValuePair<string, MusicInfo>> InstalledMusic { get { return Music.Where(m => m.Value.Exists); } }

View File

@@ -82,20 +82,6 @@ namespace OpenRA
} }
} }
public class TileSetData
{
Lazy<SpriteLoader> 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 class TileSet
{ {
public readonly string Name; public readonly string Name;
@@ -111,9 +97,6 @@ namespace OpenRA
static readonly string[] Fields = { "Name", "Id", "SheetSize", "Palette", "Extensions" }; static readonly string[] Fields = { "Name", "Id", "SheetSize", "Palette", "Extensions" };
[FieldLoader.IgnoreAttribute]
public readonly TileSetData Data;
public TileSet(ModData modData, string filepath) public TileSet(ModData modData, string filepath)
{ {
var yaml = MiniYaml.DictFromFile(filepath); var yaml = MiniYaml.DictFromFile(filepath);
@@ -128,8 +111,6 @@ namespace OpenRA
// Templates // Templates
Templates = yaml["Templates"].NodesDict.Values Templates = yaml["Templates"].NodesDict.Values
.Select(y => new TileTemplate(y)).ToDictionary(t => t.Id); .Select(y => new TileTemplate(y)).ToDictionary(t => t.Id);
Data = new TileSetData(modData, this);
} }
public TileSet(string name, string id, string palette, string[] extensions) public TileSet(string name, string id, string palette, string[] extensions)

View File

@@ -95,7 +95,7 @@ namespace OpenRA.Mods.RA
{ {
var ts = Game.modData.Manifest.TileSize; var ts = Game.modData.Manifest.TileSize;
var data = Exts.MakeArray<byte>(ts.Width * ts.Height, _ => (byte)info.ShroudColor); var data = Exts.MakeArray<byte>(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); unexploredTile = new Sprite(s.sheet, s.bounds, s.offset, s.channel, info.ShroudBlend);
} }
else else

View File

@@ -196,7 +196,7 @@ namespace OpenRA.Mods.RA.Widgets.Logic
return false; return false;
currentFilename = filename; currentFilename = filename;
currentSprites = world.Map.Rules.TileSets[world.Map.Tileset].Data.SpriteLoader.LoadAllSprites(filename); currentSprites = world.Map.SequenceProvider.SpriteLoader.LoadAllSprites(filename);
currentFrame = 0; currentFrame = 0;
frameSlider.MaximumValue = (float)currentSprites.Length - 1; frameSlider.MaximumValue = (float)currentSprites.Length - 1;
frameSlider.Ticks = currentSprites.Length; frameSlider.Ticks = currentSprites.Length;