Use PaletteReferences everywhere.

This commit is contained in:
Paul Chote
2013-06-13 00:07:47 +12:00
parent e5bcb88b0e
commit 7beef85a64
14 changed files with 56 additions and 42 deletions

View File

@@ -20,12 +20,23 @@ namespace OpenRA.Graphics
{ {
public static class CursorProvider public static class CursorProvider
{ {
static HardwarePalette Palette; static HardwarePalette palette;
static Dictionary<string, CursorSequence> cursors; static Dictionary<string, CursorSequence> cursors;
static Cache<string, PaletteReference> palettes;
static PaletteReference CreatePaletteReference(string name)
{
var pal = palette.GetPalette(name);
if (pal == null)
throw new InvalidOperationException("Palette `{0}` does not exist".F(name));
return new PaletteReference(name, palette.GetPaletteIndex(name), pal);
}
public static void Initialize(string[] sequenceFiles) public static void Initialize(string[] sequenceFiles)
{ {
cursors = new Dictionary<string, CursorSequence>(); cursors = new Dictionary<string, CursorSequence>();
palettes = new Cache<string, PaletteReference>(CreatePaletteReference);
var sequences = new MiniYaml(null, sequenceFiles.Select(s => MiniYaml.FromFile(s)).Aggregate(MiniYaml.MergeLiberal)); var sequences = new MiniYaml(null, sequenceFiles.Select(s => MiniYaml.FromFile(s)).Aggregate(MiniYaml.MergeLiberal));
int[] ShadowIndex = { }; int[] ShadowIndex = { };
@@ -35,14 +46,14 @@ namespace OpenRA.Graphics
int.TryParse(sequences.NodesDict["ShadowIndex"].Value, out ShadowIndex[ShadowIndex.Length - 1]); int.TryParse(sequences.NodesDict["ShadowIndex"].Value, out ShadowIndex[ShadowIndex.Length - 1]);
} }
Palette = new HardwarePalette(); palette = new HardwarePalette();
foreach (var p in sequences.NodesDict["Palettes"].Nodes) foreach (var p in sequences.NodesDict["Palettes"].Nodes)
Palette.AddPalette(p.Key, new Palette(FileSystem.Open(p.Value.Value), ShadowIndex), false); palette.AddPalette(p.Key, new Palette(FileSystem.Open(p.Value.Value), ShadowIndex), false);
foreach (var s in sequences.NodesDict["Cursors"].Nodes) foreach (var s in sequences.NodesDict["Cursors"].Nodes)
LoadSequencesForCursor(s.Key, s.Value); LoadSequencesForCursor(s.Key, s.Value);
Palette.Initialize(); palette.Initialize();
} }
static void LoadSequencesForCursor(string cursorSrc, MiniYaml cursor) static void LoadSequencesForCursor(string cursorSrc, MiniYaml cursor)
@@ -63,10 +74,10 @@ namespace OpenRA.Graphics
var cursorSequence = GetCursorSequence(cursorName); var cursorSequence = GetCursorSequence(cursorName);
var cursorSprite = cursorSequence.GetSprite(cursorFrame); var cursorSprite = cursorSequence.GetSprite(cursorFrame);
renderer.SetPalette(Palette); renderer.SetPalette(palette);
renderer.SpriteRenderer.DrawSprite(cursorSprite, renderer.SpriteRenderer.DrawSprite(cursorSprite,
lastMousePos - cursorSequence.Hotspot, lastMousePos - cursorSequence.Hotspot,
Palette.GetPaletteIndex(cursorSequence.Palette), palettes[cursorSequence.Palette],
cursorSprite.size); cursorSprite.size);
} }

View File

@@ -82,7 +82,7 @@ namespace OpenRA.Graphics
public void Render(WorldRenderer wr) public void Render(WorldRenderer wr)
{ {
sprite.DrawAt(wr.ScreenPxPosition(pos) - pxCenter, palette.Index, scale); sprite.DrawAt(wr.ScreenPxPosition(pos) - pxCenter, palette, scale);
} }
public void RenderDebugGeometry(WorldRenderer wr) public void RenderDebugGeometry(WorldRenderer wr)

View File

@@ -185,14 +185,14 @@ namespace OpenRA.Graphics
{ {
s[starti, j].DrawAt( s[starti, j].DrawAt(
Game.CellSize * new float2(starti, j), Game.CellSize * new float2(starti, j),
pal.Index, pal,
new float2(Game.CellSize * (i - starti), Game.CellSize)); new float2(Game.CellSize * (i - starti), Game.CellSize));
starti = i + 1; starti = i + 1;
} }
s[i, j].DrawAt( s[i, j].DrawAt(
Game.CellSize * new float2(i, j), Game.CellSize * new float2(i, j),
pal.Index); pal);
starti = i + 1; starti = i + 1;
last = s[i, j]; last = s[i, j];
} }
@@ -200,7 +200,7 @@ namespace OpenRA.Graphics
if (starti < clip.Right) if (starti < clip.Right)
s[starti, j].DrawAt( s[starti, j].DrawAt(
Game.CellSize * new float2(starti, j), Game.CellSize * new float2(starti, j),
pal.Index, pal,
new float2(Game.CellSize * (clip.Right - starti), Game.CellSize)); new float2(Game.CellSize * (clip.Right - starti), Game.CellSize));
} }
} }

View File

@@ -50,24 +50,19 @@ namespace OpenRA.Graphics
return textureCoords[k]; return textureCoords[k];
} }
public void DrawAt(WorldRenderer wr, float2 location, string palette) public void DrawAt(float2 location, PaletteReference pal)
{ {
Game.Renderer.WorldSpriteRenderer.DrawSprite(this, location, wr, palette, size); Game.Renderer.WorldSpriteRenderer.DrawSprite(this, location, pal, size);
} }
public void DrawAt(float2 location, int paletteIndex) public void DrawAt(float2 location, PaletteReference pal, float scale)
{ {
Game.Renderer.WorldSpriteRenderer.DrawSprite(this, location, paletteIndex, size); Game.Renderer.WorldSpriteRenderer.DrawSprite(this, location, pal, size*scale);
} }
public void DrawAt(float2 location, int paletteIndex, float scale) public void DrawAt(float2 location, PaletteReference pal, float2 size)
{ {
Game.Renderer.WorldSpriteRenderer.DrawSprite(this, location, paletteIndex, size*scale); Game.Renderer.WorldSpriteRenderer.DrawSprite(this, location, pal, size);
}
public void DrawAt(float2 location, int paletteIndex, float2 size)
{
Game.Renderer.WorldSpriteRenderer.DrawSprite(this, location, paletteIndex, size);
} }
} }

View File

@@ -45,17 +45,17 @@ namespace OpenRA.Graphics
} }
} }
public void DrawSprite(Sprite s, float2 location, WorldRenderer wr, string palette) public void DrawSprite(Sprite s, float2 location, PaletteReference pal)
{ {
DrawSprite(s, location, wr.Palette(palette).Index, s.size); DrawSprite(s, location, pal.Index, s.size);
} }
public void DrawSprite(Sprite s, float2 location, WorldRenderer wr, string palette, float2 size) public void DrawSprite(Sprite s, float2 location, PaletteReference pal, float2 size)
{ {
DrawSprite(s, location, wr.Palette(palette).Index, size); DrawSprite(s, location, pal.Index, size);
} }
public void DrawSprite(Sprite s, float2 location, int paletteIndex, float2 size) void DrawSprite(Sprite s, float2 location, int paletteIndex, float2 size)
{ {
Renderer.CurrentBatchRenderer = this; Renderer.CurrentBatchRenderer = this;

View File

@@ -51,7 +51,7 @@ namespace OpenRA.Traits
var pipImages = new Animation("pips"); var pipImages = new Animation("pips");
pipImages.PlayFetchIndex("groups", () => (int)group); pipImages.PlayFetchIndex("groups", () => (int)group);
pipImages.Tick(); pipImages.Tick();
pipImages.Image.DrawAt(wr, basePosition + new float2(-8, 1), "chrome"); pipImages.Image.DrawAt(basePosition + new float2(-8, 1), wr.Palette("chrome"));
} }
void DrawPips(WorldRenderer wr, Actor self, float2 basePosition) void DrawPips(WorldRenderer wr, Actor self, float2 basePosition)
@@ -69,6 +69,7 @@ namespace OpenRA.Traits
var pipSize = pipImages.Image.size; var pipSize = pipImages.Image.size;
var pipxyBase = basePosition + new float2(1, -pipSize.Y); var pipxyBase = basePosition + new float2(1, -pipSize.Y);
var pipxyOffset = new float2(0, 0); // Correct for offset due to multiple columns/rows var pipxyOffset = new float2(0, 0); // Correct for offset due to multiple columns/rows
var pal = wr.Palette("chrome");
foreach (var pips in pipSources) foreach (var pips in pipSources)
{ {
@@ -86,7 +87,7 @@ namespace OpenRA.Traits
pipxyOffset.Y -= pipSize.Y; pipxyOffset.Y -= pipSize.Y;
} }
pipImages.PlayRepeating(pipStrings[(int)pip]); pipImages.PlayRepeating(pipStrings[(int)pip]);
pipImages.Image.DrawAt(wr, pipxyBase + pipxyOffset, "chrome"); pipImages.Image.DrawAt(pipxyBase + pipxyOffset, pal);
pipxyOffset += new float2(pipSize.X, 0); pipxyOffset += new float2(pipSize.X, 0);
} }
@@ -104,7 +105,7 @@ namespace OpenRA.Traits
// If a mod wants to implement a unit with multiple tags, then they are placed on multiple rows // If a mod wants to implement a unit with multiple tags, then they are placed on multiple rows
var tagxyBase = basePosition + new float2(-16, 2); // Correct for the offset in the shp file var tagxyBase = basePosition + new float2(-16, 2); // Correct for the offset in the shp file
var tagxyOffset = new float2(0, 0); // Correct for offset due to multiple rows var tagxyOffset = new float2(0, 0); // Correct for offset due to multiple rows
var pal = wr.Palette("chrome");
foreach (var tags in self.TraitsImplementing<ITags>()) foreach (var tags in self.TraitsImplementing<ITags>())
{ {
foreach (var tag in tags.GetTags()) foreach (var tag in tags.GetTags())
@@ -114,7 +115,7 @@ namespace OpenRA.Traits
var tagImages = new Animation("pips"); var tagImages = new Animation("pips");
tagImages.PlayRepeating(tagStrings[(int)tag]); tagImages.PlayRepeating(tagStrings[(int)tag]);
tagImages.Image.DrawAt(wr, tagxyBase + tagxyOffset, "chrome"); tagImages.Image.DrawAt(tagxyBase + tagxyOffset, pal);
// Increment row // Increment row
tagxyOffset.Y += 8; tagxyOffset.Y += 8;

View File

@@ -47,7 +47,7 @@ namespace OpenRA.Traits
if (c.image != null) if (c.image != null)
c.image[c.density].DrawAt( c.image[c.density].DrawAt(
new CPos(x, y).ToPPos().ToFloat2(), new CPos(x, y).ToPPos().ToFloat2(),
c.type.info.PaletteRef.Index); c.type.info.PaletteRef);
} }
} }

View File

@@ -71,7 +71,7 @@ namespace OpenRA.Widgets
cachedFrame = frame; cachedFrame = frame;
} }
Game.Renderer.SpriteRenderer.DrawSprite(sprite, RenderOrigin, worldRenderer, palette); Game.Renderer.SpriteRenderer.DrawSprite(sprite, RenderOrigin, worldRenderer.Palette(palette));
} }
public int FrameCount public int FrameCount

View File

@@ -31,12 +31,12 @@ namespace OpenRA.Widgets
public static void DrawSHP(Sprite s, float2 pos, WorldRenderer wr) public static void DrawSHP(Sprite s, float2 pos, WorldRenderer wr)
{ {
Game.Renderer.SpriteRenderer.DrawSprite(s,pos, wr, "chrome"); Game.Renderer.SpriteRenderer.DrawSprite(s, pos, wr.Palette("chrome"));
} }
public static void DrawSHP(Sprite s, float2 pos, WorldRenderer wr, float2 size) public static void DrawSHP(Sprite s, float2 pos, WorldRenderer wr, float2 size)
{ {
Game.Renderer.SpriteRenderer.DrawSprite(s, pos, wr, "chrome", size); Game.Renderer.SpriteRenderer.DrawSprite(s, pos, wr.Palette("chrome"), size);
} }
public static void DrawPanel(string collection, Rectangle Bounds) public static void DrawPanel(string collection, Rectangle Bounds)

View File

@@ -73,6 +73,7 @@ namespace OpenRA.Mods.RA.Buildings
public void Render( WorldRenderer wr ) public void Render( WorldRenderer wr )
{ {
var pal = wr.Palette("terrain");
var cliprect = Game.viewport.WorldBounds(world); var cliprect = Game.viewport.WorldBounds(world);
foreach (var kv in tiles) foreach (var kv in tiles)
{ {
@@ -81,7 +82,7 @@ namespace OpenRA.Mods.RA.Buildings
if (world.ShroudObscures(kv.Key)) if (world.ShroudObscures(kv.Key))
continue; continue;
bibSprites[kv.Value.type - 1][kv.Value.index].DrawAt(wr, kv.Key.ToPPos().ToFloat2(), "terrain"); bibSprites[kv.Value.type - 1][kv.Value.index].DrawAt(kv.Key.ToPPos().ToFloat2(), pal);
} }
} }
} }

View File

@@ -108,8 +108,9 @@ namespace OpenRA.Mods.RA.Orders
cells.Add(t, isCloseEnough && world.IsCellBuildable(t, BuildingInfo) && res.GetResource(t) == null); cells.Add(t, isCloseEnough && world.IsCellBuildable(t, BuildingInfo) && res.GetResource(t) == null);
} }
var pal = wr.Palette("terrain");
foreach (var c in cells) foreach (var c in cells)
(c.Value ? buildOk : buildBlocked).DrawAt(wr, c.Key.ToPPos().ToFloat2(), "terrain"); (c.Value ? buildOk : buildBlocked).DrawAt(c.Key.ToPPos().ToFloat2(), pal);
} }
public string GetCursor(World world, CPos xy, MouseInput mi) { return "default"; } public string GetCursor(World world, CPos xy, MouseInput mi) { return "default"; }

View File

@@ -151,8 +151,9 @@ namespace OpenRA.Mods.RA
{ {
var xy = Game.viewport.ViewToWorld(Viewport.LastMousePos); var xy = Game.viewport.ViewToWorld(Viewport.LastMousePos);
var tiles = world.FindTilesInCircle(xy, range); var tiles = world.FindTilesInCircle(xy, range);
var pal = wr.Palette("terrain");
foreach (var t in tiles) foreach (var t in tiles)
tile.DrawAt( wr, t.ToPPos().ToFloat2(), "terrain" ); tile.DrawAt(t.ToPPos().ToFloat2(), pal);
} }
public string GetCursor(World world, CPos xy, MouseInput mi) public string GetCursor(World world, CPos xy, MouseInput mi)
@@ -230,14 +231,15 @@ namespace OpenRA.Mods.RA
public void RenderBeforeWorld(WorldRenderer wr, World world) public void RenderBeforeWorld(WorldRenderer wr, World world)
{ {
var xy = Game.viewport.ViewToWorld(Viewport.LastMousePos); var xy = Game.viewport.ViewToWorld(Viewport.LastMousePos);
var pal = wr.Palette("terrain");
// Source tiles // Source tiles
foreach (var t in world.FindTilesInCircle(sourceLocation, range)) foreach (var t in world.FindTilesInCircle(sourceLocation, range))
sourceTile.DrawAt( wr, t.ToPPos().ToFloat2(), "terrain" ); sourceTile.DrawAt(t.ToPPos().ToFloat2(), pal);
// Destination tiles // Destination tiles
foreach (var t in world.FindTilesInCircle(xy, range)) foreach (var t in world.FindTilesInCircle(xy, range))
sourceTile.DrawAt( wr, t.ToPPos().ToFloat2(), "terrain" ); sourceTile.DrawAt(t.ToPPos().ToFloat2(), pal);
// Unit previews // Unit previews
foreach (var unit in power.UnitsInRange(sourceLocation)) foreach (var unit in power.UnitsInRange(sourceLocation))
@@ -257,7 +259,7 @@ namespace OpenRA.Mods.RA
var canEnter = ((manager.self.Owner.Shroud.IsExplored(targetCell) || manager.self.Owner.HasFogVisibility()) && var canEnter = ((manager.self.Owner.Shroud.IsExplored(targetCell) || manager.self.Owner.HasFogVisibility()) &&
unit.Trait<Chronoshiftable>().CanChronoshiftTo(unit,targetCell)); unit.Trait<Chronoshiftable>().CanChronoshiftTo(unit,targetCell));
var tile = canEnter ? validTile : invalidTile; var tile = canEnter ? validTile : invalidTile;
tile.DrawAt(wr, targetCell.ToPPos().ToFloat2(), "terrain"); tile.DrawAt(targetCell.ToPPos().ToFloat2(), pal);
} }
} }
} }

View File

@@ -98,8 +98,9 @@ namespace OpenRA.Mods.RA
public void RenderBeforeWorld(WorldRenderer wr, World world) public void RenderBeforeWorld(WorldRenderer wr, World world)
{ {
var xy = Game.viewport.ViewToWorld(Viewport.LastMousePos); var xy = Game.viewport.ViewToWorld(Viewport.LastMousePos);
var pal = wr.Palette("terrain");
foreach (var t in world.FindTilesInCircle(xy, range)) foreach (var t in world.FindTilesInCircle(xy, range))
tile.DrawAt( wr, t.ToPPos().ToFloat2(), "terrain" ); tile.DrawAt(t.ToPPos().ToFloat2(), pal);
} }
public string GetCursor(World world, CPos xy, MouseInput mi) public string GetCursor(World world, CPos xy, MouseInput mi)

View File

@@ -78,6 +78,8 @@ namespace OpenRA.Mods.RA
public void Render( WorldRenderer wr ) public void Render( WorldRenderer wr )
{ {
var cliprect = Game.viewport.WorldBounds(world); var cliprect = Game.viewport.WorldBounds(world);
var pal = wr.Palette("terrain");
foreach (var kv in tiles) foreach (var kv in tiles)
{ {
if (!cliprect.Contains(kv.Key.X,kv.Key.Y)) if (!cliprect.Contains(kv.Key.X,kv.Key.Y))
@@ -86,7 +88,7 @@ namespace OpenRA.Mods.RA
if (world.ShroudObscures(kv.Key)) if (world.ShroudObscures(kv.Key))
continue; continue;
smudgeSprites[kv.Value.type- 1][kv.Value.index].DrawAt(wr, kv.Key.ToPPos().ToFloat2(), "terrain"); smudgeSprites[kv.Value.type- 1][kv.Value.index].DrawAt(kv.Key.ToPPos().ToFloat2(), pal);
} }
} }
} }